summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apct-tests/perftests/core/Android.bp34
-rw-r--r--apct-tests/perftests/core/Android.mk33
-rw-r--r--apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt250
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java17
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java14
-rw-r--r--api/current.txt8
-rwxr-xr-xapi/system-current.txt94
-rw-r--r--api/test-current.txt56
-rw-r--r--cmds/incident_helper/src/ih_util.cpp2
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java48
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl2
-rw-r--r--core/java/android/app/ActivityManager.java2
-rw-r--r--core/java/android/app/ActivityThread.java12
-rw-r--r--core/java/android/app/ApplicationPackageManager.java7
-rw-r--r--core/java/android/app/ResourcesManager.java17
-rw-r--r--core/java/android/bluetooth/BluetoothDevice.java30
-rw-r--r--core/java/android/content/Intent.java34
-rw-r--r--core/java/android/content/pm/PackageManager.java3
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageImpl.java379
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedActivity.java16
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedComponent.java10
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedInstrumentation.java11
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedMainComponent.java7
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedPermission.java7
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedProvider.java15
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedService.java7
-rw-r--r--core/java/android/inputmethodservice/InlineSuggestionSession.java61
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java39
-rw-r--r--core/java/android/net/ConnectivityManager.java8
-rw-r--r--core/java/android/net/IConnectivityManager.aidl3
-rw-r--r--core/java/android/net/NetworkAgent.java50
-rw-r--r--core/java/android/net/NetworkScore.aidl19
-rw-r--r--core/java/android/net/NetworkScore.java468
-rw-r--r--core/java/android/os/incremental/V4Signature.java13
-rw-r--r--core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl4
-rw-r--r--core/java/android/service/autofill/InlineSuggestionRenderService.java5
-rw-r--r--core/java/android/telephony/CellBroadcastIntents.java6
-rw-r--r--core/java/android/util/FeatureFlagUtils.java2
-rw-r--r--core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java29
-rw-r--r--core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java29
-rw-r--r--core/java/android/util/apk/ApkSigningBlockUtils.java18
-rw-r--r--core/java/android/view/DisplayInfo.java47
-rw-r--r--core/java/android/view/InsetsAnimationControlImpl.java19
-rw-r--r--core/java/android/view/InsetsController.java47
-rw-r--r--core/java/android/view/InsetsSourceConsumer.java3
-rw-r--r--core/java/android/view/InsetsState.java22
-rw-r--r--core/java/android/view/PendingInsetsController.java181
-rw-r--r--core/java/android/view/SurfaceControl.java7
-rw-r--r--core/java/android/view/View.java8
-rw-r--r--core/java/android/view/ViewRootImpl.java15
-rw-r--r--core/java/android/view/WindowInsets.java16
-rw-r--r--core/java/android/view/WindowInsetsAnimation.java5
-rw-r--r--core/java/android/view/inline/InlineContentView.java30
-rw-r--r--core/java/android/view/inputmethod/EditorInfo.java7
-rw-r--r--core/java/android/view/inputmethod/InlineSuggestion.java6
-rw-r--r--core/java/com/android/internal/content/om/OverlayConfig.java50
-rw-r--r--core/java/com/android/internal/logging/InstanceId.java11
-rw-r--r--core/java/com/android/internal/policy/DecorView.java20
-rw-r--r--core/java/com/android/internal/util/Parcelling.java27
-rw-r--r--core/java/com/android/internal/view/IInlineSuggestionsRequestCallback.aidl6
-rw-r--r--core/java/com/android/internal/view/RootViewSurfaceTaker.java4
-rw-r--r--core/java/com/android/internal/view/inline/IInlineContentCallback.aidl4
-rw-r--r--core/proto/android/stats/style/style_enums.proto2
-rw-r--r--core/res/AndroidManifest.xml1
-rw-r--r--core/tests/coretests/src/android/view/InsetsStateTest.java24
-rw-r--r--core/tests/coretests/src/android/view/PendingInsetsControllerTest.java193
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java4
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--data/fonts/fonts.xml62
-rw-r--r--data/keyboards/Vendor_057e_Product_2009.kl32
-rw-r--r--location/java/android/location/LocationManager.java24
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml139
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml24
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml16
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml126
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml11
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml122
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml129
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml7
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml25
-rw-r--r--packages/SystemUI/res/drawable-nodpi/star_filled.xml27
-rw-r--r--packages/SystemUI/res/drawable-nodpi/star_outline.xml27
-rw-r--r--packages/SystemUI/res/drawable/controls_list_divider.xml23
-rw-r--r--packages/SystemUI/res/drawable/ic_more_vert.xml24
-rw-r--r--packages/SystemUI/res/layout/controls_base_item.xml20
-rw-r--r--packages/SystemUI/res/layout/controls_spinner_item.xml50
-rw-r--r--packages/SystemUI/res/layout/controls_with_favorites.xml57
-rw-r--r--packages/SystemUI/res/layout/controls_zone_header.xml (renamed from packages/SystemUI/res-keyguard/layout/controls_zone_header.xml)3
-rw-r--r--packages/SystemUI/res/values/dimens.xml1
-rw-r--r--packages/SystemUI/res/values/styles.xml9
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java64
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlInfo.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingController.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt157
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt55
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt377
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapper.kt71
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt48
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/StructureInfo.kt34
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt20
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingController.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlWithState.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt290
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java91
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerImpl.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/Notifications.proto46
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsBindingControllerImplTest.kt96
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt354
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapperTest.kt25
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/SbnBuilder.java17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java3
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java61
-rw-r--r--services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java4
-rw-r--r--services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java157
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java4
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java22
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java20
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java1
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkAgentInfo.java2
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java17
-rw-r--r--services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java41
-rw-r--r--services/core/java/com/android/server/notification/NotificationChannelLogger.java213
-rw-r--r--services/core/java/com/android/server/notification/NotificationChannelLoggerImpl.java54
-rw-r--r--services/core/java/com/android/server/notification/NotificationHistoryDatabase.java31
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java3
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecordLogger.java36
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java59
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerServiceImpl.java11
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerSettings.java56
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java8
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java146
-rw-r--r--services/core/java/com/android/server/pm/Settings.java2
-rw-r--r--services/core/java/com/android/server/pm/TEST_MAPPING5
-rw-r--r--services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java40
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java7
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java4
-rw-r--r--services/core/java/com/android/server/wm/WallpaperWindowToken.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java47
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java92
-rw-r--r--services/people/java/com/android/server/people/data/AggregateEventHistoryImpl.java8
-rw-r--r--services/people/java/com/android/server/people/data/ConversationStore.java5
-rw-r--r--services/people/java/com/android/server/people/data/EventHistoryImpl.java8
-rw-r--r--services/people/java/com/android/server/people/data/EventIndex.java5
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java95
-rw-r--r--services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java22
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelLoggerFake.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerFake.java)32
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java22
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java26
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java109
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java177
-rwxr-xr-xstartop/scripts/iorap/analyze_prefetch_file.py168
-rwxr-xr-xtelecomm/java/android/telecom/Call.java11
-rw-r--r--telephony/common/com/android/internal/telephony/CarrierAppUtils.java64
-rwxr-xr-xtelephony/java/android/telephony/CarrierConfigManager.java18
-rw-r--r--telephony/java/android/telephony/ServiceState.java8
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java38
-rw-r--r--tests/AppResourcesLoaders/Android.bp22
-rw-r--r--tests/AppResourcesLoaders/AndroidManifest.xml31
-rw-r--r--tests/AppResourcesLoaders/Overlay/Android.bp19
-rw-r--r--tests/AppResourcesLoaders/Overlay/AndroidManifest.xml21
-rw-r--r--tests/AppResourcesLoaders/Overlay/res/values/values.xml20
-rw-r--r--tests/AppResourcesLoaders/res/layout/activity_isolated.xml25
-rw-r--r--tests/AppResourcesLoaders/res/layout/activity_main.xml29
-rw-r--r--tests/AppResourcesLoaders/res/values/styles.xml23
-rw-r--r--tests/AppResourcesLoaders/res/values/values.xml20
-rw-r--r--tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivity.java44
-rw-r--r--tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivityIsolated.java40
-rw-r--r--tests/AppResourcesLoaders/src/com/android/example/loaders/LoadersApplication.java58
-rw-r--r--tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java41
-rw-r--r--tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java59
-rw-r--r--tests/net/common/java/android/net/NetworkScoreTest.kt90
-rw-r--r--tests/net/integration/util/com/android/server/NetworkAgentWrapper.java7
-rw-r--r--tests/net/java/com/android/server/connectivity/LingerMonitorTest.java3
-rw-r--r--tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java3
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java13
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java3
-rw-r--r--wifi/tests/src/android/net/wifi/WifiConfigurationTest.java61
266 files changed, 5483 insertions, 3233 deletions
diff --git a/apct-tests/perftests/core/Android.bp b/apct-tests/perftests/core/Android.bp
new file mode 100644
index 000000000000..984893a25605
--- /dev/null
+++ b/apct-tests/perftests/core/Android.bp
@@ -0,0 +1,34 @@
+android_test {
+ name: "CorePerfTests",
+
+ resource_dirs: ["res"],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ "src/android/os/ISomeService.aidl",
+ ],
+
+ static_libs: [
+ "androidx.appcompat_appcompat",
+ "androidx.test.rules",
+ "androidx.annotation_annotation",
+ "apct-perftests-overlay-apps",
+ "apct-perftests-resources-manager-apps",
+ "apct-perftests-utils",
+ "guava",
+ ],
+
+ libs: ["android.test.base"],
+
+ platform_apis: true,
+
+ jni_libs: ["libperftestscore_jni"],
+
+ // Use google-fonts/dancing-script for the performance metrics
+ // ANDROIDMK TRANSLATION ERROR: Only $(LOCAL_PATH)/.. values are allowed
+ // LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
+
+ test_suites: ["device-tests"],
+ certificate: "platform",
+
+}
diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk
deleted file mode 100644
index 968478c3f338..000000000000
--- a/apct-tests/perftests/core/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, src) \
- src/android/os/ISomeService.aidl
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- androidx.appcompat_appcompat \
- androidx.test.rules \
- androidx.annotation_annotation \
- apct-perftests-overlay-apps \
- apct-perftests-resources-manager-apps \
- apct-perftests-utils \
- guava
-
-LOCAL_JAVA_LIBRARIES := android.test.base
-
-LOCAL_PACKAGE_NAME := CorePerfTests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_JNI_SHARED_LIBRARIES := libperftestscore_jni
-
-# Use google-fonts/dancing-script for the performance metrics
-LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
-
-LOCAL_COMPATIBILITY_SUITE += device-tests
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE) \ No newline at end of file
diff --git a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
new file mode 100644
index 000000000000..9e463652d0b6
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os
+
+import android.content.pm.PackageParser
+import android.content.pm.PackageParserCacheHelper.ReadHelper
+import android.content.pm.PackageParserCacheHelper.WriteHelper
+import android.content.pm.parsing.ParsingPackageImpl
+import android.content.pm.parsing.ParsingPackageRead
+import android.content.pm.parsing.ParsingPackageUtils
+import android.content.pm.parsing.result.ParseTypeImpl
+import android.content.res.TypedArray
+import android.perftests.utils.BenchmarkState
+import android.perftests.utils.PerfStatusReporter
+import androidx.test.filters.LargeTest
+import com.android.internal.util.ConcurrentUtils
+import libcore.io.IoUtils
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.io.File
+import java.io.FileOutputStream
+import java.util.concurrent.ArrayBlockingQueue
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@RunWith(Parameterized::class)
+class PackageParsingPerfTest {
+
+ companion object {
+ private const val PARALLEL_QUEUE_CAPACITY = 10
+ private const val PARALLEL_MAX_THREADS = 4
+
+ private const val QUEUE_POLL_TIMEOUT_SECONDS = 5L
+
+ // TODO: Replace this with core version of SYSTEM_PARTITIONS
+ val FOLDERS_TO_TEST = listOf(
+ Environment.getRootDirectory(),
+ Environment.getVendorDirectory(),
+ Environment.getOdmDirectory(),
+ Environment.getOemDirectory(),
+ Environment.getOemDirectory(),
+ Environment.getSystemExtDirectory()
+ )
+
+ @JvmStatic
+ @Parameterized.Parameters(name = "{0}")
+ fun parameters(): Array<Params> {
+ val apks = FOLDERS_TO_TEST
+ .filter(File::exists)
+ .map(File::walkTopDown)
+ .flatMap(Sequence<File>::asIterable)
+ .filter { it.name.endsWith(".apk") }
+
+ return arrayOf(
+ Params(1, apks) { ParallelParser1(it?.let(::PackageCacher1)) },
+ Params(2, apks) { ParallelParser2(it?.let(::PackageCacher2)) }
+ )
+ }
+
+ data class Params(
+ val version: Int,
+ val apks: List<File>,
+ val cacheDirToParser: (File?) -> ParallelParser<*>
+ ) {
+ // For test name formatting
+ override fun toString() = "v$version"
+ }
+ }
+
+ @get:Rule
+ var perfStatusReporter = PerfStatusReporter()
+
+ @get:Rule
+ var testFolder = TemporaryFolder()
+
+ @Parameterized.Parameter(0)
+ lateinit var params: Params
+
+ private val state: BenchmarkState get() = perfStatusReporter.benchmarkState
+ private val apks: List<File> get() = params.apks
+
+ @Test
+ fun sequentialNoCache() {
+ params.cacheDirToParser(null).use { parser ->
+ while (state.keepRunning()) {
+ apks.forEach { parser.parse(it) }
+ }
+ }
+ }
+
+ @Test
+ fun sequentialCached() {
+ params.cacheDirToParser(testFolder.newFolder()).use { parser ->
+ // Fill the cache
+ apks.forEach { parser.parse(it) }
+
+ while (state.keepRunning()) {
+ apks.forEach { parser.parse(it) }
+ }
+ }
+ }
+
+ @Test
+ fun parallelNoCache() {
+ params.cacheDirToParser(null).use { parser ->
+ while (state.keepRunning()) {
+ apks.forEach { parser.submit(it) }
+ repeat(apks.size) { parser.take() }
+ }
+ }
+ }
+
+ @Test
+ fun parallelCached() {
+ params.cacheDirToParser(testFolder.newFolder()).use { parser ->
+ // Fill the cache
+ apks.forEach { parser.parse(it) }
+
+ while (state.keepRunning()) {
+ apks.forEach { parser.submit(it) }
+ repeat(apks.size) { parser.take() }
+ }
+ }
+ }
+
+ abstract class ParallelParser<PackageType : Parcelable>(
+ private val cacher: PackageCacher<PackageType>? = null
+ ) : AutoCloseable {
+ private val queue = ArrayBlockingQueue<Any>(PARALLEL_QUEUE_CAPACITY)
+ private val service = ConcurrentUtils.newFixedThreadPool(
+ PARALLEL_MAX_THREADS, "package-parsing-test",
+ Process.THREAD_PRIORITY_FOREGROUND)
+
+ fun submit(file: File) = service.submit { queue.put(parse(file)) }
+
+ fun take() = queue.poll(QUEUE_POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS)
+
+ override fun close() {
+ service.shutdownNow()
+ }
+
+ fun parse(file: File) = cacher?.getCachedResult(file)
+ ?: parseImpl(file).also { cacher?.cacheResult(file, it) }
+
+ protected abstract fun parseImpl(file: File): PackageType
+ }
+
+ class ParallelParser1(private val cacher: PackageCacher1? = null)
+ : ParallelParser<PackageParser.Package>(cacher) {
+ val parser = PackageParser().apply {
+ setCallback { true }
+ }
+
+ override fun parseImpl(file: File) = parser.parsePackage(file, 0, cacher != null)
+ }
+
+ class ParallelParser2(cacher: PackageCacher2? = null)
+ : ParallelParser<ParsingPackageRead>(cacher) {
+ val input = ThreadLocal.withInitial { ParseTypeImpl() }
+ val parser = ParsingPackageUtils(false, null, null,
+ object : ParsingPackageUtils.Callback {
+ override fun hasFeature(feature: String) = true
+
+ override fun startParsingPackage(
+ packageName: String,
+ baseCodePath: String,
+ codePath: String,
+ manifestArray: TypedArray,
+ isCoreApp: Boolean
+ ) = ParsingPackageImpl(packageName, baseCodePath, codePath, manifestArray)
+ })
+
+ override fun parseImpl(file: File) =
+ parser.parsePackage(input.get()!!.reset(), file, 0).result
+ }
+
+ abstract class PackageCacher<PackageType : Parcelable>(private val cacheDir: File) {
+
+ fun getCachedResult(file: File): PackageType? {
+ val cacheFile = File(cacheDir, file.name)
+ if (!cacheFile.exists()) {
+ return null
+ }
+
+ val bytes = IoUtils.readFileAsByteArray(cacheFile.absolutePath)
+ val parcel = Parcel.obtain().apply {
+ unmarshall(bytes, 0, bytes.size)
+ setDataPosition(0)
+ }
+ ReadHelper(parcel).apply { startAndInstall() }
+ return fromParcel(parcel).also {
+ parcel.recycle()
+ }
+ }
+
+ fun cacheResult(file: File, parsed: Parcelable) {
+ val cacheFile = File(cacheDir, file.name)
+ if (cacheFile.exists()) {
+ if (!cacheFile.delete()) {
+ throw IllegalStateException("Unable to delete cache file: $cacheFile")
+ }
+ }
+ val cacheEntry = toCacheEntry(parsed)
+ return FileOutputStream(cacheFile).use { fos -> fos.write(cacheEntry) }
+ }
+
+ private fun toCacheEntry(pkg: Parcelable): ByteArray {
+ val parcel = Parcel.obtain()
+ val helper = WriteHelper(parcel)
+ pkg.writeToParcel(parcel, 0 /* flags */)
+ helper.finishAndUninstall()
+ return parcel.marshall().also {
+ parcel.recycle()
+ }
+ }
+
+ protected abstract fun fromParcel(parcel: Parcel): PackageType
+ }
+
+ /**
+ * Re-implementation of v1's cache, since that's gone in R+.
+ */
+ class PackageCacher1(cacheDir: File) : PackageCacher<PackageParser.Package>(cacheDir) {
+ override fun fromParcel(parcel: Parcel) = PackageParser.Package(parcel)
+ }
+
+ /**
+ * Re-implementation of the server side PackageCacher, as it's inaccessible here.
+ */
+ class PackageCacher2(cacheDir: File) : PackageCacher<ParsingPackageRead>(cacheDir) {
+ override fun fromParcel(parcel: Parcel) = ParsingPackageImpl(parcel)
+ }
+}
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
index 91df1df0c5b5..05c661127eab 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
@@ -74,6 +74,7 @@ import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.BackgroundThread;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
@@ -140,6 +141,7 @@ public class BlobStoreManagerService extends SystemService {
private final Context mContext;
private final Handler mHandler;
+ private final Handler mBackgroundHandler;
private final Injector mInjector;
private final SessionStateChangeListener mSessionStateChangeListener =
new SessionStateChangeListener();
@@ -160,11 +162,12 @@ public class BlobStoreManagerService extends SystemService {
mContext = context;
mInjector = injector;
mHandler = mInjector.initializeMessageHandler();
+ mBackgroundHandler = mInjector.getBackgroundHandler();
}
private static Handler initializeMessageHandler() {
final HandlerThread handlerThread = new ServiceThread(TAG,
- Process.THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
+ Process.THREAD_PRIORITY_DEFAULT, true /* allowIo */);
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper());
Watchdog.getInstance().addThread(handler);
@@ -418,7 +421,7 @@ public class BlobStoreManagerService extends SystemService {
public void onStateChanged(@NonNull BlobStoreSession session) {
mHandler.post(PooledLambda.obtainRunnable(
BlobStoreManagerService::onStateChangedInternal,
- BlobStoreManagerService.this, session));
+ BlobStoreManagerService.this, session).recycleOnUse());
}
}
@@ -437,7 +440,11 @@ public class BlobStoreManagerService extends SystemService {
}
break;
case STATE_COMMITTED:
- session.verifyBlobData();
+ mBackgroundHandler.post(() -> {
+ session.computeDigest();
+ mHandler.post(PooledLambda.obtainRunnable(
+ BlobStoreSession::verifyBlobData, session).recycleOnUse());
+ });
break;
case STATE_VERIFIED_VALID:
synchronized (mBlobsLock) {
@@ -1412,5 +1419,9 @@ public class BlobStoreManagerService extends SystemService {
public Handler initializeMessageHandler() {
return BlobStoreManagerService.initializeMessageHandler();
}
+
+ public Handler getBackgroundHandler() {
+ return BackgroundThread.getHandler();
+ }
}
} \ No newline at end of file
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java
index d33a09f4351b..cc4044ed46b9 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java
@@ -96,6 +96,10 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
@GuardedBy("mRevocableFds")
private ArrayList<RevocableFileDescriptor> mRevocableFds = new ArrayList<>();
+ // This will be accessed from only one thread at any point of time, so no need to grab
+ // a lock for this.
+ private byte[] mDataDigest;
+
@GuardedBy("mSessionLock")
private int mState = STATE_CLOSED;
@@ -381,19 +385,21 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
}
}
- void verifyBlobData() {
- byte[] actualDigest = null;
+ void computeDigest() {
try {
Trace.traceBegin(TRACE_TAG_SYSTEM_SERVER,
"computeBlobDigest-i" + mSessionId + "-l" + getSessionFile().length());
- actualDigest = FileUtils.digest(getSessionFile(), mBlobHandle.algorithm);
+ mDataDigest = FileUtils.digest(getSessionFile(), mBlobHandle.algorithm);
} catch (IOException | NoSuchAlgorithmException e) {
Slog.e(TAG, "Error computing the digest", e);
} finally {
Trace.traceEnd(TRACE_TAG_SYSTEM_SERVER);
}
+ }
+
+ void verifyBlobData() {
synchronized (mSessionLock) {
- if (actualDigest != null && Arrays.equals(actualDigest, mBlobHandle.digest)) {
+ if (mDataDigest != null && Arrays.equals(mDataDigest, mBlobHandle.digest)) {
mState = STATE_VERIFIED_VALID;
// Commit callback will be sent once the data is persisted.
} else {
diff --git a/api/current.txt b/api/current.txt
index e2d054800d4a..265bed1ccd8e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -12079,7 +12079,6 @@ package android.content.pm {
field public static final String FEATURE_COMPANION_DEVICE_SETUP = "android.software.companion_device_setup";
field public static final String FEATURE_CONNECTION_SERVICE = "android.software.connectionservice";
field public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
- field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub";
field public static final String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
field public static final String FEATURE_EMBEDDED = "android.hardware.type.embedded";
field public static final String FEATURE_ETHERNET = "android.hardware.ethernet";
@@ -46859,7 +46858,7 @@ package android.telephony {
public static final class CarrierConfigManager.Ims {
field public static final String KEY_PREFIX = "ims.";
- field public static final String KEY_WIFI_OFF_DEFERRING_TIME_INT = "ims.wifi_off_deferring_time_int";
+ field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int";
}
public abstract class CellIdentity implements android.os.Parcelable {
@@ -47778,7 +47777,9 @@ package android.telephony {
method public boolean getIsManualSelection();
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoList();
method public String getOperatorAlphaLong();
+ method @Nullable public String getOperatorAlphaLongRaw();
method public String getOperatorAlphaShort();
+ method @Nullable public String getOperatorAlphaShortRaw();
method public String getOperatorNumeric();
method public boolean getRoaming();
method public int getState();
@@ -48284,6 +48285,7 @@ package android.telephony {
field public static final int DATA_DISCONNECTING = 4; // 0x4
field public static final int DATA_SUSPENDED = 3; // 0x3
field public static final int DATA_UNKNOWN = -1; // 0xffffffff
+ field public static final String EXTRA_ACTIVE_SIM_SUPPORTED_COUNT = "android.telephony.extra.ACTIVE_SIM_SUPPORTED_COUNT";
field public static final String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
field public static final String EXTRA_CARRIER_ID = "android.telephony.extra.CARRIER_ID";
field public static final String EXTRA_CARRIER_NAME = "android.telephony.extra.CARRIER_NAME";
@@ -48293,7 +48295,6 @@ package android.telephony {
field public static final String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
field public static final String EXTRA_NETWORK_COUNTRY = "android.telephony.extra.NETWORK_COUNTRY";
field public static final String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
- field public static final String EXTRA_NUM_OF_ACTIVE_SIM_SUPPORTED = "android.telephony.extra.NUM_OF_ACTIVE_SIM_SUPPORTED";
field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
field public static final String EXTRA_SPECIFIC_CARRIER_ID = "android.telephony.extra.SPECIFIC_CARRIER_ID";
field public static final String EXTRA_SPECIFIC_CARRIER_NAME = "android.telephony.extra.SPECIFIC_CARRIER_NAME";
@@ -55486,6 +55487,7 @@ package android.view {
method public boolean hasInsets();
method @Deprecated public boolean hasStableInsets();
method @Deprecated public boolean hasSystemWindowInsets();
+ method @NonNull public android.view.WindowInsets inset(@NonNull android.graphics.Insets);
method @NonNull public android.view.WindowInsets inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
method public boolean isConsumed();
method public boolean isRound();
diff --git a/api/system-current.txt b/api/system-current.txt
index 37376e59b207..fe18da62c28a 100755
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1569,23 +1569,23 @@ package android.bluetooth {
}
public final class BluetoothDevice implements android.os.Parcelable {
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean cancelBondProcess();
- method public boolean cancelPairing();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getBatteryLevel();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getMessageAccessPermission();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelBondProcess();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelPairing();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getBatteryLevel();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getMessageAccessPermission();
method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getPhonebookAccessPermission();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isBondingInitiatedLocally();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getPhonebookAccessPermission();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getSimAccessPermission();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isBondingInitiatedLocally();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEncrypted();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isInSilenceMode();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean removeBond();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeBond();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setAlias(@NonNull String);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMessageAccessPermission(int);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMetadata(int, @NonNull byte[]);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPhonebookAccessPermission(int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPin(@Nullable String);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPin(@NonNull String);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSilenceMode(boolean);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSimAccessPermission(int);
field public static final int ACCESS_ALLOWED = 1; // 0x1
@@ -1895,30 +1895,13 @@ package android.content {
field public static final String EXTRA_PERMISSION_GROUP_NAME = "android.intent.extra.PERMISSION_GROUP_NAME";
field public static final String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
field public static final String EXTRA_REASON = "android.intent.extra.REASON";
- field @Deprecated public static final String EXTRA_REBROADCAST_ON_UNLOCK = "rebroadcastOnUnlock";
field public static final String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK";
field public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
- field @Deprecated public static final String EXTRA_SIM_LOCKED_REASON = "reason";
- field @Deprecated public static final String EXTRA_SIM_STATE = "ss";
field public static final String EXTRA_UNKNOWN_INSTANT_APP = "android.intent.extra.UNKNOWN_INSTANT_APP";
field public static final String EXTRA_VERIFICATION_BUNDLE = "android.intent.extra.VERIFICATION_BUNDLE";
field public static final int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT = 67108864; // 0x4000000
field public static final String METADATA_SETUP_VERSION = "android.SETUP_VERSION";
- field @Deprecated public static final String SIM_ABSENT_ON_PERM_DISABLED = "PERM_DISABLED";
- field @Deprecated public static final String SIM_LOCKED_NETWORK = "NETWORK";
- field @Deprecated public static final String SIM_LOCKED_ON_PIN = "PIN";
- field @Deprecated public static final String SIM_LOCKED_ON_PUK = "PUK";
- field @Deprecated public static final String SIM_STATE_ABSENT = "ABSENT";
- field @Deprecated public static final String SIM_STATE_CARD_IO_ERROR = "CARD_IO_ERROR";
- field @Deprecated public static final String SIM_STATE_CARD_RESTRICTED = "CARD_RESTRICTED";
- field @Deprecated public static final String SIM_STATE_IMSI = "IMSI";
- field @Deprecated public static final String SIM_STATE_LOADED = "LOADED";
- field @Deprecated public static final String SIM_STATE_LOCKED = "LOCKED";
- field @Deprecated public static final String SIM_STATE_NOT_READY = "NOT_READY";
- field @Deprecated public static final String SIM_STATE_PRESENT = "PRESENT";
- field @Deprecated public static final String SIM_STATE_READY = "READY";
- field @Deprecated public static final String SIM_STATE_UNKNOWN = "UNKNOWN";
}
public class IntentFilter implements android.os.Parcelable {
@@ -2235,6 +2218,7 @@ package android.content.pm {
field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
+ field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub";
field public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery";
field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow";
field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
@@ -6298,7 +6282,7 @@ package android.net {
}
public abstract class NetworkAgent {
- ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkScore, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
+ ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, int, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
method @Nullable public android.net.Network getNetwork();
method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData);
method public void onAutomaticReconnectDisabled();
@@ -6313,7 +6297,7 @@ package android.net {
method @NonNull public android.net.Network register();
method public void sendLinkProperties(@NonNull android.net.LinkProperties);
method public void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities);
- method public void sendNetworkScore(@NonNull android.net.NetworkScore);
+ method public void sendNetworkScore(int);
method public void sendSocketKeepaliveEvent(int, int);
method public void setConnected();
method @Deprecated public void setLegacyExtraInfo(@Nullable String);
@@ -6420,55 +6404,6 @@ package android.net {
method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkRequest.Builder setSignalStrength(int);
}
- public final class NetworkScore implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public android.net.NetworkScore.Metrics getEndToEndMetrics();
- method @NonNull public android.net.NetworkScore.Metrics getLinkLayerMetrics();
- method public int getRange();
- method @IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH, to=android.net.NetworkScore.MAX_SIGNAL_STRENGTH) public int getSignalStrength();
- method public boolean hasPolicy(int);
- method public boolean isExiting();
- method @NonNull public android.net.NetworkScore withExiting(boolean);
- method @NonNull public android.net.NetworkScore withSignalStrength(@IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH) int);
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkScore> CREATOR;
- field public static final int MAX_SIGNAL_STRENGTH = 1000; // 0x3e8
- field public static final int MIN_SIGNAL_STRENGTH = 0; // 0x0
- field public static final int POLICY_DEFAULT_SUBSCRIPTION = 8; // 0x8
- field public static final int POLICY_IGNORE_ON_WIFI = 4; // 0x4
- field public static final int POLICY_LOCKDOWN_VPN = 1; // 0x1
- field public static final int POLICY_VPN = 2; // 0x2
- field public static final int RANGE_CLOSE = 1; // 0x1
- field public static final int RANGE_LONG = 4; // 0x4
- field public static final int RANGE_MEDIUM = 3; // 0x3
- field public static final int RANGE_SHORT = 2; // 0x2
- field public static final int RANGE_UNKNOWN = 0; // 0x0
- field public static final int UNKNOWN_SIGNAL_STRENGTH = -1; // 0xffffffff
- }
-
- public static class NetworkScore.Builder {
- ctor public NetworkScore.Builder();
- method @NonNull public android.net.NetworkScore.Builder addPolicy(int);
- method @NonNull public android.net.NetworkScore build();
- method @NonNull public android.net.NetworkScore.Builder clearPolicy(int);
- method @NonNull public android.net.NetworkScore.Builder setEndToEndMetrics(@NonNull android.net.NetworkScore.Metrics);
- method @NonNull public android.net.NetworkScore.Builder setExiting(boolean);
- method @NonNull public android.net.NetworkScore.Builder setLegacyScore(int);
- method @NonNull public android.net.NetworkScore.Builder setLinkLayerMetrics(@NonNull android.net.NetworkScore.Metrics);
- method @NonNull public android.net.NetworkScore.Builder setRange(int);
- method @NonNull public android.net.NetworkScore.Builder setSignalStrength(@IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH, to=android.net.NetworkScore.MAX_SIGNAL_STRENGTH) int);
- }
-
- public static class NetworkScore.Metrics {
- ctor public NetworkScore.Metrics(@IntRange(from=android.net.NetworkScore.Metrics.LATENCY_UNKNOWN) int, @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) int, @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) int);
- field public static final int BANDWIDTH_UNKNOWN = -1; // 0xffffffff
- field @NonNull public static final android.net.NetworkScore.Metrics EMPTY;
- field public static final int LATENCY_UNKNOWN = -1; // 0xffffffff
- field @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) public final int downlinkBandwidthKBps;
- field @IntRange(from=android.net.NetworkScore.Metrics.LATENCY_UNKNOWN) public final int latencyMs;
- field @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) public final int uplinkBandwidthKBps;
- }
-
public class NetworkScoreManager {
method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public boolean clearScores() throws java.lang.SecurityException;
method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public void disableScoring() throws java.lang.SecurityException;
@@ -11437,8 +11372,6 @@ package android.telephony {
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForDomain(int);
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForTransportType(int);
method public int getNrFrequencyRange();
- method @Nullable public String getOperatorAlphaLongRaw();
- method @Nullable public String getOperatorAlphaShortRaw();
method @NonNull public static android.telephony.ServiceState newFromBundle(@NonNull android.os.Bundle);
field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3
@@ -11791,7 +11724,8 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>);
method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void shutdownAllRadios();
diff --git a/api/test-current.txt b/api/test-current.txt
index f25f10807753..ea262278f3f4 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -48,6 +48,10 @@ package android.accessibilityservice {
ctor public AccessibilityGestureEvent(int, int);
}
+ public abstract class AccessibilityService extends android.app.Service {
+ field public static final int ACCESSIBILITY_TAKE_SCREENSHOT_REQUEST_INTERVAL_TIMES_MS = 1000; // 0x3e8
+ }
+
}
package android.animation {
@@ -1799,55 +1803,6 @@ package android.net {
field public static final int TRANSPORT_TEST = 7; // 0x7
}
- public final class NetworkScore implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public android.net.NetworkScore.Metrics getEndToEndMetrics();
- method @NonNull public android.net.NetworkScore.Metrics getLinkLayerMetrics();
- method public int getRange();
- method @IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH, to=android.net.NetworkScore.MAX_SIGNAL_STRENGTH) public int getSignalStrength();
- method public boolean hasPolicy(int);
- method public boolean isExiting();
- method @NonNull public android.net.NetworkScore withExiting(boolean);
- method @NonNull public android.net.NetworkScore withSignalStrength(@IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH) int);
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkScore> CREATOR;
- field public static final int MAX_SIGNAL_STRENGTH = 1000; // 0x3e8
- field public static final int MIN_SIGNAL_STRENGTH = 0; // 0x0
- field public static final int POLICY_DEFAULT_SUBSCRIPTION = 8; // 0x8
- field public static final int POLICY_IGNORE_ON_WIFI = 4; // 0x4
- field public static final int POLICY_LOCKDOWN_VPN = 1; // 0x1
- field public static final int POLICY_VPN = 2; // 0x2
- field public static final int RANGE_CLOSE = 1; // 0x1
- field public static final int RANGE_LONG = 4; // 0x4
- field public static final int RANGE_MEDIUM = 3; // 0x3
- field public static final int RANGE_SHORT = 2; // 0x2
- field public static final int RANGE_UNKNOWN = 0; // 0x0
- field public static final int UNKNOWN_SIGNAL_STRENGTH = -1; // 0xffffffff
- }
-
- public static class NetworkScore.Builder {
- ctor public NetworkScore.Builder();
- method @NonNull public android.net.NetworkScore.Builder addPolicy(int);
- method @NonNull public android.net.NetworkScore build();
- method @NonNull public android.net.NetworkScore.Builder clearPolicy(int);
- method @NonNull public android.net.NetworkScore.Builder setEndToEndMetrics(@NonNull android.net.NetworkScore.Metrics);
- method @NonNull public android.net.NetworkScore.Builder setExiting(boolean);
- method @NonNull public android.net.NetworkScore.Builder setLegacyScore(int);
- method @NonNull public android.net.NetworkScore.Builder setLinkLayerMetrics(@NonNull android.net.NetworkScore.Metrics);
- method @NonNull public android.net.NetworkScore.Builder setRange(int);
- method @NonNull public android.net.NetworkScore.Builder setSignalStrength(@IntRange(from=android.net.NetworkScore.UNKNOWN_SIGNAL_STRENGTH, to=android.net.NetworkScore.MAX_SIGNAL_STRENGTH) int);
- }
-
- public static class NetworkScore.Metrics {
- ctor public NetworkScore.Metrics(@IntRange(from=android.net.NetworkScore.Metrics.LATENCY_UNKNOWN) int, @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) int, @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) int);
- field public static final int BANDWIDTH_UNKNOWN = -1; // 0xffffffff
- field @NonNull public static final android.net.NetworkScore.Metrics EMPTY;
- field public static final int LATENCY_UNKNOWN = -1; // 0xffffffff
- field @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) public final int downlinkBandwidthKBps;
- field @IntRange(from=android.net.NetworkScore.Metrics.LATENCY_UNKNOWN) public final int latencyMs;
- field @IntRange(from=android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN) public final int uplinkBandwidthKBps;
- }
-
public class NetworkStack {
field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK";
}
@@ -3775,7 +3730,8 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile();
method @Deprecated public void setCarrierTestOverride(String, String, String, String, String, String, String);
method public void setCarrierTestOverride(String, String, String, String, String, String, String, String, String);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>);
method @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public void updateTestOtaEmergencyNumberDbFilePath(@NonNull String);
field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe
field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1
diff --git a/cmds/incident_helper/src/ih_util.cpp b/cmds/incident_helper/src/ih_util.cpp
index 9439e1d44291..557fe9fc400f 100644
--- a/cmds/incident_helper/src/ih_util.cpp
+++ b/cmds/incident_helper/src/ih_util.cpp
@@ -244,7 +244,7 @@ Reader::Reader(const int fd)
Reader::~Reader()
{
if (mFile != nullptr) fclose(mFile);
- free(mBuffer);
+ delete[] mBuffer;
}
bool Reader::readLine(std::string* line) {
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 0a138cf81a4c..a7129561c754 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -22,6 +22,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.TestApi;
import android.app.Service;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -572,6 +573,26 @@ public abstract class AccessibilityService extends Service {
*/
public static final int SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN = 0x40000000;
+ /**
+ * The interval time of calling
+ * {@link AccessibilityService#takeScreenshot(int, Executor, Consumer)} API.
+ * @hide
+ */
+ @TestApi
+ public static final int ACCESSIBILITY_TAKE_SCREENSHOT_REQUEST_INTERVAL_TIMES_MS = 1000;
+
+ /** @hide */
+ public static final String KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER =
+ "screenshot_hardwareBuffer";
+
+ /** @hide */
+ public static final String KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE =
+ "screenshot_colorSpace";
+
+ /** @hide */
+ public static final String KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP =
+ "screenshot_timestamp";
+
private int mConnectionId = AccessibilityInteractionClient.NO_ID;
@UnsupportedAppUsage
@@ -597,17 +618,6 @@ public abstract class AccessibilityService extends Service {
private FingerprintGestureController mFingerprintGestureController;
- /** @hide */
- public static final String KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER =
- "screenshot_hardwareBuffer";
-
- /** @hide */
- public static final String KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE =
- "screenshot_colorSpace";
-
- /** @hide */
- public static final String KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP =
- "screenshot_timestamp";
/**
* Callback for {@link android.view.accessibility.AccessibilityEvent}s.
@@ -1926,10 +1936,9 @@ public abstract class AccessibilityService extends Service {
* default display.
* @param executor Executor on which to run the callback.
* @param callback The callback invoked when the taking screenshot is done.
- * The {@link AccessibilityService.ScreenshotResult} will be null for an
- * invalid display.
*
- * @return {@code true} if the taking screenshot accepted, {@code false} if not.
+ * @return {@code true} if the taking screenshot accepted, {@code false} if too little time
+ * has elapsed since the last screenshot, invalid display or internal errors.
*/
public boolean takeScreenshot(int displayId, @NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<ScreenshotResult> callback) {
@@ -1942,11 +1951,7 @@ public abstract class AccessibilityService extends Service {
return false;
}
try {
- connection.takeScreenshot(displayId, new RemoteCallback((result) -> {
- if (result == null) {
- sendScreenshotResult(executor, callback, null);
- return;
- }
+ return connection.takeScreenshot(displayId, new RemoteCallback((result) -> {
final HardwareBuffer hardwareBuffer =
result.getParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER);
final ParcelableColorSpace colorSpace =
@@ -1959,7 +1964,6 @@ public abstract class AccessibilityService extends Service {
} catch (RemoteException re) {
throw new RuntimeException(re);
}
- return true;
}
/**
@@ -2396,6 +2400,10 @@ public abstract class AccessibilityService extends Service {
/**
* Gets the {@link HardwareBuffer} representing a memory buffer of the screenshot.
+ * <p>
+ * <strong>Note:</strong> The application should call {@link HardwareBuffer#close()} when
+ * the buffer is no longer needed to free the underlying resources.
+ * </p>
*
* @return the hardware buffer
*/
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
index 0b3b9b2ecae1..1b7b4af34a94 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
@@ -110,7 +110,7 @@ interface IAccessibilityServiceConnection {
int getWindowIdForLeashToken(IBinder token);
- void takeScreenshot(int displayId, in RemoteCallback callback);
+ boolean takeScreenshot(int displayId, in RemoteCallback callback);
void setGestureDetectionPassthroughRegion(int displayId, in Region region);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index b51bbdf62286..dd4788e1146a 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -696,7 +696,7 @@ public class ActivityManager {
/** @hide Should this process state be considered a background state? */
public static final boolean isProcStateBackground(int procState) {
- return procState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
}
/** @hide Is this a foreground service type? */
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 0ed5aec58924..a62f0a6807bb 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -75,6 +75,7 @@ import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
+import android.content.res.loader.ResourcesLoader;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDebug;
import android.database.sqlite.SQLiteDebug.DbStats;
@@ -3283,6 +3284,12 @@ public final class ActivityThread extends ClientTransactionHandler {
r.mPendingRemoveWindow = null;
r.mPendingRemoveWindowManager = null;
}
+
+ // Activity resources must be initialized with the same loaders as the
+ // application context.
+ appContext.getResources().addLoaders(
+ app.getResources().getLoaders().toArray(new ResourcesLoader[0]));
+
appContext.setOuterContext(activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
@@ -4083,6 +4090,11 @@ public final class ActivityThread extends ClientTransactionHandler {
java.lang.ClassLoader cl = packageInfo.getClassLoader();
service = packageInfo.getAppFactory()
.instantiateService(cl, data.info.name, data.intent);
+ // Service resources must be initialized with the same loaders as the application
+ // context.
+ context.getResources().addLoaders(
+ app.getResources().getLoaders().toArray(new ResourcesLoader[0]));
+
context.setOuterContext(service);
service.attach(context, this, data.info.name, data.token, app,
ActivityManager.getService());
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 969ea707d434..87d33a980438 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -99,6 +99,7 @@ import android.util.Log;
import android.view.Display;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.Immutable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.UserIcons;
@@ -612,7 +613,11 @@ public class ApplicationPackageManager extends PackageManager {
return hasSystemFeature(name, 0);
}
- private class HasSystemFeatureQuery {
+ /**
+ * Identifies a single hasSystemFeature query.
+ */
+ @Immutable
+ private static final class HasSystemFeatureQuery {
public final String name;
public final int version;
public HasSystemFeatureQuery(String n, int v) {
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index d09f0bcf4275..81671c349cbd 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -961,17 +961,19 @@ public class ResourcesManager {
// Rebase each Resources associated with this Activity.
final int refCount = activityResources.activityResources.size();
for (int i = 0; i < refCount; i++) {
- WeakReference<Resources> weakResRef = activityResources.activityResources.get(
- i);
+ final WeakReference<Resources> weakResRef =
+ activityResources.activityResources.get(i);
- Resources resources = weakResRef.get();
+ final Resources resources = weakResRef.get();
if (resources == null) {
continue;
}
- ResourcesKey newKey = rebaseActivityOverrideConfig(resources, oldConfig,
+ final ResourcesKey newKey = rebaseActivityOverrideConfig(resources, oldConfig,
overrideConfig, displayId);
- updateActivityResources(resources, newKey, false);
+ if (newKey != null) {
+ updateActivityResources(resources, newKey, false);
+ }
}
}
} finally {
@@ -983,8 +985,9 @@ public class ResourcesManager {
* Rebases an updated override config over any old override config and returns the new one
* that an Activity's Resources should be set to.
*/
- private ResourcesKey rebaseActivityOverrideConfig(Resources resources,
- Configuration oldOverrideConfig, @Nullable Configuration newOverrideConfig,
+ @Nullable
+ private ResourcesKey rebaseActivityOverrideConfig(@NonNull Resources resources,
+ @NonNull Configuration oldOverrideConfig, @Nullable Configuration newOverrideConfig,
int displayId) {
// Extract the ResourcesKey that was last used to create the Resources for this
// activity.
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 3e1a480b4f66..6e5f914c3596 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1118,7 +1118,7 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getBatteryLevel() {
final IBluetooth service = sService;
if (service == null) {
@@ -1209,7 +1209,7 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean isBondingInitiatedLocally() {
final IBluetooth service = sService;
if (service == null) {
@@ -1247,13 +1247,12 @@ public final class BluetoothDevice implements Parcelable {
/**
* Cancel an in-progress bonding request started with {@link #createBond}.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
* @return true on success, false on error
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean cancelBondProcess() {
final IBluetooth service = sService;
if (service == null) {
@@ -1276,13 +1275,12 @@ public final class BluetoothDevice implements Parcelable {
* <p>Delete the link key associated with the remote device, and
* immediately terminate connections to that device that require
* authentication and encryption.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
* @return true on success, false on error
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean removeBond() {
final IBluetooth service = sService;
if (service == null) {
@@ -1355,13 +1353,12 @@ public final class BluetoothDevice implements Parcelable {
/**
* Returns whether there is an open connection to this device.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
*
* @return True if there is at least one open connection to this device.
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean isConnected() {
final IBluetooth service = sService;
if (service == null) {
@@ -1379,13 +1376,12 @@ public final class BluetoothDevice implements Parcelable {
/**
* Returns whether there is an open connection to this device
* that has been encrypted.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
*
* @return True if there is at least one encrypted connection to this device.
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean isEncrypted() {
final IBluetooth service = sService;
if (service == null) {
@@ -1538,7 +1534,7 @@ public final class BluetoothDevice implements Parcelable {
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setPin(@Nullable String pin) {
+ public boolean setPin(@NonNull String pin) {
byte[] pinBytes = convertPinToBytes(pin);
if (pinBytes == null) {
return false;
@@ -1574,6 +1570,7 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean cancelPairing() {
final IBluetooth service = sService;
if (service == null) {
@@ -1605,8 +1602,8 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public int getPhonebookAccessPermission() {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public @AccessPermission int getPhonebookAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
return ACCESS_UNKNOWN;
@@ -1685,7 +1682,6 @@ public final class BluetoothDevice implements Parcelable {
/**
* Sets whether the phonebook access is allowed to this device.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
*
* @param value Can be {@link #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link
* #ACCESS_REJECTED}.
@@ -1694,7 +1690,7 @@ public final class BluetoothDevice implements Parcelable {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
- public boolean setPhonebookAccessPermission(int value) {
+ public boolean setPhonebookAccessPermission(@AccessPermission int value) {
final IBluetooth service = sService;
if (service == null) {
return false;
@@ -1714,7 +1710,7 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @AccessPermission int getMessageAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
@@ -1761,7 +1757,7 @@ public final class BluetoothDevice implements Parcelable {
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @AccessPermission int getSimAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index acc4cb098ffb..315c26ad66d0 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4080,8 +4080,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String EXTRA_SIM_STATE = "ss";
/**
@@ -4089,8 +4087,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_UNKNOWN = "UNKNOWN";
/**
@@ -4098,8 +4094,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_NOT_READY = "NOT_READY";
/**
@@ -4107,8 +4101,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_ABSENT = "ABSENT";
/**
@@ -4116,8 +4108,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_PRESENT = "PRESENT";
/**
@@ -4125,8 +4115,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
static public final String SIM_STATE_CARD_IO_ERROR = "CARD_IO_ERROR";
/**
@@ -4135,8 +4123,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
static public final String SIM_STATE_CARD_RESTRICTED = "CARD_RESTRICTED";
/**
@@ -4144,8 +4130,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_LOCKED = "LOCKED";
/**
@@ -4153,8 +4137,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_READY = "READY";
/**
@@ -4162,8 +4144,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_IMSI = "IMSI";
/**
@@ -4171,8 +4151,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_STATE_LOADED = "LOADED";
/**
@@ -4187,8 +4165,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String EXTRA_SIM_LOCKED_REASON = "reason";
/**
@@ -4196,8 +4172,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_LOCKED_ON_PIN = "PIN";
/**
@@ -4206,8 +4180,6 @@ public class Intent implements Parcelable, Cloneable {
* @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
/* PUK means ICC is locked on PUK1 */
- @Deprecated
- @SystemApi
public static final String SIM_LOCKED_ON_PUK = "PUK";
/**
@@ -4215,8 +4187,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_LOCKED_NETWORK = "NETWORK";
/**
@@ -4224,8 +4194,6 @@ public class Intent implements Parcelable, Cloneable {
* @hide
* @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String SIM_ABSENT_ON_PERM_DISABLED = "PERM_DISABLED";
/**
@@ -4236,8 +4204,6 @@ public class Intent implements Parcelable, Cloneable {
* @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} or
* {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
- @Deprecated
- @SystemApi
public static final String EXTRA_REBROADCAST_ON_UNLOCK = "rebroadcastOnUnlock";
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index fa751d380580..9b28cb5e88ab 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1995,7 +1995,10 @@ public abstract class PackageManager {
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports a Context Hub, used to expose the
* functionalities in {@link android.hardware.location.ContextHubManager}.
+ *
+ * @hide
*/
+ @SystemApi
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub";
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index c3eea2b2de86..a9b72d041f8b 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -64,6 +64,7 @@ import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringArray;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringList;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringValueMap;
+import com.android.internal.util.Parcelling.BuiltIn.ForStringSet;
import java.security.PublicKey;
import java.util.Collections;
@@ -87,16 +88,15 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
private static final String TAG = "PackageImpl";
public static ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class);
- public static ForInternedString sForString = Parcelling.Cache.getOrCreate(
+ public static ForInternedString sForInternedString = Parcelling.Cache.getOrCreate(
ForInternedString.class);
- public static ForInternedStringArray sForStringArray = Parcelling.Cache.getOrCreate(
+ public static ForInternedStringArray sForInternedStringArray = Parcelling.Cache.getOrCreate(
ForInternedStringArray.class);
- public static ForInternedStringList sForStringList = Parcelling.Cache.getOrCreate(
+ public static ForInternedStringList sForInternedStringList = Parcelling.Cache.getOrCreate(
ForInternedStringList.class);
- public static ForInternedStringValueMap sForStringValueMap = Parcelling.Cache.getOrCreate(
- ForInternedStringValueMap.class);
- public static ForInternedStringSet sForStringSet = Parcelling.Cache.getOrCreate(
- ForInternedStringSet.class);
+ public static ForInternedStringValueMap sForInternedStringValueMap =
+ Parcelling.Cache.getOrCreate(ForInternedStringValueMap.class);
+ public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class);
protected static ParsedIntentInfo.StringPairListParceler sForIntentInfoPairs =
Parcelling.Cache.getOrCreate(ParsedIntentInfo.StringPairListParceler.class);
@@ -414,8 +414,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
public ParsingPackageImpl(@NonNull String packageName, @NonNull String baseCodePath,
@NonNull String codePath, @Nullable TypedArray manifestArray) {
this.packageName = TextUtils.safeIntern(packageName);
- this.baseCodePath = TextUtils.safeIntern(baseCodePath);
- this.codePath = TextUtils.safeIntern(codePath);
+ this.baseCodePath = baseCodePath;
+ this.codePath = codePath;
if (manifestArray != null) {
versionCode = manifestArray.getInteger(R.styleable.AndroidManifest_versionCode, 0);
@@ -496,18 +496,6 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setVersionName(String versionName) {
- this.versionName = TextUtils.safeIntern(versionName);
- return this;
- }
-
- @Override
- public ParsingPackage setCompileSdkVersionCodename(String compileSdkVersionCodename) {
- this.compileSdkVersionCodeName = TextUtils.safeIntern(compileSdkVersionCodename);
- return this;
- }
-
- @Override
public Object hideAsParsed() {
// There is no equivalent for core-only parsing
throw new UnsupportedOperationException();
@@ -548,15 +536,14 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
@Override
public ParsingPackageImpl addOriginalPackage(String originalPackage) {
- this.originalPackages = CollectionUtils.add(this.originalPackages,
- TextUtils.safeIntern(originalPackage));
+ this.originalPackages = CollectionUtils.add(this.originalPackages, originalPackage);
return this;
}
@Override
public ParsingPackage addOverlayable(String overlayableName, String actorName) {
- this.overlayables = CollectionUtils.add(this.overlayables,
- TextUtils.safeIntern(overlayableName), TextUtils.safeIntern(actorName));
+ this.overlayables = CollectionUtils.add(this.overlayables, overlayableName,
+ TextUtils.safeIntern(actorName));
return this;
}
@@ -710,8 +697,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
@Override
public ParsingPackageImpl addQueriesProvider(String authority) {
- this.queriesProviders = CollectionUtils.add(this.queriesProviders,
- TextUtils.safeIntern(authority));
+ this.queriesProviders = CollectionUtils.add(this.queriesProviders, authority);
return this;
}
@@ -776,20 +762,9 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl asSplit(
- String[] splitNames,
- String[] splitCodePaths,
- int[] splitRevisionCodes,
- SparseArray<int[]> splitDependencies
- ) {
+ public ParsingPackageImpl asSplit(String[] splitNames, String[] splitCodePaths,
+ int[] splitRevisionCodes, SparseArray<int[]> splitDependencies) {
this.splitNames = splitNames;
-
- if (this.splitNames != null) {
- for (int index = 0; index < this.splitNames.length; index++) {
- splitNames[index] = TextUtils.safeIntern(splitNames[index]);
- }
- }
-
this.splitCodePaths = splitCodePaths;
this.splitRevisionCodes = splitRevisionCodes;
this.splitDependencies = splitDependencies;
@@ -815,26 +790,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setProcessName(String processName) {
- this.processName = TextUtils.safeIntern(processName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setRealPackage(@Nullable String realPackage) {
- this.realPackage = TextUtils.safeIntern(realPackage);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) {
- this.restrictedAccountType = TextUtils.safeIntern(restrictedAccountType);
- return this;
- }
-
- @Override
public ParsingPackageImpl setRequiredAccountType(@Nullable String requiredAccountType) {
- this.requiredAccountType = TextUtils.nullIfEmpty(TextUtils.safeIntern(requiredAccountType));
+ this.requiredAccountType = TextUtils.nullIfEmpty(requiredAccountType);
return this;
}
@@ -845,72 +802,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setOverlayTargetName(@Nullable String overlayTargetName) {
- this.overlayTargetName = TextUtils.safeIntern(overlayTargetName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setOverlayCategory(@Nullable String overlayCategory) {
- this.overlayCategory = TextUtils.safeIntern(overlayCategory);
- return this;
- }
-
- @Override
public ParsingPackageImpl setVolumeUuid(@Nullable String volumeUuid) {
this.volumeUuid = TextUtils.safeIntern(volumeUuid);
return this;
}
@Override
- public ParsingPackageImpl setAppComponentFactory(@Nullable String appComponentFactory) {
- this.appComponentFactory = TextUtils.safeIntern(appComponentFactory);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setBackupAgentName(@Nullable String backupAgentName) {
- this.backupAgentName = TextUtils.safeIntern(backupAgentName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setClassLoaderName(@Nullable String classLoaderName) {
- this.classLoaderName = TextUtils.safeIntern(classLoaderName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setClassName(@Nullable String className) {
- this.className = TextUtils.safeIntern(className);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) {
- this.manageSpaceActivityName = TextUtils.safeIntern(manageSpaceActivityName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setPermission(@Nullable String permission) {
- this.permission = TextUtils.safeIntern(permission);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setTaskAffinity(@Nullable String taskAffinity) {
- this.taskAffinity = TextUtils.safeIntern(taskAffinity);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) {
- this.zygotePreloadName = TextUtils.safeIntern(zygotePreloadName);
- return this;
- }
-
- @Override
public ParsingPackageImpl setStaticSharedLibName(String staticSharedLibName) {
this.staticSharedLibName = TextUtils.safeIntern(staticSharedLibName);
return this;
@@ -1044,27 +941,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
dest.writeInt(this.versionCode);
dest.writeInt(this.versionCodeMajor);
dest.writeInt(this.baseRevisionCode);
- sForString.parcel(this.versionName, dest, flags);
+ sForInternedString.parcel(this.versionName, dest, flags);
dest.writeInt(this.compileSdkVersion);
- sForString.parcel(this.compileSdkVersionCodeName, dest, flags);
- sForString.parcel(this.packageName, dest, flags);
- sForString.parcel(this.realPackage, dest, flags);
- sForString.parcel(this.baseCodePath, dest, flags);
+ dest.writeString(this.compileSdkVersionCodeName);
+ sForInternedString.parcel(this.packageName, dest, flags);
+ dest.writeString(this.realPackage);
+ dest.writeString(this.baseCodePath);
dest.writeBoolean(this.requiredForAllUsers);
- sForString.parcel(this.restrictedAccountType, dest, flags);
- sForString.parcel(this.requiredAccountType, dest, flags);
- sForString.parcel(this.overlayTarget, dest, flags);
- sForString.parcel(this.overlayTargetName, dest, flags);
- sForString.parcel(this.overlayCategory, dest, flags);
+ dest.writeString(this.restrictedAccountType);
+ dest.writeString(this.requiredAccountType);
+ sForInternedString.parcel(this.overlayTarget, dest, flags);
+ dest.writeString(this.overlayTargetName);
+ dest.writeString(this.overlayCategory);
dest.writeInt(this.overlayPriority);
dest.writeBoolean(this.overlayIsStatic);
- sForStringValueMap.parcel(this.overlayables, dest, flags);
- sForString.parcel(this.staticSharedLibName, dest, flags);
+ sForInternedStringValueMap.parcel(this.overlayables, dest, flags);
+ sForInternedString.parcel(this.staticSharedLibName, dest, flags);
dest.writeLong(this.staticSharedLibVersion);
- sForStringList.parcel(this.libraryNames, dest, flags);
- sForStringList.parcel(this.usesLibraries, dest, flags);
- sForStringList.parcel(this.usesOptionalLibraries, dest, flags);
- sForStringList.parcel(this.usesStaticLibraries, dest, flags);
+ sForInternedStringList.parcel(this.libraryNames, dest, flags);
+ sForInternedStringList.parcel(this.usesLibraries, dest, flags);
+ sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags);
+ sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags);
dest.writeLongArray(this.usesStaticLibrariesVersions);
if (this.usesStaticLibrariesCertDigests == null) {
@@ -1072,23 +969,23 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
} else {
dest.writeInt(this.usesStaticLibrariesCertDigests.length);
for (int index = 0; index < this.usesStaticLibrariesCertDigests.length; index++) {
- sForStringArray.parcel(this.usesStaticLibrariesCertDigests[index], dest, flags);
+ dest.writeStringArray(this.usesStaticLibrariesCertDigests[index]);
}
}
- sForString.parcel(this.sharedUserId, dest, flags);
+ sForInternedString.parcel(this.sharedUserId, dest, flags);
dest.writeInt(this.sharedUserLabel);
dest.writeTypedList(this.configPreferences);
dest.writeTypedList(this.reqFeatures);
dest.writeTypedList(this.featureGroups);
dest.writeByteArray(this.restrictUpdateHash);
- sForStringList.parcel(this.originalPackages, dest, flags);
- sForStringList.parcel(this.adoptPermissions, dest, flags);
- sForStringList.parcel(this.requestedPermissions, dest, flags);
- sForStringList.parcel(this.implicitPermissions, dest, flags);
+ dest.writeStringList(this.originalPackages);
+ sForInternedStringList.parcel(this.adoptPermissions, dest, flags);
+ sForInternedStringList.parcel(this.requestedPermissions, dest, flags);
+ sForInternedStringList.parcel(this.implicitPermissions, dest, flags);
sForStringSet.parcel(this.upgradeKeySets, dest, flags);
dest.writeMap(this.keySetMapping);
- sForStringList.parcel(this.protectedBroadcasts, dest, flags);
+ sForInternedStringList.parcel(this.protectedBroadcasts, dest, flags);
dest.writeTypedList(this.activities);
dest.writeTypedList(this.receivers);
dest.writeTypedList(this.services);
@@ -1100,20 +997,20 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
sForIntentInfoPairs.parcel(this.preferredActivityFilters, dest, flags);
dest.writeMap(this.processes);
dest.writeBundle(this.metaData);
- sForString.parcel(this.volumeUuid, dest, flags);
+ sForInternedString.parcel(this.volumeUuid, dest, flags);
dest.writeParcelable(this.signingDetails, flags);
- sForString.parcel(this.codePath, dest, flags);
+ dest.writeString(this.codePath);
dest.writeBoolean(this.use32BitAbi);
dest.writeBoolean(this.visibleToInstantApps);
dest.writeBoolean(this.forceQueryable);
dest.writeParcelableList(this.queriesIntents, flags);
- sForStringList.parcel(this.queriesPackages, dest, flags);
- sForString.parcel(this.appComponentFactory, dest, flags);
- sForString.parcel(this.backupAgentName, dest, flags);
+ sForInternedStringList.parcel(this.queriesPackages, dest, flags);
+ dest.writeString(this.appComponentFactory);
+ dest.writeString(this.backupAgentName);
dest.writeInt(this.banner);
dest.writeInt(this.category);
- sForString.parcel(this.classLoaderName, dest, flags);
- sForString.parcel(this.className, dest, flags);
+ dest.writeString(this.classLoaderName);
+ dest.writeString(this.className);
dest.writeInt(this.compatibleWidthLimitDp);
dest.writeInt(this.descriptionRes);
dest.writeBoolean(this.enabled);
@@ -1124,27 +1021,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
dest.writeInt(this.labelRes);
dest.writeInt(this.largestWidthLimitDp);
dest.writeInt(this.logo);
- sForString.parcel(this.manageSpaceActivityName, dest, flags);
+ dest.writeString(this.manageSpaceActivityName);
dest.writeFloat(this.maxAspectRatio);
dest.writeFloat(this.minAspectRatio);
dest.writeInt(this.minSdkVersion);
dest.writeInt(this.networkSecurityConfigRes);
dest.writeCharSequence(this.nonLocalizedLabel);
- sForString.parcel(this.permission, dest, flags);
- sForString.parcel(this.processName, dest, flags);
+ dest.writeString(this.permission);
+ dest.writeString(this.processName);
dest.writeInt(this.requiresSmallestWidthDp);
dest.writeInt(this.roundIconRes);
dest.writeInt(this.targetSandboxVersion);
dest.writeInt(this.targetSdkVersion);
- sForString.parcel(this.taskAffinity, dest, flags);
+ dest.writeString(this.taskAffinity);
dest.writeInt(this.theme);
dest.writeInt(this.uiOptions);
- sForString.parcel(this.zygotePreloadName, dest, flags);
- sForStringArray.parcel(this.splitClassLoaderNames, dest, flags);
- sForStringArray.parcel(this.splitCodePaths, dest, flags);
+ dest.writeString(this.zygotePreloadName);
+ dest.writeStringArray(this.splitClassLoaderNames);
+ dest.writeStringArray(this.splitCodePaths);
dest.writeSparseArray(this.splitDependencies);
dest.writeIntArray(this.splitFlags);
- sForStringArray.parcel(this.splitNames, dest, flags);
+ dest.writeStringArray(this.splitNames);
dest.writeIntArray(this.splitRevisionCodes);
dest.writeBoolean(this.externalStorage);
@@ -1203,50 +1100,51 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.versionCode = in.readInt();
this.versionCodeMajor = in.readInt();
this.baseRevisionCode = in.readInt();
- this.versionName = sForString.unparcel(in);
+ this.versionName = sForInternedString.unparcel(in);
this.compileSdkVersion = in.readInt();
- this.compileSdkVersionCodeName = sForString.unparcel(in);
- this.packageName = sForString.unparcel(in);
- this.realPackage = sForString.unparcel(in);
- this.baseCodePath = sForString.unparcel(in);
+ this.compileSdkVersionCodeName = in.readString();
+ this.packageName = sForInternedString.unparcel(in);
+ this.realPackage = in.readString();
+ this.baseCodePath = in.readString();
this.requiredForAllUsers = in.readBoolean();
- this.restrictedAccountType = sForString.unparcel(in);
- this.requiredAccountType = sForString.unparcel(in);
- this.overlayTarget = sForString.unparcel(in);
- this.overlayTargetName = sForString.unparcel(in);
- this.overlayCategory = sForString.unparcel(in);
+ this.restrictedAccountType = in.readString();
+ this.requiredAccountType = in.readString();
+ this.overlayTarget = sForInternedString.unparcel(in);
+ this.overlayTargetName = in.readString();
+ this.overlayCategory = in.readString();
this.overlayPriority = in.readInt();
this.overlayIsStatic = in.readBoolean();
- this.overlayables = sForStringValueMap.unparcel(in);
- this.staticSharedLibName = sForString.unparcel(in);
+ this.overlayables = sForInternedStringValueMap.unparcel(in);
+ this.staticSharedLibName = sForInternedString.unparcel(in);
this.staticSharedLibVersion = in.readLong();
- this.libraryNames = sForStringList.unparcel(in);
- this.usesLibraries = sForStringList.unparcel(in);
- this.usesOptionalLibraries = sForStringList.unparcel(in);
- this.usesStaticLibraries = sForStringList.unparcel(in);
+ this.libraryNames = sForInternedStringList.unparcel(in);
+ this.usesLibraries = sForInternedStringList.unparcel(in);
+ this.usesOptionalLibraries = sForInternedStringList.unparcel(in);
+ this.usesStaticLibraries = sForInternedStringList.unparcel(in);
this.usesStaticLibrariesVersions = in.createLongArray();
int digestsSize = in.readInt();
if (digestsSize >= 0) {
this.usesStaticLibrariesCertDigests = new String[digestsSize][];
for (int index = 0; index < digestsSize; index++) {
- this.usesStaticLibrariesCertDigests[index] = sForStringArray.unparcel(in);
+ this.usesStaticLibrariesCertDigests[index] = sForInternedStringArray.unparcel(in);
}
}
- this.sharedUserId = sForString.unparcel(in);
+ this.sharedUserId = sForInternedString.unparcel(in);
this.sharedUserLabel = in.readInt();
this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR);
this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR);
this.featureGroups = in.createTypedArrayList(FeatureGroupInfo.CREATOR);
this.restrictUpdateHash = in.createByteArray();
- this.originalPackages = sForStringList.unparcel(in);
- this.adoptPermissions = sForStringList.unparcel(in);
- this.requestedPermissions = sForStringList.unparcel(in);
- this.implicitPermissions = sForStringList.unparcel(in);
+ this.originalPackages = in.createStringArrayList();
+ this.adoptPermissions = sForInternedStringList.unparcel(in);
+ this.requestedPermissions = sForInternedStringList.unparcel(in);
+ this.implicitPermissions = sForInternedStringList.unparcel(in);
this.upgradeKeySets = sForStringSet.unparcel(in);
this.keySetMapping = in.readHashMap(boot);
- this.protectedBroadcasts = sForStringList.unparcel(in);
+ this.protectedBroadcasts = sForInternedStringList.unparcel(in);
+
this.activities = in.createTypedArrayList(ParsedActivity.CREATOR);
this.receivers = in.createTypedArrayList(ParsedActivity.CREATOR);
this.services = in.createTypedArrayList(ParsedService.CREATOR);
@@ -1258,20 +1156,20 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in);
this.processes = in.readHashMap(boot);
this.metaData = in.readBundle(boot);
- this.volumeUuid = sForString.unparcel(in);
+ this.volumeUuid = sForInternedString.unparcel(in);
this.signingDetails = in.readParcelable(boot);
- this.codePath = sForString.unparcel(in);
+ this.codePath = in.readString();
this.use32BitAbi = in.readBoolean();
this.visibleToInstantApps = in.readBoolean();
this.forceQueryable = in.readBoolean();
this.queriesIntents = in.createTypedArrayList(Intent.CREATOR);
- this.queriesPackages = sForStringList.unparcel(in);
- this.appComponentFactory = sForString.unparcel(in);
- this.backupAgentName = sForString.unparcel(in);
+ this.queriesPackages = sForInternedStringList.unparcel(in);
+ this.appComponentFactory = in.readString();
+ this.backupAgentName = in.readString();
this.banner = in.readInt();
this.category = in.readInt();
- this.classLoaderName = sForString.unparcel(in);
- this.className = sForString.unparcel(in);
+ this.classLoaderName = in.readString();
+ this.className = in.readString();
this.compatibleWidthLimitDp = in.readInt();
this.descriptionRes = in.readInt();
this.enabled = in.readBoolean();
@@ -1282,27 +1180,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.labelRes = in.readInt();
this.largestWidthLimitDp = in.readInt();
this.logo = in.readInt();
- this.manageSpaceActivityName = sForString.unparcel(in);
+ this.manageSpaceActivityName = in.readString();
this.maxAspectRatio = in.readFloat();
this.minAspectRatio = in.readFloat();
this.minSdkVersion = in.readInt();
this.networkSecurityConfigRes = in.readInt();
this.nonLocalizedLabel = in.readCharSequence();
- this.permission = sForString.unparcel(in);
- this.processName = sForString.unparcel(in);
+ this.permission = in.readString();
+ this.processName = in.readString();
this.requiresSmallestWidthDp = in.readInt();
this.roundIconRes = in.readInt();
this.targetSandboxVersion = in.readInt();
this.targetSdkVersion = in.readInt();
- this.taskAffinity = sForString.unparcel(in);
+ this.taskAffinity = in.readString();
this.theme = in.readInt();
this.uiOptions = in.readInt();
- this.zygotePreloadName = sForString.unparcel(in);
- this.splitClassLoaderNames = sForStringArray.unparcel(in);
- this.splitCodePaths = sForStringArray.unparcel(in);
+ this.zygotePreloadName = in.readString();
+ this.splitClassLoaderNames = in.createStringArray();
+ this.splitCodePaths = in.createStringArray();
this.splitDependencies = in.readSparseArray(boot);
this.splitFlags = in.createIntArray();
- this.splitNames = sForStringArray.unparcel(in);
+ this.splitNames = in.createStringArray();
this.splitRevisionCodes = in.createIntArray();
this.externalStorage = in.readBoolean();
this.baseHardwareAccelerated = in.readBoolean();
@@ -1323,7 +1221,6 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.multiArch = in.readBoolean();
this.extractNativeLibs = in.readBoolean();
this.game = in.readBoolean();
-
this.resizeableActivity = sForBoolean.unparcel(in);
this.staticSharedLibrary = in.readBoolean();
@@ -2581,4 +2478,94 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
preserveLegacyExternalStorage = value;
return this;
}
+
+ @Override
+ public ParsingPackageImpl setVersionName(String versionName) {
+ this.versionName = versionName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackage setCompileSdkVersionCodename(String compileSdkVersionCodename) {
+ this.compileSdkVersionCodeName = compileSdkVersionCodename;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setProcessName(String processName) {
+ this.processName = processName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setRealPackage(@Nullable String realPackage) {
+ this.realPackage = realPackage;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) {
+ this.restrictedAccountType = restrictedAccountType;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setOverlayTargetName(@Nullable String overlayTargetName) {
+ this.overlayTargetName = overlayTargetName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setOverlayCategory(@Nullable String overlayCategory) {
+ this.overlayCategory = overlayCategory;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setAppComponentFactory(@Nullable String appComponentFactory) {
+ this.appComponentFactory = appComponentFactory;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setBackupAgentName(@Nullable String backupAgentName) {
+ this.backupAgentName = backupAgentName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setClassLoaderName(@Nullable String classLoaderName) {
+ this.classLoaderName = classLoaderName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setClassName(@Nullable String className) {
+ this.className = className;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) {
+ this.manageSpaceActivityName = manageSpaceActivityName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setPermission(@Nullable String permission) {
+ this.permission = permission;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setTaskAffinity(@Nullable String taskAffinity) {
+ this.taskAffinity = taskAffinity;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) {
+ this.zygotePreloadName = zygotePreloadName;
+ return this;
+ }
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivity.java b/core/java/android/content/pm/parsing/component/ParsedActivity.java
index 5495c225f811..7a46e3868f95 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivity.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivity.java
@@ -20,7 +20,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED;
import android.annotation.Nullable;
@@ -29,13 +29,11 @@ import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
-import android.content.pm.parsing.ParsingPackageImpl;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -268,11 +266,11 @@ public class ParsedActivity extends ParsedMainComponent {
super.writeToParcel(dest, flags);
dest.writeInt(this.theme);
dest.writeInt(this.uiOptions);
- sForString.parcel(this.targetActivity, dest, flags);
- sForString.parcel(this.parentActivityName, dest, flags);
+ dest.writeString(this.targetActivity);
+ dest.writeString(this.parentActivityName);
dest.writeString(this.taskAffinity);
dest.writeInt(this.privateFlags);
- sForString.parcel(this.permission, dest, flags);
+ sForInternedString.parcel(this.permission, dest, flags);
dest.writeInt(this.launchMode);
dest.writeInt(this.documentLaunchMode);
dest.writeInt(this.maxRecents);
@@ -311,11 +309,11 @@ public class ParsedActivity extends ParsedMainComponent {
super(in);
this.theme = in.readInt();
this.uiOptions = in.readInt();
- this.targetActivity = sForString.unparcel(in);
- this.parentActivityName = sForString.unparcel(in);
+ this.targetActivity = in.readString();
+ this.parentActivityName = in.readString();
this.taskAffinity = in.readString();
this.privateFlags = in.readInt();
- this.permission = sForString.unparcel(in);
+ this.permission = sForInternedString.unparcel(in);
this.launchMode = in.readInt();
this.documentLaunchMode = in.readInt();
this.maxRecents = in.readInt();
diff --git a/core/java/android/content/pm/parsing/component/ParsedComponent.java b/core/java/android/content/pm/parsing/component/ParsedComponent.java
index 098d6204b021..6323d6921394 100644
--- a/core/java/android/content/pm/parsing/component/ParsedComponent.java
+++ b/core/java/android/content/pm/parsing/component/ParsedComponent.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.CallSuper;
import android.annotation.NonNull;
@@ -131,7 +131,7 @@ public abstract class ParsedComponent implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- sForString.parcel(this.name, dest, flags);
+ dest.writeString(this.name);
dest.writeInt(this.getIcon());
dest.writeInt(this.getLabelRes());
dest.writeCharSequence(this.getNonLocalizedLabel());
@@ -139,7 +139,7 @@ public abstract class ParsedComponent implements Parcelable {
dest.writeInt(this.getBanner());
dest.writeInt(this.getDescriptionRes());
dest.writeInt(this.getFlags());
- sForString.parcel(this.packageName, dest, flags);
+ sForInternedString.parcel(this.packageName, dest, flags);
sForIntentInfos.parcel(this.getIntents(), dest, flags);
dest.writeBundle(this.metaData);
}
@@ -148,7 +148,7 @@ public abstract class ParsedComponent implements Parcelable {
// We use the boot classloader for all classes that we load.
final ClassLoader boot = Object.class.getClassLoader();
//noinspection ConstantConditions
- this.name = sForString.unparcel(in);
+ this.name = in.readString();
this.icon = in.readInt();
this.labelRes = in.readInt();
this.nonLocalizedLabel = in.readCharSequence();
@@ -157,7 +157,7 @@ public abstract class ParsedComponent implements Parcelable {
this.descriptionRes = in.readInt();
this.flags = in.readInt();
//noinspection ConstantConditions
- this.packageName = sForString.unparcel(in);
+ this.packageName = sForInternedString.unparcel(in);
this.intents = sForIntentInfos.unparcel(in);
this.metaData = in.readBundle(boot);
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java b/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
index 396a145311f2..aa33e79c4aa9 100644
--- a/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
+++ b/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -25,7 +25,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -69,16 +68,16 @@ public class ParsedInstrumentation extends ParsedComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.targetPackage, dest, flags);
- sForString.parcel(this.targetProcesses, dest, flags);
+ sForInternedString.parcel(this.targetPackage, dest, flags);
+ sForInternedString.parcel(this.targetProcesses, dest, flags);
dest.writeBoolean(this.handleProfiling);
dest.writeBoolean(this.functionalTest);
}
protected ParsedInstrumentation(Parcel in) {
super(in);
- this.targetPackage = sForString.unparcel(in);
- this.targetProcesses = sForString.unparcel(in);
+ this.targetPackage = sForInternedString.unparcel(in);
+ this.targetProcesses = sForInternedString.unparcel(in);
this.handleProfiling = in.readByte() != 0;
this.functionalTest = in.readByte() != 0;
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedMainComponent.java b/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
index 59e9a84e3ceb..a5e394d82356 100644
--- a/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
+++ b/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.os.Parcel;
@@ -24,7 +24,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -79,7 +78,7 @@ public class ParsedMainComponent extends ParsedComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.processName, dest, flags);
+ sForInternedString.parcel(this.processName, dest, flags);
dest.writeBoolean(this.directBootAware);
dest.writeBoolean(this.enabled);
dest.writeBoolean(this.exported);
@@ -89,7 +88,7 @@ public class ParsedMainComponent extends ParsedComponent {
protected ParsedMainComponent(Parcel in) {
super(in);
- this.processName = sForString.unparcel(in);
+ this.processName = sForInternedString.unparcel(in);
this.directBootAware = in.readBoolean();
this.enabled = in.readBoolean();
this.exported = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedPermission.java b/core/java/android/content/pm/parsing/component/ParsedPermission.java
index 6c36ecb76846..ced322649c66 100644
--- a/core/java/android/content/pm/parsing/component/ParsedPermission.java
+++ b/core/java/android/content/pm/parsing/component/ParsedPermission.java
@@ -16,8 +16,6 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
-
import android.annotation.Nullable;
import android.content.pm.PermissionInfo;
import android.os.Parcel;
@@ -26,7 +24,6 @@ import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -123,7 +120,7 @@ public class ParsedPermission extends ParsedComponent {
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(this.backgroundPermission);
- sForString.parcel(this.group, dest, flags);
+ dest.writeString(this.group);
dest.writeInt(this.requestRes);
dest.writeInt(this.protectionLevel);
dest.writeBoolean(this.tree);
@@ -135,7 +132,7 @@ public class ParsedPermission extends ParsedComponent {
// We use the boot classloader for all classes that we load.
final ClassLoader boot = Object.class.getClassLoader();
this.backgroundPermission = in.readString();
- this.group = sForString.unparcel(in);
+ this.group = in.readString();
this.requestRes = in.readInt();
this.protectionLevel = in.readInt();
this.tree = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedProvider.java b/core/java/android/content/pm/parsing/component/ParsedProvider.java
index d2c531dbe5d9..fcf6e8767760 100644
--- a/core/java/android/content/pm/parsing/component/ParsedProvider.java
+++ b/core/java/android/content/pm/parsing/component/ParsedProvider.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -28,7 +28,6 @@ import android.os.PatternMatcher;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -106,10 +105,10 @@ public class ParsedProvider extends ParsedMainComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.authority, dest, flags);
+ dest.writeString(this.authority);
dest.writeBoolean(this.syncable);
- sForString.parcel(this.readPermission, dest, flags);
- sForString.parcel(this.writePermission, dest, flags);
+ sForInternedString.parcel(this.readPermission, dest, flags);
+ sForInternedString.parcel(this.writePermission, dest, flags);
dest.writeBoolean(this.grantUriPermissions);
dest.writeBoolean(this.forceUriPermissions);
dest.writeBoolean(this.multiProcess);
@@ -124,10 +123,10 @@ public class ParsedProvider extends ParsedMainComponent {
protected ParsedProvider(Parcel in) {
super(in);
//noinspection ConstantConditions
- this.authority = sForString.unparcel(in);
+ this.authority = in.readString();
this.syncable = in.readBoolean();
- this.readPermission = sForString.unparcel(in);
- this.writePermission = sForString.unparcel(in);
+ this.readPermission = sForInternedString.unparcel(in);
+ this.writePermission = sForInternedString.unparcel(in);
this.grantUriPermissions = in.readBoolean();
this.forceUriPermissions = in.readBoolean();
this.multiProcess = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedService.java b/core/java/android/content/pm/parsing/component/ParsedService.java
index 591eef74453a..7adb2624056e 100644
--- a/core/java/android/content/pm/parsing/component/ParsedService.java
+++ b/core/java/android/content/pm/parsing/component/ParsedService.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -25,7 +25,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -67,7 +66,7 @@ public class ParsedService extends ParsedMainComponent {
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.foregroundServiceType);
- sForString.parcel(this.permission, dest, flags);
+ sForInternedString.parcel(this.permission, dest, flags);
}
public ParsedService() {
@@ -76,7 +75,7 @@ public class ParsedService extends ParsedMainComponent {
protected ParsedService(Parcel in) {
super(in);
this.foregroundServiceType = in.readInt();
- this.permission = sForString.unparcel(in);
+ this.permission = sForInternedString.unparcel(in);
}
public static final Parcelable.Creator<ParsedService> CREATOR = new Creator<ParsedService>() {
diff --git a/core/java/android/inputmethodservice/InlineSuggestionSession.java b/core/java/android/inputmethodservice/InlineSuggestionSession.java
index 25e90ee9833c..c31cb4e61b6e 100644
--- a/core/java/android/inputmethodservice/InlineSuggestionSession.java
+++ b/core/java/android/inputmethodservice/InlineSuggestionSession.java
@@ -28,6 +28,7 @@ import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import android.view.autofill.AutofillId;
+import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InlineSuggestionsRequest;
import android.view.inputmethod.InlineSuggestionsResponse;
@@ -45,10 +46,27 @@ import java.util.function.Supplier;
* Each session corresponds to one {@link InlineSuggestionsRequest} and one {@link
* IInlineSuggestionsResponseCallback}, but there may be multiple invocations of the response
* callback for the same field or different fields in the same component.
+ *
+ * <p>
+ * The data flow from IMS point of view is:
+ * Before calling {@link InputMethodService#onStartInputView(EditorInfo, boolean)}, call the {@link
+ * #notifyOnStartInputView(AutofillId)}
+ * ->
+ * [async] {@link IInlineSuggestionsRequestCallback#onInputMethodStartInputView(AutofillId)}
+ * --- process boundary ---
+ * ->
+ * {@link com.android.server.inputmethod.InputMethodManagerService
+ * .InlineSuggestionsRequestCallbackDecorator#onInputMethodStartInputView(AutofillId)}
+ * ->
+ * {@link com.android.server.autofill.InlineSuggestionSession
+ * .InlineSuggestionsRequestCallbackImpl#onInputMethodStartInputView(AutofillId)}
+ *
+ * <p>
+ * The data flow for {@link #notifyOnFinishInputView(AutofillId)} is similar.
*/
class InlineSuggestionSession {
- private static final String TAG = InlineSuggestionSession.class.getSimpleName();
+ private static final String TAG = "ImsInlineSuggestionSession";
private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
@@ -77,7 +95,8 @@ class InlineSuggestionSession {
@NonNull Supplier<AutofillId> clientAutofillIdSupplier,
@NonNull Supplier<InlineSuggestionsRequest> requestSupplier,
@NonNull Supplier<IBinder> hostInputTokenSupplier,
- @NonNull Consumer<InlineSuggestionsResponse> responseConsumer) {
+ @NonNull Consumer<InlineSuggestionsResponse> responseConsumer,
+ boolean inputViewStarted) {
mComponentName = componentName;
mCallback = callback;
mResponseCallback = new InlineSuggestionsResponseCallbackImpl(this);
@@ -87,7 +106,25 @@ class InlineSuggestionSession {
mHostInputTokenSupplier = hostInputTokenSupplier;
mResponseConsumer = responseConsumer;
- makeInlineSuggestionsRequest();
+ makeInlineSuggestionsRequest(inputViewStarted);
+ }
+
+ void notifyOnStartInputView(AutofillId imeFieldId) {
+ if (DEBUG) Log.d(TAG, "notifyOnStartInputView");
+ try {
+ mCallback.onInputMethodStartInputView(imeFieldId);
+ } catch (RemoteException e) {
+ Log.w(TAG, "onInputMethodStartInputView() remote exception:" + e);
+ }
+ }
+
+ void notifyOnFinishInputView(AutofillId imeFieldId) {
+ if (DEBUG) Log.d(TAG, "notifyOnFinishInputView");
+ try {
+ mCallback.onInputMethodFinishInputView(imeFieldId);
+ } catch (RemoteException e) {
+ Log.w(TAG, "onInputMethodFinishInputView() remote exception:" + e);
+ }
}
/**
@@ -103,7 +140,7 @@ class InlineSuggestionSession {
* Autofill Session through
* {@link IInlineSuggestionsRequestCallback#onInlineSuggestionsRequest}.
*/
- private void makeInlineSuggestionsRequest() {
+ private void makeInlineSuggestionsRequest(boolean inputViewStarted) {
try {
final InlineSuggestionsRequest request = mRequestSupplier.get();
if (request == null) {
@@ -113,7 +150,8 @@ class InlineSuggestionSession {
mCallback.onInlineSuggestionsUnsupported();
} else {
request.setHostInputToken(mHostInputTokenSupplier.get());
- mCallback.onInlineSuggestionsRequest(request, mResponseCallback);
+ mCallback.onInlineSuggestionsRequest(request, mResponseCallback,
+ mClientAutofillIdSupplier.get(), inputViewStarted);
}
} catch (RemoteException e) {
Log.w(TAG, "makeInlinedSuggestionsRequest() remote exception:" + e);
@@ -128,16 +166,15 @@ class InlineSuggestionSession {
}
return;
}
- // TODO(b/149522488): Verify fieldId against {@code mClientAutofillIdSupplier.get()} using
- // {@link AutofillId#equalsIgnoreSession(AutofillId)}. Right now, this seems to be
- // falsely alarmed quite often, depending whether autofill suggestions arrive earlier
- // than the IMS EditorInfo updates or not.
- if (!mComponentName.getPackageName().equals(mClientPackageNameSupplier.get())) {
+
+ if (!mComponentName.getPackageName().equals(mClientPackageNameSupplier.get())
+ || !fieldId.equalsIgnoreSession(mClientAutofillIdSupplier.get())) {
if (DEBUG) {
Log.d(TAG,
- "handleOnInlineSuggestionsResponse() called on the wrong package "
+ "handleOnInlineSuggestionsResponse() called on the wrong package/field "
+ "name: " + mComponentName.getPackageName() + " v.s. "
- + mClientPackageNameSupplier.get());
+ + mClientPackageNameSupplier.get() + ", " + fieldId + " v.s. "
+ + mClientAutofillIdSupplier.get());
}
return;
}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index d27d1382e09d..9e639346de73 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -444,6 +444,16 @@ public class InputMethodService extends AbstractInputMethodService {
final Insets mTmpInsets = new Insets();
final int[] mTmpLocation = new int[2];
+ /**
+ * We use a separate {@code mInlineLock} to make sure {@code mInlineSuggestionSession} is
+ * only accessed synchronously. Although when the lock is introduced, all the calls are from
+ * the main thread so the lock is not really necessarily (but for the same reason it also
+ * doesn't hurt), it's still being added as a safety guard to make sure in the future we
+ * don't add more code causing race condition when updating the {@code
+ * mInlineSuggestionSession}.
+ */
+ private final Object mInlineLock = new Object();
+ @GuardedBy("mInlineLock")
@Nullable
private InlineSuggestionSession mInlineSuggestionSession;
@@ -822,13 +832,15 @@ public class InputMethodService extends AbstractInputMethodService {
return;
}
- if (mInlineSuggestionSession != null) {
- mInlineSuggestionSession.invalidateSession();
+ synchronized (mInlineLock) {
+ if (mInlineSuggestionSession != null) {
+ mInlineSuggestionSession.invalidateSession();
+ }
+ mInlineSuggestionSession = new InlineSuggestionSession(requestInfo.getComponentName(),
+ callback, this::getEditorInfoPackageName, this::getEditorInfoAutofillId,
+ () -> onCreateInlineSuggestionsRequest(requestInfo.getUiExtras()),
+ this::getHostInputToken, this::onInlineSuggestionsResponse, mInputViewStarted);
}
- mInlineSuggestionSession = new InlineSuggestionSession(requestInfo.getComponentName(),
- callback, this::getEditorInfoPackageName, this::getEditorInfoAutofillId,
- () -> onCreateInlineSuggestionsRequest(requestInfo.getUiExtras()),
- this::getHostInputToken, this::onInlineSuggestionsResponse);
}
@Nullable
@@ -2193,6 +2205,11 @@ public class InputMethodService extends AbstractInputMethodService {
if (!mInputViewStarted) {
if (DEBUG) Log.v(TAG, "CALL: onStartInputView");
mInputViewStarted = true;
+ synchronized (mInlineLock) {
+ if (mInlineSuggestionSession != null) {
+ mInlineSuggestionSession.notifyOnStartInputView(getEditorInfoAutofillId());
+ }
+ }
onStartInputView(mInputEditorInfo, false);
}
} else if (!mCandidatesViewStarted) {
@@ -2233,6 +2250,11 @@ public class InputMethodService extends AbstractInputMethodService {
private void finishViews(boolean finishingInput) {
if (mInputViewStarted) {
if (DEBUG) Log.v(TAG, "CALL: onFinishInputView");
+ synchronized (mInlineLock) {
+ if (mInlineSuggestionSession != null) {
+ mInlineSuggestionSession.notifyOnFinishInputView(getEditorInfoAutofillId());
+ }
+ }
onFinishInputView(finishingInput);
} else if (mCandidatesViewStarted) {
if (DEBUG) Log.v(TAG, "CALL: onFinishCandidatesView");
@@ -2345,6 +2367,11 @@ public class InputMethodService extends AbstractInputMethodService {
if (mShowInputRequested) {
if (DEBUG) Log.v(TAG, "CALL: onStartInputView");
mInputViewStarted = true;
+ synchronized (mInlineLock) {
+ if (mInlineSuggestionSession != null) {
+ mInlineSuggestionSession.notifyOnStartInputView(getEditorInfoAutofillId());
+ }
+ }
onStartInputView(mInputEditorInfo, restarting);
startExtractingText(true);
} else if (mCandidatesVisibility == View.VISIBLE) {
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 62eff4522d70..38ef814561e6 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -3323,19 +3323,15 @@ public class ConnectivityManager {
// of dependent changes that would conflict throughout the automerger graph. Having this
// temporarily helps with the process of going through with all these dependent changes across
// the entire tree.
- // STOPSHIP (b/148055573) : remove this before R is released.
/**
* @hide
* Register a NetworkAgent with ConnectivityService.
* @return Network corresponding to NetworkAgent.
- * @deprecated use the version that takes a NetworkScore and a provider ID.
*/
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
- @Deprecated
public Network registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkAgentConfig config) {
- final NetworkScore ns = new NetworkScore.Builder().setLegacyScore(score).build();
- return registerNetworkAgent(messenger, ni, lp, nc, ns, config, NetworkProvider.ID_NONE);
+ return registerNetworkAgent(messenger, ni, lp, nc, score, config, NetworkProvider.ID_NONE);
}
/**
@@ -3345,7 +3341,7 @@ public class ConnectivityManager {
*/
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
public Network registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
- NetworkCapabilities nc, NetworkScore score, NetworkAgentConfig config, int providerId) {
+ NetworkCapabilities nc, int score, NetworkAgentConfig config, int providerId) {
try {
return mService.registerNetworkAgent(messenger, ni, lp, nc, score, config, providerId);
} catch (RemoteException e) {
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index d84d05d522c2..14345608e94f 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -26,7 +26,6 @@ import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest;
-import android.net.NetworkScore;
import android.net.NetworkState;
import android.net.ISocketKeepaliveCallback;
import android.net.ProxyInfo;
@@ -164,7 +163,7 @@ interface IConnectivityManager
void declareNetworkRequestUnfulfillable(in NetworkRequest request);
Network registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
- in NetworkCapabilities nc, in NetworkScore score, in NetworkAgentConfig config,
+ in NetworkCapabilities nc, int score, in NetworkAgentConfig config,
in int factorySerialNumber);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index ddf8dbbcb953..7cc569a42b0b 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -117,6 +117,13 @@ public abstract class NetworkAgent {
public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3;
/**
+ * Centralize the place where base network score, and network score scaling, will be
+ * stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE
+ * @hide
+ */
+ public static final int WIFI_BASE_SCORE = 60;
+
+ /**
* Sent by the NetworkAgent to ConnectivityService to pass the current
* network score.
* obj = network score Integer
@@ -265,13 +272,7 @@ public abstract class NetworkAgent {
*/
public static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER = BASE + 17;
- // STOPSHIP (b/148055573) : remove this before R is released.
- private static NetworkScore makeNetworkScore(int score) {
- return new NetworkScore.Builder().setLegacyScore(score).build();
- }
-
/** @hide TODO: remove and replace usage with the public constructor. */
- // STOPSHIP (b/148055573) : remove this before R is released.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score) {
this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE);
@@ -279,7 +280,6 @@ public abstract class NetworkAgent {
}
/** @hide TODO: remove and replace usage with the public constructor. */
- // STOPSHIP (b/148055573) : remove this before R is released.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) {
this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE);
@@ -287,7 +287,6 @@ public abstract class NetworkAgent {
}
/** @hide TODO: remove and replace usage with the public constructor. */
- // STOPSHIP (b/148055573) : remove this before R is released.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, int providerId) {
this(looper, context, logTag, ni, nc, lp, score, null, providerId);
@@ -295,12 +294,10 @@ public abstract class NetworkAgent {
}
/** @hide TODO: remove and replace usage with the public constructor. */
- // STOPSHIP (b/148055573) : remove this before R is released.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config,
int providerId) {
- this(looper, context, logTag, nc, lp, makeNetworkScore(score), config, providerId, ni,
- true /* legacy */);
+ this(looper, context, logTag, nc, lp, score, config, providerId, ni, true /* legacy */);
register();
}
@@ -326,9 +323,8 @@ public abstract class NetworkAgent {
* @param provider the {@link NetworkProvider} managing this agent.
*/
public NetworkAgent(@NonNull Context context, @NonNull Looper looper, @NonNull String logTag,
- @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp,
- @NonNull NetworkScore score, @NonNull NetworkAgentConfig config,
- @Nullable NetworkProvider provider) {
+ @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int score,
+ @NonNull NetworkAgentConfig config, @Nullable NetworkProvider provider) {
this(looper, context, logTag, nc, lp, score, config,
provider == null ? NetworkProvider.ID_NONE : provider.getProviderId(),
getLegacyNetworkInfo(config), false /* legacy */);
@@ -338,12 +334,12 @@ public abstract class NetworkAgent {
public final Context context;
public final NetworkCapabilities capabilities;
public final LinkProperties properties;
- public final NetworkScore score;
+ public final int score;
public final NetworkAgentConfig config;
public final NetworkInfo info;
InitialConfiguration(@NonNull Context context, @NonNull NetworkCapabilities capabilities,
- @NonNull LinkProperties properties, @NonNull NetworkScore score,
- @NonNull NetworkAgentConfig config, @NonNull NetworkInfo info) {
+ @NonNull LinkProperties properties, int score, @NonNull NetworkAgentConfig config,
+ @NonNull NetworkInfo info) {
this.context = context;
this.capabilities = capabilities;
this.properties = properties;
@@ -355,7 +351,7 @@ public abstract class NetworkAgent {
private volatile InitialConfiguration mInitialConfiguration;
private NetworkAgent(@NonNull Looper looper, @NonNull Context context, @NonNull String logTag,
- @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, NetworkScore score,
+ @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int score,
@NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni,
boolean legacy) {
mHandler = new NetworkAgentHandler(looper);
@@ -650,8 +646,22 @@ public abstract class NetworkAgent {
* Must be called by the agent to update the score of this network.
* @param score the new score.
*/
- public void sendNetworkScore(@NonNull final NetworkScore score) {
- queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, score);
+ public void sendNetworkScore(int score) {
+ if (score < 0) {
+ throw new IllegalArgumentException("Score must be >= 0");
+ }
+ final NetworkScore ns = new NetworkScore();
+ ns.putIntExtension(NetworkScore.LEGACY_SCORE, score);
+ updateScore(ns);
+ }
+
+ /**
+ * Must be called by the agent when it has a new {@link NetworkScore} for this network.
+ * @param ns the new score.
+ * @hide TODO: unhide the NetworkScore class, and rename to sendNetworkScore.
+ */
+ public void updateScore(@NonNull NetworkScore ns) {
+ queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new NetworkScore(ns));
}
/**
diff --git a/core/java/android/net/NetworkScore.aidl b/core/java/android/net/NetworkScore.aidl
deleted file mode 100644
index be9a98b24e74..000000000000
--- a/core/java/android/net/NetworkScore.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2020, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net;
-
-parcelable NetworkScore;
diff --git a/core/java/android/net/NetworkScore.java b/core/java/android/net/NetworkScore.java
index ae17378cfc4c..13f2994110a1 100644
--- a/core/java/android/net/NetworkScore.java
+++ b/core/java/android/net/NetworkScore.java
@@ -15,18 +15,12 @@
*/
package android.net;
-import android.annotation.IntDef;
-import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
@@ -34,392 +28,57 @@ import java.util.Objects;
*
* A NetworkScore object represents the characteristics of a network that affects how good the
* network is considered for a particular use.
- *
- * This class is not thread-safe.
* @hide
*/
-@TestApi
-@SystemApi
public final class NetworkScore implements Parcelable {
- /** An object containing scoring-relevant metrics for a network. */
- public static class Metrics {
- /** Value meaning the latency is unknown. */
- public static final int LATENCY_UNKNOWN = -1;
-
- /** Value meaning the bandwidth is unknown. */
- public static final int BANDWIDTH_UNKNOWN = -1;
-
- /**
- * Round-trip delay in milliseconds to the relevant destination for this Metrics object.
- *
- * LATENCY_UNKNOWN if unknown.
- */
- @IntRange(from = LATENCY_UNKNOWN)
- public final int latencyMs;
-
- /**
- * Downlink in kB/s with the relevant destination for this Metrics object.
- *
- * BANDWIDTH_UNKNOWN if unknown. If directional bandwidth is unknown, up and downlink
- * bandwidth can have the same value.
- */
- @IntRange(from = BANDWIDTH_UNKNOWN)
- public final int downlinkBandwidthKBps;
- /**
- * Uplink in kB/s with the relevant destination for this Metrics object.
- *
- * BANDWIDTH_UNKNOWN if unknown. If directional bandwidth is unknown, up and downlink
- * bandwidth can have the same value.
- */
- @IntRange(from = BANDWIDTH_UNKNOWN)
- public final int uplinkBandwidthKBps;
-
- /** Constructor */
- public Metrics(@IntRange(from = LATENCY_UNKNOWN) final int latency,
- @IntRange(from = BANDWIDTH_UNKNOWN) final int downlinkBandwidth,
- @IntRange(from = BANDWIDTH_UNKNOWN) final int uplinkBandwidth) {
- latencyMs = latency;
- downlinkBandwidthKBps = downlinkBandwidth;
- uplinkBandwidthKBps = uplinkBandwidth;
- }
-
- /** toString */
- public String toString() {
- return "latency = " + latencyMs + " downlinkBandwidth = " + downlinkBandwidthKBps
- + "uplinkBandwidth = " + uplinkBandwidthKBps;
- }
-
- @NonNull
- public static final Metrics EMPTY =
- new Metrics(LATENCY_UNKNOWN, BANDWIDTH_UNKNOWN, BANDWIDTH_UNKNOWN);
- }
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, prefix = "POLICY_", value = {
- POLICY_LOCKDOWN_VPN,
- POLICY_VPN,
- POLICY_IGNORE_ON_WIFI,
- POLICY_DEFAULT_SUBSCRIPTION
- })
- public @interface Policy {
- }
-
- /**
- * This network is a VPN with lockdown enabled.
- *
- * If a network with this bit is present in the list of candidates and not connected,
- * no network can satisfy the request.
- */
- public static final int POLICY_LOCKDOWN_VPN = 1 << 0;
-
- /**
- * This network is a VPN.
- *
- * If a network with this bit is present and the request UID is included in the UID ranges
- * of this network, it outscores all other networks without this bit.
- */
- public static final int POLICY_VPN = 1 << 1;
-
- /**
- * This network should not be used if a previously validated WiFi network is available.
- *
- * If a network with this bit is present and a previously validated WiFi is present too, the
- * network with this bit is outscored by it. This stays true if the WiFi network
- * becomes unvalidated : this network will not be considered.
- */
- public static final int POLICY_IGNORE_ON_WIFI = 1 << 2;
-
- /**
- * This network is the default subscription for this transport.
- *
- * If a network with this bit is present, other networks of the same transport without this
- * bit are outscored by it. A device with two active subscriptions and a setting
- * to decide the default one would have this policy bit on the network for the default
- * subscription so that when both are active at the same time, the device chooses the
- * network associated with the default subscription rather than the one with the best link
- * quality (which will happen if policy doesn't dictate otherwise).
- */
- public static final int POLICY_DEFAULT_SUBSCRIPTION = 1 << 3;
-
- /**
- * Policy bits for this network. Filled in by the NetworkAgent.
- */
- private final int mPolicy;
-
- /**
- * Predicted metrics to the gateway (it contains latency and bandwidth to the gateway).
- * This is filled by the NetworkAgent with the theoretical values of the link if available,
- * although they may fill it with predictions from historical data if available.
- * Note that while this member cannot be null, any and all of its members can be unknown.
- */
+ // The key of bundle which is used to get the legacy network score of NetworkAgentInfo.
+ // TODO: Remove this when the transition to NetworkScore is over.
+ public static final String LEGACY_SCORE = "LEGACY_SCORE";
@NonNull
- private final Metrics mLinkLayerMetrics;
-
- /**
- * Predicted metrics to representative servers.
- * This is filled by connectivity with (if available) a best-effort estimate of the performance
- * information to servers the user connects to in similar circumstances, and predicted from
- * actual measurements if possible.
- * Note that while this member cannot be null, any and all of its members can be unknown.
- */
- @NonNull
- private final Metrics mEndToEndMetrics;
-
- /** Value meaning the signal strength is unknown. */
- public static final int UNKNOWN_SIGNAL_STRENGTH = -1;
-
- /** The smallest meaningful signal strength. */
- public static final int MIN_SIGNAL_STRENGTH = 0;
-
- /** The largest meaningful signal strength. */
- public static final int MAX_SIGNAL_STRENGTH = 1000;
-
- /**
- * User-visible measure of the strength of the signal normalized 1~1000.
- * This represents a measure of the signal strength for this network.
- * If unknown, this has value UNKNOWN_SIGNAL_STRENGTH.
- */
- // A good way to populate this value is to fill it with the number of bars displayed in
- // the system UI, scaled 0 to 1000. This is what the user sees and it makes sense to them.
- // Cellular for example could quantize the ASU value (see SignalStrength#getAsuValue) into
- // this, while WiFi could scale the RSSI (see WifiManager#calculateSignalLevel).
- @IntRange(from = UNKNOWN_SIGNAL_STRENGTH, to = MAX_SIGNAL_STRENGTH)
- private final int mSignalStrength;
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, prefix = "RANGE_", value = {
- RANGE_UNKNOWN, RANGE_CLOSE, RANGE_SHORT, RANGE_MEDIUM, RANGE_LONG
- })
- public @interface Range {
- }
-
- /**
- * The range of this network is not known.
- * This can be used by VPN the range of which depends on the range of the underlying network.
- */
- public static final int RANGE_UNKNOWN = 0;
-
- /**
- * This network typically only operates at close range, like an NFC beacon.
- */
- public static final int RANGE_CLOSE = 1;
-
- /**
- * This network typically operates at a range of a few meters to a few dozen meters, like WiFi.
- */
- public static final int RANGE_SHORT = 2;
-
- /**
- * This network typically operates at a range of a few dozen to a few hundred meters, like CBRS.
- */
- public static final int RANGE_MEDIUM = 3;
-
- /**
- * This network typically offers continuous connectivity up to many kilometers away, like LTE.
- */
- public static final int RANGE_LONG = 4;
+ private final Bundle mExtensions;
- /**
- * The typical range of this networking technology.
- *
- * This is one of the RANGE_* constants and is filled by the NetworkAgent.
- * This may be useful when evaluating how desirable a network is, because for two networks that
- * have equivalent performance and cost, the one that won't lose IP continuity when the user
- * moves is probably preferable.
- * Agents should fill this with the largest typical range this technology provides. See the
- * descriptions of the individual constants for guidance.
- *
- * If unknown, this is set to RANGE_UNKNOWN.
- */
- @Range private final int mRange;
-
- /**
- * A prediction of whether this network is likely to be unusable in a few seconds.
- *
- * NetworkAgents set this to true to mean they are aware that usability is limited due to
- * low signal strength, congestion, or other reasons, and indicates that the system should
- * only use this network as a last resort. An example would be a WiFi network when the device
- * is about to move outside of range.
- *
- * This is filled by the NetworkAgent. Agents that don't know whether this network is likely
- * to be unusable soon should set this to false.
- */
- private final boolean mExiting;
-
- /**
- * The legacy score, as a migration strategy from Q to R.
- * STOPSHIP : remove this before R ships.
- */
- private final int mLegacyScore;
-
- /**
- * Create a new NetworkScore object.
- */
- private NetworkScore(@Policy final int policy, @Nullable final Metrics l2Perf,
- @Nullable final Metrics e2ePerf,
- @IntRange(from = UNKNOWN_SIGNAL_STRENGTH, to = MAX_SIGNAL_STRENGTH)
- final int signalStrength,
- @Range final int range, final boolean exiting, final int legacyScore) {
- mPolicy = policy;
- mLinkLayerMetrics = null != l2Perf ? l2Perf : Metrics.EMPTY;
- mEndToEndMetrics = null != e2ePerf ? e2ePerf : Metrics.EMPTY;
- mSignalStrength = signalStrength;
- mRange = range;
- mExiting = exiting;
- mLegacyScore = legacyScore;
+ public NetworkScore() {
+ mExtensions = new Bundle();
}
- /**
- * Utility function to return a copy of this with a different exiting value.
- */
- @NonNull public NetworkScore withExiting(final boolean exiting) {
- return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToEndMetrics,
- mSignalStrength, mRange, exiting, mLegacyScore);
+ public NetworkScore(@NonNull NetworkScore source) {
+ mExtensions = new Bundle(source.mExtensions);
}
/**
- * Utility function to return a copy of this with a different signal strength.
+ * Put the value of parcelable inside the bundle by key.
*/
- @NonNull public NetworkScore withSignalStrength(
- @IntRange(from = UNKNOWN_SIGNAL_STRENGTH) final int signalStrength) {
- return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToEndMetrics,
- signalStrength, mRange, mExiting, mLegacyScore);
+ public void putExtension(@Nullable String key, @Nullable Parcelable value) {
+ mExtensions.putParcelable(key, value);
}
/**
- * Returns whether this network has a particular policy flag.
- * @param policy the policy, as one of the POLICY_* constants.
+ * Put the value of int inside the bundle by key.
*/
- public boolean hasPolicy(@Policy final int policy) {
- return 0 != (mPolicy & policy);
+ public void putIntExtension(@Nullable String key, int value) {
+ mExtensions.putInt(key, value);
}
/**
- * Returns the Metrics representing the performance of the link layer.
- *
- * This contains the theoretical performance of the link, if available.
- * Note that while this function cannot return null, any and/or all of the members of the
- * returned object can be null if unknown.
+ * Get the value of non primitive type by key.
*/
- @NonNull public Metrics getLinkLayerMetrics() {
- return mLinkLayerMetrics;
+ public <T extends Parcelable> T getExtension(@Nullable String key) {
+ return mExtensions.getParcelable(key);
}
/**
- * Returns the Metrics representing the end-to-end performance of the network.
- *
- * This contains the end-to-end performance of the link, if available.
- * Note that while this function cannot return null, any and/or all of the members of the
- * returned object can be null if unknown.
+ * Get the value of int by key.
*/
- @NonNull public Metrics getEndToEndMetrics() {
- return mEndToEndMetrics;
+ public int getIntExtension(@Nullable String key) {
+ return mExtensions.getInt(key);
}
/**
- * Returns the signal strength of this network normalized 0~1000, or UNKNOWN_SIGNAL_STRENGTH.
+ * Remove the entry by given key.
*/
- @IntRange(from = UNKNOWN_SIGNAL_STRENGTH, to = MAX_SIGNAL_STRENGTH)
- public int getSignalStrength() {
- return mSignalStrength;
- }
-
- /**
- * Returns the typical range of this network technology as one of the RANGE_* constants.
- */
- @Range public int getRange() {
- return mRange;
- }
-
- /** Returns a prediction of whether this network is likely to be unusable in a few seconds. */
- public boolean isExiting() {
- return mExiting;
- }
-
- /**
- * Get the legacy score.
- * @hide
- */
- public int getLegacyScore() {
- return mLegacyScore;
- }
-
- /** Builder for NetworkScore. */
- public static class Builder {
- private int mPolicy = 0;
- @NonNull
- private Metrics mLinkLayerMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
- Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
- @NonNull
- private Metrics mEndToMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
- Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
- private int mSignalStrength = UNKNOWN_SIGNAL_STRENGTH;
- private int mRange = RANGE_UNKNOWN;
- private boolean mExiting = false;
- private int mLegacyScore = 0;
- @NonNull private Bundle mExtensions = new Bundle();
-
- /** Create a new builder. */
- public Builder() { }
-
- /** Add a policy flag. */
- @NonNull public Builder addPolicy(@Policy final int policy) {
- mPolicy |= policy;
- return this;
- }
-
- /** Clear a policy flag */
- @NonNull public Builder clearPolicy(@Policy final int policy) {
- mPolicy &= ~policy;
- return this;
- }
-
- /** Set the link layer metrics. */
- @NonNull public Builder setLinkLayerMetrics(@NonNull final Metrics linkLayerMetrics) {
- mLinkLayerMetrics = linkLayerMetrics;
- return this;
- }
-
- /** Set the end-to-end metrics. */
- @NonNull public Builder setEndToEndMetrics(@NonNull final Metrics endToEndMetrics) {
- mEndToMetrics = endToEndMetrics;
- return this;
- }
-
- /** Set the signal strength. */
- @NonNull public Builder setSignalStrength(
- @IntRange(from = UNKNOWN_SIGNAL_STRENGTH, to = MAX_SIGNAL_STRENGTH)
- final int signalStrength) {
- mSignalStrength = signalStrength;
- return this;
- }
-
- /** Set the range. */
- @NonNull public Builder setRange(@Range final int range) {
- mRange = range;
- return this;
- }
-
- /** Set whether this network is exiting. */
- @NonNull public Builder setExiting(final boolean exiting) {
- mExiting = exiting;
- return this;
- }
-
- /** Add a parcelable extension. */
- @NonNull public Builder setLegacyScore(final int legacyScore) {
- mLegacyScore = legacyScore;
- return this;
- }
-
- /** Build the NetworkScore object represented by this builder. */
- @NonNull public NetworkScore build() {
- return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToMetrics,
- mSignalStrength, mRange, mExiting, mLegacyScore);
- }
+ public void removeExtension(@Nullable String key) {
+ mExtensions.remove(key);
}
@Override
@@ -429,17 +88,9 @@ public final class NetworkScore implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeInt(mPolicy);
- dest.writeInt(mLinkLayerMetrics.latencyMs);
- dest.writeInt(mLinkLayerMetrics.downlinkBandwidthKBps);
- dest.writeInt(mLinkLayerMetrics.uplinkBandwidthKBps);
- dest.writeInt(mEndToEndMetrics.latencyMs);
- dest.writeInt(mEndToEndMetrics.downlinkBandwidthKBps);
- dest.writeInt(mEndToEndMetrics.uplinkBandwidthKBps);
- dest.writeInt(mSignalStrength);
- dest.writeInt(mRange);
- dest.writeBoolean(mExiting);
- dest.writeInt(mLegacyScore);
+ synchronized (this) {
+ dest.writeBundle(mExtensions);
+ }
}
public static final @NonNull Creator<NetworkScore> CREATOR = new Creator<NetworkScore>() {
@@ -455,52 +106,57 @@ public final class NetworkScore implements Parcelable {
};
private NetworkScore(@NonNull Parcel in) {
- mPolicy = in.readInt();
- mLinkLayerMetrics = new Metrics(in.readInt(), in.readInt(), in.readInt());
- mEndToEndMetrics = new Metrics(in.readInt(), in.readInt(), in.readInt());
- mSignalStrength = in.readInt();
- mRange = in.readInt();
- mExiting = in.readBoolean();
- mLegacyScore = in.readInt();
+ mExtensions = in.readBundle();
}
+ // TODO: Modify this method once new fields are added into this class.
@Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof NetworkScore)) {
return false;
}
final NetworkScore other = (NetworkScore) obj;
- return mPolicy == other.mPolicy
- && mLinkLayerMetrics.latencyMs == other.mLinkLayerMetrics.latencyMs
- && mLinkLayerMetrics.uplinkBandwidthKBps
- == other.mLinkLayerMetrics.uplinkBandwidthKBps
- && mEndToEndMetrics.latencyMs == other.mEndToEndMetrics.latencyMs
- && mEndToEndMetrics.uplinkBandwidthKBps
- == other.mEndToEndMetrics.uplinkBandwidthKBps
- && mSignalStrength == other.mSignalStrength
- && mRange == other.mRange
- && mExiting == other.mExiting
- && mLegacyScore == other.mLegacyScore;
+ return bundlesEqual(mExtensions, other.mExtensions);
}
@Override
public int hashCode() {
- return Objects.hash(mPolicy,
- mLinkLayerMetrics.latencyMs, mLinkLayerMetrics.uplinkBandwidthKBps,
- mEndToEndMetrics.latencyMs, mEndToEndMetrics.uplinkBandwidthKBps,
- mSignalStrength, mRange, mExiting, mLegacyScore);
+ int result = 29;
+ for (String key : mExtensions.keySet()) {
+ final Object value = mExtensions.get(key);
+ // The key may be null, so call Objects.hash() is safer.
+ result += 31 * value.hashCode() + 37 * Objects.hash(key);
+ }
+ return result;
+ }
+
+ // mExtensions won't be null since the constructor will create it.
+ private boolean bundlesEqual(@NonNull Bundle bundle1, @NonNull Bundle bundle2) {
+ if (bundle1 == bundle2) {
+ return true;
+ }
+
+ // This is unlikely but it's fine to add this clause here.
+ if (null == bundle1 || null == bundle2) {
+ return false;
+ }
+
+ if (bundle1.size() != bundle2.size()) {
+ return false;
+ }
+
+ for (String key : bundle1.keySet()) {
+ final Object value1 = bundle1.get(key);
+ final Object value2 = bundle2.get(key);
+ if (!Objects.equals(value1, value2)) {
+ return false;
+ }
+ }
+ return true;
}
/** Convert to a string */
public String toString() {
- return "NetworkScore ["
- + "Policy = " + mPolicy
- + " LinkLayerMetrics = " + mLinkLayerMetrics
- + " EndToEndMetrics = " + mEndToEndMetrics
- + " SignalStrength = " + mSignalStrength
- + " Range = " + mRange
- + " Exiting = " + mExiting
- + " LegacyScore = " + mLegacyScore
- + "]";
+ return "NetworkScore[" + mExtensions.toString() + "]";
}
}
diff --git a/core/java/android/os/incremental/V4Signature.java b/core/java/android/os/incremental/V4Signature.java
index 17adfc8a05d9..6d334f539fc9 100644
--- a/core/java/android/os/incremental/V4Signature.java
+++ b/core/java/android/os/incremental/V4Signature.java
@@ -16,12 +16,12 @@
package android.os.incremental;
+import android.os.ParcelFileDescriptor;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
/**
@@ -41,11 +41,12 @@ public class V4Signature {
/**
* Construct a V4Signature from .idsig file.
*/
- public static V4Signature readFrom(File file) {
- try (DataInputStream stream = new DataInputStream(new FileInputStream(file))) {
+ public static V4Signature readFrom(ParcelFileDescriptor pfd) throws IOException {
+ final ParcelFileDescriptor dupedFd = pfd.dup();
+ final ParcelFileDescriptor.AutoCloseInputStream fdInputStream =
+ new ParcelFileDescriptor.AutoCloseInputStream(dupedFd);
+ try (DataInputStream stream = new DataInputStream(fdInputStream)) {
return readFrom(stream);
- } catch (IOException e) {
- return null;
}
}
diff --git a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
index 210f95f55a9f..101165176293 100644
--- a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
+++ b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
@@ -17,7 +17,7 @@
package android.service.autofill;
import android.os.IBinder;
-import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
/**
* Interface to receive events from inline suggestions.
@@ -26,7 +26,7 @@ import android.view.SurfaceControl;
*/
oneway interface IInlineSuggestionUiCallback {
void onAutofill();
- void onContent(in SurfaceControl surface);
+ void onContent(in SurfaceControlViewHost.SurfacePackage surface);
void onError();
void onTransferTouchFocusToImeWindow(in IBinder sourceInputToken, int displayId);
}
diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java
index fcdefac3163b..ee15283715ff 100644
--- a/core/java/android/service/autofill/InlineSuggestionRenderService.java
+++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java
@@ -32,7 +32,6 @@ import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import android.view.Display;
-import android.view.SurfaceControl;
import android.view.SurfaceControlViewHost;
import android.view.View;
import android.view.WindowManager;
@@ -104,14 +103,14 @@ public abstract class InlineSuggestionRenderService extends Service {
}
});
- sendResult(callback, host.getSurfacePackage().getSurfaceControl());
+ sendResult(callback, host.getSurfacePackage());
} finally {
updateDisplay(Display.DEFAULT_DISPLAY);
}
}
private void sendResult(@NonNull IInlineSuggestionUiCallback callback,
- @Nullable SurfaceControl surface) {
+ @Nullable SurfaceControlViewHost.SurfacePackage surface) {
try {
callback.onContent(surface);
} catch (RemoteException e) {
diff --git a/core/java/android/telephony/CellBroadcastIntents.java b/core/java/android/telephony/CellBroadcastIntents.java
index 921ad3c74681..e07f69a98a85 100644
--- a/core/java/android/telephony/CellBroadcastIntents.java
+++ b/core/java/android/telephony/CellBroadcastIntents.java
@@ -46,7 +46,11 @@ public class CellBroadcastIntents {
/**
* Broadcast intent action for notifying area information has been updated. The information
- * can be retrieved by {@link CellBroadcastService#getCellBroadcastAreaInfo(int)}
+ * can be retrieved by {@link CellBroadcastService#getCellBroadcastAreaInfo(int)}. The
+ * associated SIM slot index of updated area information can be retrieved through the extra
+ * {@link SubscriptionManager#EXTRA_SLOT_INDEX}.
+ *
+ * @see SubscriptionManager#EXTRA_SLOT_INDEX
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_AREA_INFO_UPDATED =
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 4196b5512dac..cfbe393bfcc8 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -63,7 +63,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false");
DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false");
DEFAULT_FLAGS.put("settings_skip_direction_mutable", "true");
- DEFAULT_FLAGS.put(SETTINGS_WIFITRACKER2, "false");
+ DEFAULT_FLAGS.put(SETTINGS_WIFITRACKER2, "true");
DEFAULT_FLAGS.put("settings_controller_loading_enhancement", "false");
DEFAULT_FLAGS.put("settings_conditionals", "false");
DEFAULT_FLAGS.put(NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "true");
diff --git a/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
index b36888e23f9c..04be71f2babc 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
@@ -17,22 +17,13 @@
package android.util.apk;
import static android.util.apk.ApkSigningBlockUtils.CONTENT_DIGEST_VERITY_CHUNKED_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_DSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_ECDSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_ECDSA_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PSS_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PSS_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_DSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_ECDSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256;
import static android.util.apk.ApkSigningBlockUtils.compareSignatureAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getContentDigestAlgorithmJcaDigestAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getLengthPrefixedSlice;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmContentDigestAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmJcaKeyAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmJcaSignatureAlgorithm;
+import static android.util.apk.ApkSigningBlockUtils.isSupportedSignatureAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.readLengthPrefixedByteArray;
import android.util.ArrayMap;
@@ -428,24 +419,6 @@ public class ApkSignatureSchemeV2Verifier {
}
}
- private static boolean isSupportedSignatureAlgorithm(int sigAlgorithm) {
- switch (sigAlgorithm) {
- case SIGNATURE_RSA_PSS_WITH_SHA256:
- case SIGNATURE_RSA_PSS_WITH_SHA512:
- case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA256:
- case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA512:
- case SIGNATURE_ECDSA_WITH_SHA256:
- case SIGNATURE_ECDSA_WITH_SHA512:
- case SIGNATURE_DSA_WITH_SHA256:
- case SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256:
- case SIGNATURE_VERITY_ECDSA_WITH_SHA256:
- case SIGNATURE_VERITY_DSA_WITH_SHA256:
- return true;
- default:
- return false;
- }
- }
-
/**
* Verified APK Signature Scheme v2 signer.
*
diff --git a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
index 602e6df3e34f..abd04cc2b0e7 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
@@ -17,22 +17,13 @@
package android.util.apk;
import static android.util.apk.ApkSigningBlockUtils.CONTENT_DIGEST_VERITY_CHUNKED_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_DSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_ECDSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_ECDSA_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PSS_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_RSA_PSS_WITH_SHA512;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_DSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_ECDSA_WITH_SHA256;
-import static android.util.apk.ApkSigningBlockUtils.SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256;
import static android.util.apk.ApkSigningBlockUtils.compareSignatureAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getContentDigestAlgorithmJcaDigestAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getLengthPrefixedSlice;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmContentDigestAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmJcaKeyAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.getSignatureAlgorithmJcaSignatureAlgorithm;
+import static android.util.apk.ApkSigningBlockUtils.isSupportedSignatureAlgorithm;
import static android.util.apk.ApkSigningBlockUtils.readLengthPrefixedByteArray;
import android.os.Build;
@@ -552,24 +543,6 @@ public class ApkSignatureSchemeV3Verifier {
}
}
- private static boolean isSupportedSignatureAlgorithm(int sigAlgorithm) {
- switch (sigAlgorithm) {
- case SIGNATURE_RSA_PSS_WITH_SHA256:
- case SIGNATURE_RSA_PSS_WITH_SHA512:
- case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA256:
- case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA512:
- case SIGNATURE_ECDSA_WITH_SHA256:
- case SIGNATURE_ECDSA_WITH_SHA512:
- case SIGNATURE_DSA_WITH_SHA256:
- case SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256:
- case SIGNATURE_VERITY_ECDSA_WITH_SHA256:
- case SIGNATURE_VERITY_DSA_WITH_SHA256:
- return true;
- default:
- return false;
- }
- }
-
/**
* Verified processed proof of rotation.
*
diff --git a/core/java/android/util/apk/ApkSigningBlockUtils.java b/core/java/android/util/apk/ApkSigningBlockUtils.java
index 87af5364c945..4fe8515143a0 100644
--- a/core/java/android/util/apk/ApkSigningBlockUtils.java
+++ b/core/java/android/util/apk/ApkSigningBlockUtils.java
@@ -124,6 +124,24 @@ final class ApkSigningBlockUtils {
}
}
+ static boolean isSupportedSignatureAlgorithm(int sigAlgorithm) {
+ switch (sigAlgorithm) {
+ case SIGNATURE_RSA_PSS_WITH_SHA256:
+ case SIGNATURE_RSA_PSS_WITH_SHA512:
+ case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA256:
+ case SIGNATURE_RSA_PKCS1_V1_5_WITH_SHA512:
+ case SIGNATURE_ECDSA_WITH_SHA256:
+ case SIGNATURE_ECDSA_WITH_SHA512:
+ case SIGNATURE_DSA_WITH_SHA256:
+ case SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256:
+ case SIGNATURE_VERITY_ECDSA_WITH_SHA256:
+ case SIGNATURE_VERITY_DSA_WITH_SHA256:
+ return true;
+ default:
+ return false;
+ }
+ }
+
private static void verifyIntegrityFor1MbChunkBasedAlgorithm(
Map<Integer, byte[]> expectedDigests,
FileDescriptor apkFileDescriptor,
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 3047385410b0..c0d61d473971 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -32,6 +32,7 @@ import android.hardware.display.DeviceProductInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.Process;
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.proto.ProtoOutputStream;
@@ -604,14 +605,9 @@ public final class DisplayInfo implements Parcelable {
StringBuilder sb = new StringBuilder();
sb.append("DisplayInfo{\"");
sb.append(name);
- sb.append(", displayId ");
+ sb.append("\", displayId ");
sb.append(displayId);
- sb.append("\", uniqueId \"");
- sb.append(uniqueId);
- sb.append("\", app ");
- sb.append(appWidth);
- sb.append(" x ");
- sb.append(appHeight);
+ sb.append(flagsToString(flags));
sb.append(", real ");
sb.append(logicalWidth);
sb.append(" x ");
@@ -624,22 +620,38 @@ public final class DisplayInfo implements Parcelable {
sb.append(smallestNominalAppWidth);
sb.append(" x ");
sb.append(smallestNominalAppHeight);
+ sb.append(", appVsyncOff ");
+ sb.append(appVsyncOffsetNanos);
+ sb.append(", presDeadline ");
+ sb.append(presentationDeadlineNanos);
sb.append(", mode ");
sb.append(modeId);
sb.append(", defaultMode ");
sb.append(defaultModeId);
sb.append(", modes ");
sb.append(Arrays.toString(supportedModes));
- sb.append(", colorMode ");
- sb.append(colorMode);
- sb.append(", supportedColorModes ");
- sb.append(Arrays.toString(supportedColorModes));
sb.append(", hdrCapabilities ");
sb.append(hdrCapabilities);
sb.append(", minimalPostProcessingSupported ");
sb.append(minimalPostProcessingSupported);
sb.append(", rotation ");
sb.append(rotation);
+ sb.append(", state ");
+ sb.append(Display.stateToString(state));
+
+ if (Process.myUid() != Process.SYSTEM_UID) {
+ sb.append("}");
+ return sb.toString();
+ }
+
+ sb.append(", type ");
+ sb.append(Display.typeToString(type));
+ sb.append(", uniqueId \"");
+ sb.append(uniqueId);
+ sb.append("\", app ");
+ sb.append(appWidth);
+ sb.append(" x ");
+ sb.append(appHeight);
sb.append(", density ");
sb.append(logicalDensityDpi);
sb.append(" (");
@@ -648,24 +660,19 @@ public final class DisplayInfo implements Parcelable {
sb.append(physicalYDpi);
sb.append(") dpi, layerStack ");
sb.append(layerStack);
- sb.append(", appVsyncOff ");
- sb.append(appVsyncOffsetNanos);
- sb.append(", presDeadline ");
- sb.append(presentationDeadlineNanos);
- sb.append(", type ");
- sb.append(Display.typeToString(type));
+ sb.append(", colorMode ");
+ sb.append(colorMode);
+ sb.append(", supportedColorModes ");
+ sb.append(Arrays.toString(supportedColorModes));
if (address != null) {
sb.append(", address ").append(address);
}
sb.append(", deviceProductInfo ");
sb.append(deviceProductInfo);
- sb.append(", state ");
- sb.append(Display.stateToString(state));
if (ownerUid != 0 || ownerPackageName != null) {
sb.append(", owner ").append(ownerPackageName);
sb.append(" (uid ").append(ownerUid).append(")");
}
- sb.append(flagsToString(flags));
sb.append(", removeMode ");
sb.append(removeMode);
sb.append("}");
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java
index 9247f4a29bdd..9a53a43d906a 100644
--- a/core/java/android/view/InsetsAnimationControlImpl.java
+++ b/core/java/android/view/InsetsAnimationControlImpl.java
@@ -76,8 +76,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
private boolean mFinished;
private boolean mCancelled;
private boolean mShownOnFinish;
- private float mCurrentAlpha;
- private float mPendingAlpha;
+ private float mCurrentAlpha = 1.0f;
+ private float mPendingAlpha = 1.0f;
@VisibleForTesting
public InsetsAnimationControlImpl(SparseArray<InsetsSourceControl> controls, Rect frame,
@@ -153,7 +153,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
}
mPendingFraction = sanitize(fraction);
mPendingInsets = sanitize(insets);
- mPendingAlpha = 1 - sanitize(alpha);
+ mPendingAlpha = sanitize(alpha);
mController.scheduleApplyChangeInsets();
}
@@ -182,7 +182,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
mController.applySurfaceParams(params.toArray(new SurfaceParams[params.size()]));
mCurrentInsets = mPendingInsets;
mAnimation.setFraction(mPendingFraction);
- mCurrentAlpha = 1 - alphaOffset;
+ mCurrentAlpha = mPendingAlpha;
+ mAnimation.setAlpha(mPendingAlpha);
if (mFinished) {
mController.notifyFinished(this, mShownOnFinish);
}
@@ -238,7 +239,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
private Insets getInsetsFromState(InsetsState state, Rect frame,
@Nullable @InternalInsetsSide SparseIntArray typeSideMap) {
- return state.calculateInsets(frame, false /* isScreenRound */,
+ return state.calculateInsets(frame, null /* ignoringVisibilityState */,
+ false /* isScreenRound */,
false /* alwaysConsumeSystemBars */, null /* displayCutout */,
null /* legacyContentInsets */, null /* legacyStableInsets */,
LayoutParams.SOFT_INPUT_ADJUST_RESIZE /* legacySoftInputMode*/,
@@ -257,8 +259,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
return alpha >= 1 ? 1 : (alpha <= 0 ? 0 : alpha);
}
- private void updateLeashesForSide(@InternalInsetsSide int side, int offset, int inset,
- int maxInset, ArrayList<SurfaceParams> surfaceParams, InsetsState state, Float alpha) {
+ private void updateLeashesForSide(@InternalInsetsSide int side, int offset, int maxInset,
+ int inset, ArrayList<SurfaceParams> surfaceParams, InsetsState state, Float alpha) {
ArraySet<InsetsSourceControl> items = mSideSourceMap.get(side);
if (items == null) {
return;
@@ -273,12 +275,13 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
mTmpFrame.set(source.getFrame());
addTranslationToMatrix(side, offset, mTmpMatrix, mTmpFrame);
+ state.getSource(source.getType()).setVisible(side == ISIDE_FLOATING || inset != 0);
state.getSource(source.getType()).setFrame(mTmpFrame);
// If the system is controlling the insets source, the leash can be null.
if (leash != null) {
// TODO: use a better interpolation for fade.
- alpha = mFade ? ((float) maxInset / inset * 0.3f + 0.7f) : alpha;
+ alpha = mFade ? ((float) inset / maxInset * 0.3f + 0.7f) : alpha;
surfaceParams.add(new SurfaceParams(leash, side == ISIDE_FLOATING ? 1 : alpha,
mTmpMatrix, null /* windowCrop */, 0 /* layer */, 0f /* cornerRadius*/,
side == ISIDE_FLOATING ? state.getSource(source.getType()).isVisible()
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index 4cb8e1388858..573d8fc65c84 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -233,6 +233,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
final InsetsAnimationControlImpl control;
final @AnimationType int type;
+
+ /**
+ * Whether {@link WindowInsetsAnimation.Callback#onStart(WindowInsetsAnimation, Bounds)} has
+ * been dispatched already for this animation.
+ */
+ boolean startDispatched;
}
/**
@@ -276,9 +282,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
private final SparseArray<InsetsSourceControl> mTmpControlArray = new SparseArray<>();
private final ArrayList<RunningAnimation> mRunningAnimations = new ArrayList<>();
- private final ArrayList<WindowInsetsAnimation> mRunningInsetsAnimations = new ArrayList<>();
- private final List<WindowInsetsAnimation> mUnmodifiableRunningInsetsAnimations =
- Collections.unmodifiableList(mRunningInsetsAnimations);
+ private final ArrayList<WindowInsetsAnimation> mTmpRunningAnims = new ArrayList<>();
+ private final List<WindowInsetsAnimation> mUnmodifiableTmpRunningAnims =
+ Collections.unmodifiableList(mTmpRunningAnims);
private final ArrayList<InsetsAnimationControlImpl> mTmpFinishedControls = new ArrayList<>();
private WindowInsets mLastInsets;
@@ -294,6 +300,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
private int mLastLegacySoftInputMode;
private int mLastLegacySystemUiFlags;
+ private DisplayCutout mLastDisplayCutout;
private boolean mStartingAnimation;
private SyncRtSurfaceTransactionApplier mApplier;
@@ -329,20 +336,28 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
}
mTmpFinishedControls.clear();
+ mTmpRunningAnims.clear();
InsetsState state = new InsetsState(mState, true /* copySources */);
for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
- InsetsAnimationControlImpl control = mRunningAnimations.get(i).control;
+ RunningAnimation runningAnimation = mRunningAnimations.get(i);
+ InsetsAnimationControlImpl control = runningAnimation.control;
+
+ // Keep track of running animation to be dispatched. Aggregate it here such that if
+ // it gets finished within applyChangeInsets we still dispatch it to onProgress.
+ if (runningAnimation.startDispatched) {
+ mTmpRunningAnims.add(control.getAnimation());
+ }
if (control.applyChangeInsets(state)) {
mTmpFinishedControls.add(control);
}
}
- WindowInsets insets = state.calculateInsets(mFrame, mLastInsets.isRound(),
- mLastInsets.shouldAlwaysConsumeSystemBars(), mLastInsets.getDisplayCutout(),
- mLastLegacyContentInsets, mLastLegacyStableInsets, mLastLegacySoftInputMode,
- mLastLegacySystemUiFlags, null /* typeSideMap */);
+ WindowInsets insets = state.calculateInsets(mFrame, mState /* ignoringVisibilityState*/,
+ mLastInsets.isRound(), mLastInsets.shouldAlwaysConsumeSystemBars(),
+ mLastDisplayCutout, mLastLegacyContentInsets, mLastLegacyStableInsets,
+ mLastLegacySoftInputMode, mLastLegacySystemUiFlags, null /* typeSideMap */);
mViewRoot.mView.dispatchWindowInsetsAnimationProgress(insets,
- mUnmodifiableRunningInsetsAnimations);
+ mUnmodifiableTmpRunningAnims);
for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) {
dispatchAnimationEnd(mTmpFinishedControls.get(i).getAnimation());
@@ -394,8 +409,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
mLastLegacyStableInsets.set(legacyStableInsets);
mLastLegacySoftInputMode = legacySoftInputMode;
mLastLegacySystemUiFlags = legacySystemUiFlags;
- mLastInsets = mState.calculateInsets(mFrame, isScreenRound, alwaysConsumeSystemBars, cutout,
- legacyContentInsets, legacyStableInsets, legacySoftInputMode, legacySystemUiFlags,
+ mLastDisplayCutout = cutout;
+ mLastInsets = mState.calculateInsets(mFrame, null /* ignoringVisibilityState*/,
+ isScreenRound, alwaysConsumeSystemBars, cutout, legacyContentInsets,
+ legacyStableInsets, legacySoftInputMode, legacySystemUiFlags,
null /* typeSideMap */);
return mLastInsets;
}
@@ -584,7 +601,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
frame, mState, listener, typesReady, this, durationMs, interpolator, fade,
layoutInsetsDuringAnimation, animationType);
mRunningAnimations.add(new RunningAnimation(controller, animationType));
- mRunningInsetsAnimations.add(controller.getAnimation());
cancellationSignal.setOnCancelListener(controller::onCancelled);
return cancellationSignal;
}
@@ -736,7 +752,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
if (mRunningAnimations.get(i).control == control) {
mRunningAnimations.remove(i);
- mRunningInsetsAnimations.remove(i);
break;
}
}
@@ -903,6 +918,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
if (controller.isCancelled()) {
return true;
}
+ for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
+ RunningAnimation runningAnimation = mRunningAnimations.get(i);
+ if (runningAnimation.control == controller) {
+ runningAnimation.startDispatched = true;
+ }
+ }
mViewRoot.mView.dispatchWindowInsetsAnimationStart(animation, bounds);
mStartingAnimation = true;
listener.onReady(controller, types);
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 6d07a13091bd..92ac4259c349 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -160,7 +160,8 @@ public class InsetsSourceConsumer {
}
boolean applyLocalVisibilityOverride() {
- final boolean isVisible = mState.getSource(mType).isVisible();
+ InsetsSource source = mState.peekSource(mType);
+ final boolean isVisible = source != null && source.isVisible();
final boolean hasControl = mSourceControl != null;
// We still need to let the legacy app know the visibility change even if we don't have the
diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java
index c877c454be91..b740c58ec15f 100644
--- a/core/java/android/view/InsetsState.java
+++ b/core/java/android/view/InsetsState.java
@@ -147,10 +147,13 @@ public class InsetsState implements Parcelable {
* Calculates {@link WindowInsets} based on the current source configuration.
*
* @param frame The frame to calculate the insets relative to.
+ * @param ignoringVisibilityState {@link InsetsState} used to calculate
+ * {@link WindowInsets#getInsetsIgnoringVisibility(int)} information, or pass
+ * {@code null} to use this state to calculate that information.
* @return The calculated insets.
*/
- public WindowInsets calculateInsets(Rect frame, boolean isScreenRound,
- boolean alwaysConsumeSystemBars, DisplayCutout cutout,
+ public WindowInsets calculateInsets(Rect frame, @Nullable InsetsState ignoringVisibilityState,
+ boolean isScreenRound, boolean alwaysConsumeSystemBars, DisplayCutout cutout,
@Nullable Rect legacyContentInsets, @Nullable Rect legacyStableInsets,
int legacySoftInputMode, int legacySystemUiFlags,
@Nullable @InternalInsetsSide SparseIntArray typeSideMap) {
@@ -188,8 +191,15 @@ public class InsetsState implements Parcelable {
// IME won't be reported in max insets as the size depends on the EditorInfo of the IME
// target.
if (source.getType() != ITYPE_IME) {
- processSource(source, relativeFrameMax, true /* ignoreVisibility */,
- typeMaxInsetsMap, null /* typeSideMap */, null /* typeVisibilityMap */);
+ InsetsSource ignoringVisibilitySource = ignoringVisibilityState != null
+ ? ignoringVisibilityState.getSource(type)
+ : source;
+ if (ignoringVisibilitySource == null) {
+ continue;
+ }
+ processSource(ignoringVisibilitySource, relativeFrameMax,
+ true /* ignoreVisibility */, typeMaxInsetsMap, null /* typeSideMap */,
+ null /* typeVisibilityMap */);
}
}
final int softInputAdjustMode = legacySoftInputMode & SOFT_INPUT_MASK_ADJUST;
@@ -297,6 +307,10 @@ public class InsetsState implements Parcelable {
return mSources.computeIfAbsent(type, InsetsSource::new);
}
+ public @Nullable InsetsSource peekSource(@InternalInsetsType int type) {
+ return mSources.get(type);
+ }
+
public void setDisplayFrame(Rect frame) {
mDisplayFrame.set(frame);
}
diff --git a/core/java/android/view/PendingInsetsController.java b/core/java/android/view/PendingInsetsController.java
new file mode 100644
index 000000000000..c0ed9359c613
--- /dev/null
+++ b/core/java/android/view/PendingInsetsController.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.os.CancellationSignal;
+import android.view.WindowInsets.Type.InsetsType;
+import android.view.animation.Interpolator;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+
+/**
+ * An insets controller that keeps track of pending requests. This is such that an app can freely
+ * use {@link WindowInsetsController} before the view root is attached during activity startup.
+ * @hide
+ */
+public class PendingInsetsController implements WindowInsetsController {
+
+ private static final int KEEP_BEHAVIOR = -1;
+ private final ArrayList<PendingRequest> mRequests = new ArrayList<>();
+ private @Appearance int mAppearance;
+ private @Appearance int mAppearanceMask;
+ private @Behavior int mBehavior = KEEP_BEHAVIOR;
+ private final InsetsState mDummyState = new InsetsState();
+ private InsetsController mReplayedInsetsController;
+
+ @Override
+ public void show(int types) {
+ if (mReplayedInsetsController != null) {
+ mReplayedInsetsController.show(types);
+ } else {
+ mRequests.add(new ShowRequest(types));
+ }
+ }
+
+ @Override
+ public void hide(int types) {
+ if (mReplayedInsetsController != null) {
+ mReplayedInsetsController.hide(types);
+ } else {
+ mRequests.add(new HideRequest(types));
+ }
+ }
+
+ @Override
+ public CancellationSignal controlWindowInsetsAnimation(int types, long durationMillis,
+ Interpolator interpolator,
+ WindowInsetsAnimationControlListener listener) {
+ if (mReplayedInsetsController != null) {
+ return mReplayedInsetsController.controlWindowInsetsAnimation(types, durationMillis,
+ interpolator, listener);
+ } else {
+ listener.onCancelled();
+ CancellationSignal cancellationSignal = new CancellationSignal();
+ cancellationSignal.cancel();
+ return cancellationSignal;
+ }
+ }
+
+ @Override
+ public void setSystemBarsAppearance(int appearance, int mask) {
+ if (mReplayedInsetsController != null) {
+ mReplayedInsetsController.setSystemBarsAppearance(appearance, mask);
+ } else {
+ mAppearance = (mAppearance & ~mask) | (appearance & mask);
+ mAppearanceMask |= mask;
+ }
+ }
+
+ @Override
+ public int getSystemBarsAppearance() {
+ if (mReplayedInsetsController != null) {
+ return mReplayedInsetsController.getSystemBarsAppearance();
+ }
+ return mAppearance;
+ }
+
+ @Override
+ public void setSystemBarsBehavior(int behavior) {
+ if (mReplayedInsetsController != null) {
+ mReplayedInsetsController.setSystemBarsBehavior(behavior);
+ } else {
+ mBehavior = behavior;
+ }
+ }
+
+ @Override
+ public int getSystemBarsBehavior() {
+ if (mReplayedInsetsController != null) {
+ return mReplayedInsetsController.getSystemBarsBehavior();
+ }
+ return mBehavior;
+ }
+
+ @Override
+ public InsetsState getState() {
+ return mDummyState;
+ }
+
+ /**
+ * Replays the commands on {@code controller} and attaches it to this instance such that any
+ * calls will be forwarded to the real instance in the future.
+ */
+ @VisibleForTesting
+ public void replayAndAttach(InsetsController controller) {
+ if (mBehavior != KEEP_BEHAVIOR) {
+ controller.setSystemBarsBehavior(mBehavior);
+ }
+ if (mAppearanceMask != 0) {
+ controller.setSystemBarsAppearance(mAppearance, mAppearanceMask);
+ }
+ int size = mRequests.size();
+ for (int i = 0; i < size; i++) {
+ mRequests.get(i).replay(controller);
+ }
+
+ // Reset all state so it doesn't get applied twice just in case
+ mRequests.clear();
+ mBehavior = KEEP_BEHAVIOR;
+ mAppearance = 0;
+ mAppearanceMask = 0;
+
+ // After replaying, we forward everything directly to the replayed instance.
+ mReplayedInsetsController = controller;
+ }
+
+ /**
+ * Detaches the controller to no longer forward calls to the real instance.
+ */
+ @VisibleForTesting
+ public void detach() {
+ mReplayedInsetsController = null;
+ }
+
+ private interface PendingRequest {
+ void replay(InsetsController controller);
+ }
+
+ private static class ShowRequest implements PendingRequest {
+
+ private final @InsetsType int mTypes;
+
+ public ShowRequest(int types) {
+ mTypes = types;
+ }
+
+ @Override
+ public void replay(InsetsController controller) {
+ controller.show(mTypes);
+ }
+ }
+
+ private static class HideRequest implements PendingRequest {
+
+ private final @InsetsType int mTypes;
+
+ public HideRequest(int types) {
+ mTypes = types;
+ }
+
+ @Override
+ public void replay(InsetsController controller) {
+ controller.hide(mTypes);
+ }
+ }
+}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index e9f10c190c0a..25f5609d9922 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -420,6 +420,9 @@ public final class SurfaceControl implements Parcelable {
if (mNativeObject != 0) {
release();
}
+ if (nativeObject != 0) {
+ mCloseGuard.open("release");
+ }
mNativeObject = nativeObject;
}
@@ -867,14 +870,12 @@ public final class SurfaceControl implements Parcelable {
private SurfaceControl(Parcel in) {
readFromParcel(in);
- mCloseGuard.open("release");
}
/**
* @hide
*/
public SurfaceControl() {
- mCloseGuard.open("release");
}
public void readFromParcel(Parcel in) {
@@ -972,8 +973,8 @@ public final class SurfaceControl implements Parcelable {
if (mNativeObject != 0) {
nativeRelease(mNativeObject);
mNativeObject = 0;
+ mCloseGuard.close();
}
- mCloseGuard.close();
}
/**
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 53e8b527e928..6236e6ea31e9 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11415,14 +11415,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Retrieves the single {@link WindowInsetsController} of the window this view is attached to.
*
- * @return The {@link WindowInsetsController} or {@code null} if the view isn't attached to a
- * a window.
+ * @return The {@link WindowInsetsController} or {@code null} if the view is neither attached to
+ * a window nor a view tree with a decor.
* @see Window#getInsetsController()
*/
public @Nullable WindowInsetsController getWindowInsetsController() {
if (mAttachInfo != null) {
return mAttachInfo.mViewRootImpl.getInsetsController();
}
+ ViewParent parent = getParent();
+ if (parent instanceof View) {
+ return ((View) parent).getWindowInsetsController();
+ }
return null;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 36257d9f5fd9..229143a71d57 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -793,7 +793,12 @@ public final class ViewRootImpl implements ViewParent,
public void setOnContentApplyWindowInsetsListener(OnContentApplyWindowInsetsListener listener) {
mAttachInfo.mContentOnApplyWindowInsetsListener = listener;
- requestFitSystemWindows();
+
+ // System windows will be fitted on first traversal, so no reason to request additional
+ // (possibly getting executed after the first traversal).
+ if (!mFirst) {
+ requestFitSystemWindows();
+ }
}
public void addWindowCallbacks(WindowCallbacks callback) {
@@ -1112,6 +1117,14 @@ public final class ViewRootImpl implements ViewParent,
mFirstInputStage = nativePreImeStage;
mFirstPostImeInputStage = earlyPostImeStage;
mPendingInputEventQueueLengthCounterName = "aq:pending:" + counterSuffix;
+
+ if (mView instanceof RootViewSurfaceTaker) {
+ PendingInsetsController pendingInsetsController =
+ ((RootViewSurfaceTaker) mView).providePendingInsetsController();
+ if (pendingInsetsController != null) {
+ pendingInsetsController.replayAndAttach(mInsetsController);
+ }
+ }
}
}
}
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 20fa5cab0464..fde184ccfb0e 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -858,11 +858,21 @@ public final class WindowInsets {
/**
* Returns a copy of this instance inset in the given directions.
*
+ * This is intended for dispatching insets to areas of the window that are smaller than the
+ * current area.
+ *
+ * <p>Example:
+ * <pre>
+ * childView.dispatchApplyWindowInsets(insets.inset(childMargins));
+ * </pre>
+ *
+ * @param insets the amount of insets to remove from all sides.
+ *
* @see #inset(int, int, int, int)
- * @hide
*/
@NonNull
- public WindowInsets inset(Insets insets) {
+ public WindowInsets inset(@NonNull Insets insets) {
+ Objects.requireNonNull(insets);
return inset(insets.left, insets.top, insets.right, insets.bottom);
}
@@ -884,6 +894,8 @@ public final class WindowInsets {
* @param bottom the amount of insets to remove from the bottom. Must be non-negative.
*
* @return the inset insets
+ *
+ * @see #inset(Insets)
*/
@NonNull
public WindowInsets inset(@IntRange(from = 0) int left, @IntRange(from = 0) int top,
diff --git a/core/java/android/view/WindowInsetsAnimation.java b/core/java/android/view/WindowInsetsAnimation.java
index 396da4acb5bc..e32648809f8f 100644
--- a/core/java/android/view/WindowInsetsAnimation.java
+++ b/core/java/android/view/WindowInsetsAnimation.java
@@ -264,6 +264,11 @@ public final class WindowInsetsAnimation {
WindowInsets.insetInsets(
mUpperBound, insets.left, insets.top, insets.right, insets.bottom));
}
+
+ @Override
+ public String toString() {
+ return "Bounds{lower=" + mLowerBound + " upper=" + mUpperBound + "}";
+ }
}
/**
diff --git a/core/java/android/view/inline/InlineContentView.java b/core/java/android/view/inline/InlineContentView.java
index b143fad778ec..2a8ca0b6a354 100644
--- a/core/java/android/view/inline/InlineContentView.java
+++ b/core/java/android/view/inline/InlineContentView.java
@@ -19,8 +19,7 @@ package android.view.inline;
import android.annotation.NonNull;
import android.content.Context;
import android.graphics.PixelFormat;
-import android.view.SurfaceControl;
-import android.view.SurfaceHolder;
+import android.view.SurfaceControlViewHost;
import android.view.SurfaceView;
/**
@@ -30,31 +29,10 @@ import android.view.SurfaceView;
*/
public class InlineContentView extends SurfaceView {
public InlineContentView(@NonNull Context context,
- @NonNull SurfaceControl surfaceControl) {
+ @NonNull SurfaceControlViewHost.SurfacePackage surfacePackage) {
super(context);
setZOrderOnTop(true);
- getHolder().addCallback(new SurfaceHolder.Callback() {
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- holder.setFormat(PixelFormat.TRANSPARENT);
- new SurfaceControl.Transaction()
- .reparent(surfaceControl, getSurfaceControl())
- .setVisibility(surfaceControl, /* visible */ true)
- .apply();
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- // TODO(b/137800469): implement this.
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- new SurfaceControl.Transaction()
- .setVisibility(surfaceControl, false)
- .reparent(surfaceControl, null)
- .apply();
- }
- });
+ setChildSurfacePackage(surfacePackage);
+ getHolder().setFormat(PixelFormat.TRANSPARENT);
}
}
diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java
index 6815509b6f2e..07fef76961f9 100644
--- a/core/java/android/view/inputmethod/EditorInfo.java
+++ b/core/java/android/view/inputmethod/EditorInfo.java
@@ -431,8 +431,7 @@ public class EditorInfo implements InputType, Parcelable {
* <p> Marked as hide since it's only used by framework.</p>
* @hide
*/
- @NonNull
- public AutofillId autofillId = new AutofillId(View.NO_ID);
+ public AutofillId autofillId;
/**
* Identifier for the editor's field. This is optional, and may be
@@ -832,7 +831,7 @@ public class EditorInfo implements InputType, Parcelable {
TextUtils.writeToParcel(hintText, dest, flags);
TextUtils.writeToParcel(label, dest, flags);
dest.writeString(packageName);
- autofillId.writeToParcel(dest, flags);
+ dest.writeParcelable(autofillId, flags);
dest.writeInt(fieldId);
dest.writeString(fieldName);
dest.writeBundle(extras);
@@ -864,7 +863,7 @@ public class EditorInfo implements InputType, Parcelable {
res.hintText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
res.label = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
res.packageName = source.readString();
- res.autofillId = AutofillId.CREATOR.createFromParcel(source);
+ res.autofillId = source.readParcelable(AutofillId.class.getClassLoader());
res.fieldId = source.readInt();
res.fieldName = source.readString();
res.extras = source.readBundle();
diff --git a/core/java/android/view/inputmethod/InlineSuggestion.java b/core/java/android/view/inputmethod/InlineSuggestion.java
index ec485d3b3522..650061396992 100644
--- a/core/java/android/view/inputmethod/InlineSuggestion.java
+++ b/core/java/android/view/inputmethod/InlineSuggestion.java
@@ -27,7 +27,7 @@ import android.os.Parcelable;
import android.os.RemoteException;
import android.util.Size;
import android.util.Slog;
-import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
import android.view.View;
import android.view.inline.InlineContentView;
import android.view.inline.InlinePresentationSpec;
@@ -151,7 +151,7 @@ public final class InlineSuggestion implements Parcelable {
}
@Override
- public void onContent(SurfaceControl content) {
+ public void onContent(SurfaceControlViewHost.SurfacePackage content) {
final InlineContentCallbackImpl callbackImpl = mCallbackImpl.get();
if (callbackImpl != null) {
callbackImpl.onContent(content);
@@ -173,7 +173,7 @@ public final class InlineSuggestion implements Parcelable {
mCallback = callback;
}
- public void onContent(SurfaceControl content) {
+ public void onContent(SurfaceControlViewHost.SurfacePackage content) {
if (content == null) {
mCallbackExecutor.execute(() -> mCallback.accept(/* view */null));
} else {
diff --git a/core/java/com/android/internal/content/om/OverlayConfig.java b/core/java/com/android/internal/content/om/OverlayConfig.java
index 72f16e4e4a82..2b08a773b6e7 100644
--- a/core/java/com/android/internal/content/om/OverlayConfig.java
+++ b/core/java/com/android/internal/content/om/OverlayConfig.java
@@ -186,6 +186,13 @@ public class OverlayConfig {
*/
@NonNull
public static OverlayConfig getZygoteInstance() {
+ if (Process.myUid() != Process.ROOT_UID) {
+ // Scan the overlays in the zygote process to generate configuration settings for
+ // overlays on the system image. Do not cache this instance so OverlayConfig will not
+ // be present in applications by default.
+ throw new IllegalStateException("Can only be invoked in the root process");
+ }
+
Trace.traceBegin(Trace.TRACE_TAG_RRO, "OverlayConfig#getZygoteInstance");
try {
return new OverlayConfig(null /* rootDirectory */, OverlayScanner::new,
@@ -202,12 +209,13 @@ public class OverlayConfig {
*/
@NonNull
public static OverlayConfig initializeSystemInstance(PackageProvider packageProvider) {
- Trace.traceBegin(Trace.TRACE_TAG_RRO, "OverlayConfig#initializeSystemInstance");
- try {
- sInstance = new OverlayConfig(null, null, packageProvider);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_RRO);
+ if (Process.myUid() != Process.SYSTEM_UID) {
+ throw new IllegalStateException("Can only be invoked in the system process");
}
+
+ Trace.traceBegin(Trace.TRACE_TAG_RRO, "OverlayConfig#initializeSystemInstance");
+ sInstance = new OverlayConfig(null, null, packageProvider);
+ Trace.traceEnd(Trace.TRACE_TAG_RRO);
return sInstance;
}
@@ -232,20 +240,26 @@ public class OverlayConfig {
/**
* Returns whether the overlay is enabled by default.
- * Overlays that are not configured are disabled by default mutable.
+ * Overlays that are not configured are disabled by default.
+ *
+ * If an immutable overlay has its enabled state change, the new enabled state is applied to the
+ * overlay.
+ *
+ * When a mutable is first seen by the OverlayManagerService, the default-enabled state will be
+ * applied to the overlay. If the configured default-enabled state changes in a subsequent boot,
+ * the default-enabled state will not be applied to the overlay.
+ *
+ * The configured enabled state will only be applied when:
+ * <ul>
+ * <li> The device is factory reset
+ * <li> The overlay is removed from the device and added back to the device in a future OTA
+ * <li> The overlay changes its package name
+ * <li> The overlay changes its target package name or target overlayable name
+ * <li> An immutable overlay becomes mutable
+ * </ul>
*/
public boolean isEnabled(String packageName) {
final Configuration config = mConfigurations.get(packageName);
-
- // STOPSHIP(149499802): Enabling a mutable overlay currently has no effect. Either implement
- // some behavior for default-enabled, mutable overlays or prevent parsing of the enabled
- // attribute on overlays that are mutable.
- if (config != null && config.parsedConfig.mutable) {
- Log.w(TAG, "Default-enabled configuration for mutable overlay "
- + config.parsedConfig.packageName + " has no effect");
- return OverlayConfigParser.DEFAULT_ENABLED_STATE;
- }
-
return config == null? OverlayConfigParser.DEFAULT_ENABLED_STATE
: config.parsedConfig.enabled;
}
@@ -365,6 +379,10 @@ public class OverlayConfig {
*/
@NonNull
public String[] createImmutableFrameworkIdmapsInZygote() {
+ if (Process.myUid() != Process.ROOT_UID) {
+ throw new IllegalStateException("This method can only be called from the root process");
+ }
+
final String targetPath = "/system/framework/framework-res.apk";
final ArrayList<String> idmapPaths = new ArrayList<>();
final ArrayList<IdmapInvocation> idmapInvocations =
diff --git a/core/java/com/android/internal/logging/InstanceId.java b/core/java/com/android/internal/logging/InstanceId.java
index c90d851201a2..85643fcffa2f 100644
--- a/core/java/com/android/internal/logging/InstanceId.java
+++ b/core/java/com/android/internal/logging/InstanceId.java
@@ -48,17 +48,6 @@ public final class InstanceId implements Parcelable {
return mId;
}
- /**
- * Create a fake instance ID for testing purposes. Not for production use. See also
- * InstanceIdSequenceFake, which is a testing replacement for InstanceIdSequence.
- * @param id The ID you want to assign.
- * @return new InstanceId.
- */
- @VisibleForTesting
- public static InstanceId fakeInstanceId(int id) {
- return new InstanceId(id);
- }
-
@Override
public int hashCode() {
return mId;
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 36025e324203..51b73fc674e7 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -78,6 +78,7 @@ import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.InputQueue;
import android.view.InsetsState;
+import android.view.InsetsController;
import android.view.InsetsState.InternalInsetsType;
import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup;
@@ -85,6 +86,7 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.PendingInsetsController;
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewGroup;
@@ -286,6 +288,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
*/
private boolean mUseNewInsetsApi;
+ private PendingInsetsController mPendingInsetsController = new PendingInsetsController();
+
DecorView(Context context, int featureId, PhoneWindow window,
WindowManager.LayoutParams params) {
super(context);
@@ -1780,6 +1784,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
getViewRootImpl().removeWindowCallbacks(this);
mWindowResizeCallbacksAdded = false;
}
+
+ mPendingInsetsController.detach();
}
@Override
@@ -1819,6 +1825,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
updateColorViewTranslations();
}
+ @Override
+ public PendingInsetsController providePendingInsetsController() {
+ return mPendingInsetsController;
+ }
+
private ActionMode createActionMode(
int type, ActionMode.Callback2 callback, View originatingView) {
switch (type) {
@@ -2540,6 +2551,15 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
}
@Override
+ public WindowInsetsController getWindowInsetsController() {
+ if (isAttachedToWindow()) {
+ return super.getWindowInsetsController();
+ } else {
+ return mPendingInsetsController;
+ }
+ }
+
+ @Override
public String toString() {
return "DecorView@" + Integer.toHexString(this.hashCode()) + "["
+ getTitleSuffix(mWindow.getAttributes()) + "]";
diff --git a/core/java/com/android/internal/util/Parcelling.java b/core/java/com/android/internal/util/Parcelling.java
index 6258a6956b09..7f567b948eb2 100644
--- a/core/java/com/android/internal/util/Parcelling.java
+++ b/core/java/com/android/internal/util/Parcelling.java
@@ -167,6 +167,33 @@ public interface Parcelling<T> {
}
}
+ class ForStringSet implements Parcelling<Set<String>> {
+ @Override
+ public void parcel(Set<String> item, Parcel dest, int parcelFlags) {
+ if (item == null) {
+ dest.writeInt(-1);
+ } else {
+ dest.writeInt(item.size());
+ for (String string : item) {
+ dest.writeString(string);
+ }
+ }
+ }
+
+ @Override
+ public Set<String> unparcel(Parcel source) {
+ final int size = source.readInt();
+ if (size < 0) {
+ return emptySet();
+ }
+ Set<String> set = new ArraySet<>();
+ for (int count = 0; count < size; count++) {
+ set.add(source.readString());
+ }
+ return set;
+ }
+ }
+
class ForInternedStringSet implements Parcelling<Set<String>> {
@Override
public void parcel(Set<String> item, Parcel dest, int parcelFlags) {
diff --git a/core/java/com/android/internal/view/IInlineSuggestionsRequestCallback.aidl b/core/java/com/android/internal/view/IInlineSuggestionsRequestCallback.aidl
index 6b5491013f00..46da4749a582 100644
--- a/core/java/com/android/internal/view/IInlineSuggestionsRequestCallback.aidl
+++ b/core/java/com/android/internal/view/IInlineSuggestionsRequestCallback.aidl
@@ -16,6 +16,7 @@
package com.android.internal.view;
+import android.view.autofill.AutofillId;
import android.view.inputmethod.InlineSuggestionsRequest;
import com.android.internal.view.IInlineSuggestionsResponseCallback;
@@ -27,5 +28,8 @@ import com.android.internal.view.IInlineSuggestionsResponseCallback;
oneway interface IInlineSuggestionsRequestCallback {
void onInlineSuggestionsUnsupported();
void onInlineSuggestionsRequest(in InlineSuggestionsRequest request,
- in IInlineSuggestionsResponseCallback callback);
+ in IInlineSuggestionsResponseCallback callback, in AutofillId imeFieldId,
+ boolean inputViewStarted);
+ void onInputMethodStartInputView(in AutofillId imeFieldId);
+ void onInputMethodFinishInputView(in AutofillId imeFieldId);
}
diff --git a/core/java/com/android/internal/view/RootViewSurfaceTaker.java b/core/java/com/android/internal/view/RootViewSurfaceTaker.java
index 433ec730749c..efd5fb2e1edf 100644
--- a/core/java/com/android/internal/view/RootViewSurfaceTaker.java
+++ b/core/java/com/android/internal/view/RootViewSurfaceTaker.java
@@ -15,8 +15,11 @@
*/
package com.android.internal.view;
+import android.annotation.Nullable;
import android.view.InputQueue;
+import android.view.PendingInsetsController;
import android.view.SurfaceHolder;
+import android.view.WindowInsetsController;
/** hahahah */
public interface RootViewSurfaceTaker {
@@ -26,4 +29,5 @@ public interface RootViewSurfaceTaker {
void setSurfaceKeepScreenOn(boolean keepOn);
InputQueue.Callback willYouTakeTheInputQueue();
void onRootViewScrollYChanged(int scrollY);
+ @Nullable PendingInsetsController providePendingInsetsController();
}
diff --git a/core/java/com/android/internal/view/inline/IInlineContentCallback.aidl b/core/java/com/android/internal/view/inline/IInlineContentCallback.aidl
index 8cc49ca210be..29bdf5661eaf 100644
--- a/core/java/com/android/internal/view/inline/IInlineContentCallback.aidl
+++ b/core/java/com/android/internal/view/inline/IInlineContentCallback.aidl
@@ -16,12 +16,12 @@
package com.android.internal.view.inline;
-import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
/**
* Binder interface to send the inline content from one process to the other.
* {@hide}
*/
oneway interface IInlineContentCallback {
- void onContent(in SurfaceControl content);
+ void onContent(in SurfaceControlViewHost.SurfacePackage content);
}
diff --git a/core/proto/android/stats/style/style_enums.proto b/core/proto/android/stats/style/style_enums.proto
index 5b64d1ef5d4f..f3f491ff34cd 100644
--- a/core/proto/android/stats/style/style_enums.proto
+++ b/core/proto/android/stats/style/style_enums.proto
@@ -36,6 +36,8 @@ enum Action {
LIVE_WALLPAPER_DELETE_SUCCESS = 14;
LIVE_WALLPAPER_DELETE_FAILED = 15;
LIVE_WALLPAPER_APPLIED = 16;
+ LIVE_WALLPAPER_INFO_SELECT = 17;
+ LIVE_WALLPAPER_CUSTOMIZE_SELECT = 18;
}
enum LocationPreference {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 60621022ad26..885117018c50 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -522,6 +522,7 @@
<protected-broadcast android:name="com.android.server.telecom.intent.action.CALLS_ADD_ENTRY" />
<protected-broadcast android:name="com.android.settings.location.MODE_CHANGING" />
<protected-broadcast android:name="com.android.settings.bluetooth.ACTION_DISMISS_PAIRING" />
+ <protected-broadcast android:name="com.android.settings.wifi.action.NETWORK_REQUEST" />
<protected-broadcast android:name="NotificationManagerService.TIMEOUT" />
<protected-broadcast android:name="ScheduleConditionProvider.EVALUATE" />
diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java
index 79ac2b77dda5..1d8e0a3186e8 100644
--- a/core/tests/coretests/src/android/view/InsetsStateTest.java
+++ b/core/tests/coretests/src/android/view/InsetsStateTest.java
@@ -72,8 +72,8 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
SparseIntArray typeSideMap = new SparseIntArray();
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, typeSideMap);
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false,
+ false, DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, typeSideMap);
assertEquals(Insets.of(0, 100, 0, 100), insets.getSystemWindowInsets());
assertEquals(Insets.of(0, 100, 0, 100), insets.getInsets(Type.all()));
assertEquals(ISIDE_TOP, typeSideMap.get(ITYPE_STATUS_BAR));
@@ -91,8 +91,8 @@ public class InsetsStateTest {
mState.getSource(ITYPE_NAVIGATION_BAR).setVisible(true);
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 100, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, null);
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false,
+ false, DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, null);
assertEquals(100, insets.getStableInsetBottom());
assertEquals(Insets.of(0, 0, 0, 100), insets.getInsetsIgnoringVisibility(Type.systemBars()));
assertEquals(Insets.of(0, 0, 0, 200), insets.getSystemWindowInsets());
@@ -110,8 +110,8 @@ public class InsetsStateTest {
mState.getSource(ITYPE_STATUS_BAR).setVisible(true);
mState.getSource(ITYPE_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300));
mState.getSource(ITYPE_NAVIGATION_BAR).setVisible(true);
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, 0, 0, null);
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false,
+ false, DisplayCutout.NO_CUTOUT, null, null, 0, 0, null);
assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets());
assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.statusBars()));
assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(Type.navigationBars()));
@@ -126,8 +126,8 @@ public class InsetsStateTest {
mState.getSource(ITYPE_STATUS_BAR).setVisible(true);
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING, 0, null);
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false,
+ false, DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING, 0, null);
assertEquals(0, insets.getSystemWindowInsetBottom());
assertEquals(100, insets.getInsets(ime()).bottom);
assertTrue(insets.isVisible(ime()));
@@ -142,11 +142,11 @@ public class InsetsStateTest {
mState.getSource(ITYPE_STATUS_BAR).setVisible(false);
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING,
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false,
+ false, DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING,
SYSTEM_UI_FLAG_LAYOUT_STABLE, null);
assertEquals(100, insets.getSystemWindowInsetTop());
- insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
+ insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false,
DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING,
0 /* legacySystemUiFlags */, null);
assertEquals(0, insets.getSystemWindowInsetTop());
@@ -160,7 +160,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
mState.removeSource(ITYPE_IME);
- WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false,
DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, null);
assertEquals(0, insets.getSystemWindowInsetBottom());
}
diff --git a/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java
new file mode 100644
index 000000000000..9787b7780702
--- /dev/null
+++ b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static android.view.WindowInsets.Type.navigationBars;
+import static android.view.WindowInsets.Type.systemBars;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
+import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.os.CancellationSignal;
+import android.platform.test.annotations.Presubmit;
+import android.view.animation.LinearInterpolator;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import androidx.test.runner.AndroidJUnit4;
+
+/**
+ * Tests for {@link PendingInsetsControllerTest}.
+ *
+ * <p>Build/Install/Run:
+ * atest FrameworksCoreTests:PendingInsetsControllerTest
+ *
+ * <p>This test class is a part of Window Manager Service tests and specified in
+ * {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
+ */
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class PendingInsetsControllerTest {
+
+ private PendingInsetsController mPendingInsetsController = new PendingInsetsController();
+ private InsetsController mReplayedController;
+
+ @Before
+ public void setUp() {
+ mPendingInsetsController = new PendingInsetsController();
+ mReplayedController = mock(InsetsController.class);
+ }
+
+ @Test
+ public void testShow() {
+ mPendingInsetsController.show(systemBars());
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ verify(mReplayedController).show(eq(systemBars()));
+ }
+
+ @Test
+ public void testShow_direct() {
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.show(systemBars());
+ verify(mReplayedController).show(eq(systemBars()));
+ }
+
+ @Test
+ public void testHide() {
+ mPendingInsetsController.hide(systemBars());
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ verify(mReplayedController).hide(eq(systemBars()));
+ }
+
+ @Test
+ public void testHide_direct() {
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.hide(systemBars());
+ verify(mReplayedController).hide(eq(systemBars()));
+ }
+
+ @Test
+ public void testControl() {
+ WindowInsetsAnimationControlListener listener =
+ mock(WindowInsetsAnimationControlListener.class);
+ CancellationSignal signal = mPendingInsetsController.controlWindowInsetsAnimation(
+ systemBars(), 0, new LinearInterpolator(), listener);
+ verify(listener).onCancelled();
+ assertTrue(signal.isCanceled());
+ }
+
+ @Test
+ public void testControl_direct() {
+ WindowInsetsAnimationControlListener listener =
+ mock(WindowInsetsAnimationControlListener.class);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.controlWindowInsetsAnimation(
+ systemBars(), 0L, new LinearInterpolator(), listener);
+ verify(mReplayedController).controlWindowInsetsAnimation(eq(systemBars()), eq(0L), any(),
+ eq(listener));
+ }
+
+ @Test
+ public void testBehavior() {
+ mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ verify(mReplayedController).setSystemBarsBehavior(
+ eq(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE));
+ }
+
+ @Test
+ public void testBehavior_direct() {
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ verify(mReplayedController).setSystemBarsBehavior(
+ eq(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE));
+ }
+
+ @Test
+ public void testBehavior_direct_get() {
+ when(mReplayedController.getSystemBarsBehavior())
+ .thenReturn(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ assertEquals(mPendingInsetsController.getSystemBarsBehavior(),
+ BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ }
+
+ @Test
+ public void testAppearance() {
+ mPendingInsetsController.setSystemBarsAppearance(
+ APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ verify(mReplayedController).setSystemBarsAppearance(eq(APPEARANCE_LIGHT_STATUS_BARS),
+ eq(APPEARANCE_LIGHT_STATUS_BARS));
+ }
+
+ @Test
+ public void testAppearance_direct() {
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.setSystemBarsAppearance(
+ APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+ verify(mReplayedController).setSystemBarsAppearance(eq(APPEARANCE_LIGHT_STATUS_BARS),
+ eq(APPEARANCE_LIGHT_STATUS_BARS));
+ }
+
+ @Test
+ public void testAppearance_direct_get() {
+ when(mReplayedController.getSystemBarsAppearance())
+ .thenReturn(APPEARANCE_LIGHT_STATUS_BARS);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ assertEquals(mPendingInsetsController.getSystemBarsAppearance(),
+ APPEARANCE_LIGHT_STATUS_BARS);
+ }
+
+ @Test
+ public void testReplayTwice() {
+ mPendingInsetsController.show(systemBars());
+ mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ mPendingInsetsController.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS,
+ APPEARANCE_LIGHT_STATUS_BARS);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ InsetsController secondController = mock(InsetsController.class);
+ mPendingInsetsController.replayAndAttach(secondController);
+ verify(mReplayedController).show(eq(systemBars()));
+ verifyZeroInteractions(secondController);
+ }
+
+ @Test
+ public void testDetachReattach() {
+ mPendingInsetsController.show(systemBars());
+ mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+ mPendingInsetsController.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS,
+ APPEARANCE_LIGHT_STATUS_BARS);
+ mPendingInsetsController.replayAndAttach(mReplayedController);
+ mPendingInsetsController.detach();
+ mPendingInsetsController.show(navigationBars());
+ InsetsController secondController = mock(InsetsController.class);
+ mPendingInsetsController.replayAndAttach(secondController);
+
+ verify(mReplayedController).show(eq(systemBars()));
+ verify(secondController).show(eq(navigationBars()));
+ }
+}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
index 75a7504cac2f..12f67a65920e 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
@@ -156,7 +156,9 @@ public class AccessibilityServiceConnectionImpl extends IAccessibilityServiceCon
return -1;
}
- public void takeScreenshot(int displayId, RemoteCallback callback) {}
+ public boolean takeScreenshot(int displayId, RemoteCallback callback) {
+ return false;
+ }
public void setTouchExplorationPassthroughRegion(int displayId, Region region) {}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 73d9cc06a748..76f8fdb69452 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -330,6 +330,7 @@ applications that come with the platform
<!-- Needed for test only -->
<permission name="android.permission.READ_PRECISE_PHONE_STATE" />
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+ <permission name="android.permission.READ_WIFI_CREDENTIAL"/>
<permission name="android.permission.REAL_GET_TASKS"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.REGISTER_CALL_PROVIDER"/>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index c6920977f6b9..4c214b529b39 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -149,11 +149,30 @@
<font weight="700" style="normal" fallbackFor="serif">NotoSerifArmenian-Bold.otf</font>
</family>
<family lang="und-Geor,und-Geok">
- <font weight="400" style="normal">NotoSansGeorgian-Regular.otf</font>
- <font weight="500" style="normal">NotoSansGeorgian-Medium.otf</font>
- <font weight="700" style="normal">NotoSansGeorgian-Bold.otf</font>
- <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.otf</font>
- <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-Bold.otf</font>
+ <font weight="400" style="normal">NotoSansGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="400" />
+ </font>
+ <font weight="500" style="normal">NotoSansGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="500" />
+ </font>
+ <font weight="600" style="normal">NotoSansGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="600" />
+ </font>
+ <font weight="700" style="normal">NotoSansGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="700" />
+ </font>
+ <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="400" />
+ </font>
+ <font weight="500" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="500" />
+ </font>
+ <font weight="600" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="600" />
+ </font>
+ <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf
+ <axis tag="wght" stylevalue="700" />
+ </font>
</family>
<family lang="und-Deva" variant="elegant">
<font weight="400" style="normal">NotoSansDevanagari-Regular.otf</font>
@@ -346,7 +365,18 @@
<font weight="400" style="normal">NotoSansAhom-Regular.otf</font>
</family>
<family lang="und-Adlm">
- <font weight="400" style="normal">NotoSansAdlam-Regular.ttf</font>
+ <font weight="400" style="normal">NotoSansAdlam-VF.ttf
+ <axis tag="wght" stylevalue="400" />
+ </font>
+ <font weight="500" style="normal">NotoSansAdlam-VF.ttf
+ <axis tag="wght" stylevalue="500" />
+ </font>
+ <font weight="600" style="normal">NotoSansAdlam-VF.ttf
+ <axis tag="wght" stylevalue="600" />
+ </font>
+ <font weight="700" style="normal">NotoSansAdlam-VF.ttf
+ <axis tag="wght" stylevalue="700" />
+ </font>
</family>
<family lang="und-Avst">
<font weight="400" style="normal">NotoSansAvestan-Regular.ttf</font>
@@ -534,7 +564,7 @@
<font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font>
</family>
<family lang="und-Tfng">
- <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font>
+ <font weight="400" style="normal">NotoSansTifinagh-Regular.otf</font>
</family>
<family lang="und-Ugar">
<font weight="400" style="normal">NotoSansUgaritic-Regular.ttf</font>
@@ -643,4 +673,22 @@
<family lang="und-Sora">
<font weight="400" style="normal">NotoSansSoraSompeng-Regular.otf</font>
</family>
+ <family lang="und-Gong">
+ <font weight="400" style="normal">NotoSansGunjalaGondi-Regular.otf</font>
+ </family>
+ <family lang="und-Rohg">
+ <font weight="400" style="normal">NotoSansHanifiRohingya-Regular.otf</font>
+ </family>
+ <family lang="und-Khoj">
+ <font weight="400" style="normal">NotoSansKhojki-Regular.otf</font>
+ </family>
+ <family lang="und-Gonm">
+ <font weight="400" style="normal">NotoSansMasaramGondi-Regular.otf</font>
+ </family>
+ <family lang="und-Wcho">
+ <font weight="400" style="normal">NotoSansWancho-Regular.otf</font>
+ </family>
+ <family lang="und-Wara">
+ <font weight="400" style="normal">NotoSansWarangCiti-Regular.otf</font>
+ </family>
</familyset>
diff --git a/data/keyboards/Vendor_057e_Product_2009.kl b/data/keyboards/Vendor_057e_Product_2009.kl
index b36e946a547f..3c6b11e4640c 100644
--- a/data/keyboards/Vendor_057e_Product_2009.kl
+++ b/data/keyboards/Vendor_057e_Product_2009.kl
@@ -19,25 +19,25 @@
# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
-# Button labeled as "Y" but should really produce keycode "X"
-key 0x132 BUTTON_X
# Button labeled as "B" but should really produce keycode "A"
key 0x130 BUTTON_A
# Button labeled as "A" but should really produce keycode "B"
key 0x131 BUTTON_B
# Button labeled as "X" but should really product keycode "Y"
key 0x133 BUTTON_Y
+# Button labeled as "Y" but should really produce keycode "X"
+key 0x134 BUTTON_X
# Button labeled as "L"
-key 0x134 BUTTON_L1
+key 0x136 BUTTON_L1
# Button labeled as "R"
-key 0x135 BUTTON_R1
+key 0x137 BUTTON_R1
# No LT / RT axes on this controller. Instead, there are keys.
# Trigger labeled as "ZL"
-key 0x136 BUTTON_L2
+key 0x138 BUTTON_L2
# Trigger labeled as "ZR"
-key 0x137 BUTTON_R2
+key 0x139 BUTTON_R2
# Left Analog Stick
axis 0x00 X
@@ -47,22 +47,30 @@ axis 0x03 Z
axis 0x04 RZ
# Left stick click (generates linux BTN_SELECT)
-key 0x13a BUTTON_THUMBL
+key 0x13d BUTTON_THUMBL
# Right stick click (generates linux BTN_START)
-key 0x13b BUTTON_THUMBR
+key 0x13e BUTTON_THUMBR
-# Hat
+# Currently, the dpad produces key events
+key 0x220 DPAD_UP
+key 0x221 DPAD_DOWN
+key 0x222 DPAD_LEFT
+key 0x223 DPAD_RIGHT
+
+# Hat - currently not being produced by hid-nintendo, but an upcoming patch set will change the behaviour.
+# Keep these mappings in anticipation of that change
axis 0x10 HAT_X
axis 0x11 HAT_Y
# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
# Minus
-key 0x138 BUTTON_SELECT
+key 0x13a BUTTON_SELECT
+
# Plus
-key 0x139 BUTTON_START
+key 0x13b BUTTON_START
# Circle
-key 0x13d BUTTON_MODE
+key 0x135 BUTTON_MODE
# Home key
key 0x13c HOME
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 6028a8a90141..e2309178b297 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -2562,22 +2562,28 @@ public class LocationManager {
mRemoteCancellationSignal = remoteCancellationSignal;
}
- public synchronized void cancel() {
- mExecutor = null;
- mConsumer = null;
+ public void cancel() {
+ ICancellationSignal cancellationSignal;
+ synchronized (this) {
+ mExecutor = null;
+ mConsumer = null;
- if (mAlarmManager != null) {
- mAlarmManager.cancel(this);
- mAlarmManager = null;
+ if (mAlarmManager != null) {
+ mAlarmManager.cancel(this);
+ mAlarmManager = null;
+ }
+
+ // ensure only one cancel event will go through
+ cancellationSignal = mRemoteCancellationSignal;
+ mRemoteCancellationSignal = null;
}
- if (mRemoteCancellationSignal != null) {
+ if (cancellationSignal != null) {
try {
- mRemoteCancellationSignal.cancel();
+ cancellationSignal.cancel();
} catch (RemoteException e) {
// ignore
}
- mRemoteCancellationSignal = null;
}
}
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 762053e9fa24..649fcb19e268 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Wys Bluetooth-toestelle sonder name"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Deaktiveer absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktiveer Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Verbeterde konnektiwiteit"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP-weergawe"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Kies Bluetooth AVRCP-weergawe"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-weergawe"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-toestelle sonder name (net MAC-adresse) sal gewys word"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Deaktiveer die Bluetooth-kenmerk vir absolute volume indien daar volumeprobleme met afgeleë toestelle is, soos onaanvaarbare harde klank of geen beheer nie."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktiveer die Bluetooth Gabeldorsche-kenmerkstapel."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktiveer die Verbeterde Konnektiwiteit-kenmerk."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Plaaslike terminaal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktiveer terminaalprogram wat plaaslike skermtoegang bied"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-kontrolering"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profiel-HWUI-lewering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktiveer GPU-ontfoutlae"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Laat laai van GPU-ontfoutlae vir ontfoutprogramme toe"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktiveer woordryke verkoperloginskrywing"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Sluit bykomende toestelspesifieke verkoperloglêers by foutverslae in, wat privaat inligting kan bevat, meer batterykrag kan gebruik, en/of meer berging kan gebruik."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Vensteranimasieskaal"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Oorganganimasieskaal"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator-tydsduurskaal"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vra elke keer"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Hierdie toestel"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Foonluidspreker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 3e6886c42940..f55b30e4aef1 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"የብሉቱዝ መሣሪያዎችን ያለ ስሞች አሳይ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ፍጹማዊ ድምፅን አሰናክል"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorscheን አንቃ"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"የተሻሻለ ተገናኝነት"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"የብሉቱዝ AVRCP ስሪት"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"የብሉቱዝ AVRCP ስሪት ይምረጡ"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"የብሉቱዝ MAP ስሪት"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"የብሉቱዝ መሣሪያዎች ያለ ስሞች (MAC አድራሻዎች ብቻ) ይታያሉ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"እንደ ተቀባይነት በሌለው ደረጃ ድምፁ ከፍ ማለት ወይም መቆጣጠር አለመቻል ያሉ ከሩቅ መሣሪያዎች ጋር የድምፅ ችግር በሚኖርበት ጊዜ የብሉቱዝ ፍጹማዊ ድምፅን ባሕሪ ያሰናክላል።"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"የብሉቱዝ Gabeldorsche ባህሪ ቁልሉን ያነቃል።"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"የተሻሻለ ተገናኝነት ባህሪውን ያነቃል።"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"አካባቢያዊ ተርሚናል"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"የአካባቢያዊ ሼል መዳረሻ የሚያቀርብ የተርሚናል መተግበሪያ አንቃ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"የHDCP ምልከታ"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"የመገለጫ HWUI ምስልን በመስራት ላይ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"የጂፒዩ ስህተት ማረሚያ ንብርብሮችን ያንቁ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ለስህተት ማረሚያ መተግበሪያዎች የጂፒዩ ንብርብሮችን መስቀልን ፍቀድ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"የዝርክርክ ቃላት አቅራቢ ምዝግብ ማስታወሻን መያዝ አንቃ"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"በሳንካ ሪፖርቶች ውስጥ ተጨማሪ መሣሪያ-ተኮር የአቅራቢ ምዝግብ ማስታወሻዎችን ያካትቱ፣ ይህም የግል መረጃን ሊይዝ፣ ተጨማሪ ባትሪ ሊፈጅ እና/ወይም ተጨማሪ ማከማቻ ሊጠቀም ይችላል።"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"የዊንዶው እነማ ልኬት ለውጥ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"የእነማ ልኬት ለውጥ ሽግግር"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"እነማ አድራጊ ቆይታ መለኪያ"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ሁልጊዜ ጠይቅ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ይህ መሣሪያ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"የስልክ ድምጽ ማጉያ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 7fa6b7fda433..1798e4557f26 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -57,7 +57,7 @@
<string name="osu_sign_up_complete" msgid="7640183358878916847">"اكتمل الاشتراك. جارٍ الاتصال…"</string>
<string name="speed_label_very_slow" msgid="8526005255731597666">"بطيئة جدًا"</string>
<string name="speed_label_slow" msgid="6069917670665664161">"بطيئة"</string>
- <string name="speed_label_okay" msgid="1253594383880810424">"موافق"</string>
+ <string name="speed_label_okay" msgid="1253594383880810424">"حسنًا"</string>
<string name="speed_label_medium" msgid="9078405312828606976">"متوسطة"</string>
<string name="speed_label_fast" msgid="2677719134596044051">"سريعة"</string>
<string name="speed_label_very_fast" msgid="8215718029533182439">"سريعة جدًا"</string>
@@ -206,60 +206,33 @@
<string name="enable_adb" msgid="8072776357237289039">"‏تصحيح أخطاء USB"</string>
<string name="enable_adb_summary" msgid="3711526030096574316">"‏وضع تصحيح الأخطاء عند توصيل USB"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"‏إلغاء عمليات تفويض تصحيح أخطاء USB"</string>
- <!-- no translation found for enable_adb_wireless (6973226350963971018) -->
- <skip />
- <!-- no translation found for enable_adb_wireless_summary (7344391423657093011) -->
- <skip />
- <!-- no translation found for adb_wireless_error (721958772149779856) -->
- <skip />
- <!-- no translation found for adb_wireless_settings (2295017847215680229) -->
- <skip />
- <!-- no translation found for adb_wireless_list_empty_off (1713707973837255490) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_title (6982904096137468634) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_summary (3729901496856458634) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_title (1122590300445142904) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_summary (6370414511333685185) -->
- <skip />
- <!-- no translation found for adb_paired_devices_title (5268997341526217362) -->
- <skip />
- <!-- no translation found for adb_wireless_device_connected_summary (3039660790249148713) -->
- <skip />
- <!-- no translation found for adb_wireless_device_details_title (7129369670526565786) -->
- <skip />
- <!-- no translation found for adb_device_forget (193072400783068417) -->
- <skip />
- <!-- no translation found for adb_device_fingerprint_title_format (291504822917843701) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_title (664211177427438438) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_message (9213896700171602073) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_title (7141739231018530210) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_pairing_code_label (3639239786669722731) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_title (3426758947882091735) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_msg (6611097519661997148) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_summary (8051414549011801917) -->
- <skip />
- <!-- no translation found for adb_wireless_verifying_qrcode_text (6123192424916029207) -->
- <skip />
- <!-- no translation found for adb_qrcode_pairing_device_failed_msg (6936292092592914132) -->
- <skip />
- <!-- no translation found for adb_wireless_ip_addr_preference_title (8335132107715311730) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_title (1906409667944674707) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_description (8578868049289910131) -->
- <skip />
- <!-- no translation found for keywords_adb_wireless (6507505581882171240) -->
- <skip />
+ <string name="enable_adb_wireless" msgid="6973226350963971018">"‏تصحيح الأخطاء عبر شبكة Wi-Fi"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏وضع تصحيح الأخطاء عندما يتم الاتصال بشبكة Wi‑Fi"</string>
+ <string name="adb_wireless_error" msgid="721958772149779856">"خطأ"</string>
+ <string name="adb_wireless_settings" msgid="2295017847215680229">"‏تصحيح الأخطاء عبر شبكة Wi-Fi"</string>
+ <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"لعرض الأجهزة المتاحة واستخدامها، فعِّل ميزة تصحيح الأخطاء لاسلكيًا."</string>
+ <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"إقران الجهاز باستخدام رمز الاستجابة السريعة"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"إقران الأجهزة الجديدة باستخدام الماسح الضوئي لرموز الاستجابة السريعة"</string>
+ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"إقران الجهاز باستخدام رمز الإقران"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"إقران الأجهزة الجديدة باستخدام رمز مكوّن من 6 أعداد"</string>
+ <string name="adb_paired_devices_title" msgid="5268997341526217362">"الأجهزة المقترنة"</string>
+ <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"الأجهزة المتصلة حاليًا"</string>
+ <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"تفاصيل الجهاز"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"حذف"</string>
+ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"بصمة الإصبع للجهاز: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
+ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"تعذّر الاتصال بالشبكة"</string>
+ <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"تأكّدْ من اتصال <xliff:g id="DEVICE_NAME">%1$s</xliff:g> بالشبكة الصحيحة."</string>
+ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"الإقران مع الجهاز"</string>
+ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"‏رمز إقران Wi‑Fi"</string>
+ <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"تعذّر الإقران"</string>
+ <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"تأكّد من توصيل الجهاز بالشبكة نفسها."</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"‏إقران الجهاز من خلال شبكة Wi‑Fi عن طريق المسح الضوئي لرمز استجابة سريعة"</string>
+ <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"جارٍ إقران الجهاز…"</string>
+ <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"تعذّر إقران الجهاز. إما أن رمز الاستجابة السريعة غير صحيح أو أن الجهاز غير متصل بالشبكة نفسها."</string>
+ <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‏عنوان IP والمنفذ"</string>
+ <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"المسح الضوئي لرمز الاستجابة السريعة"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‏إقران الجهاز من خلال شبكة Wi‑Fi عن طريق المسح الضوئي لرمز استجابة سريعة"</string>
+ <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏adb، تصحيح الأخطاء، مطور برامج"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"اختصار تقرير الأخطاء"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"عرض زر في قائمة خيارات التشغيل لإعداد تقرير بالأخطاء"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"البقاء في الوضع النشط"</string>
@@ -269,7 +242,7 @@
<string name="oem_unlock_enable" msgid="5334869171871566731">"فتح قفل المصنّع الأصلي للجهاز"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"‏السماح بإلغاء قفل برنامج bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"هل تريد السماح بإلغاء قفل المصنّع الأصلي للجهاز؟"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"تحذير: لن تعمل ميزات الحماية على هذا الجهاز أثناء تشغيل هذا الإعداد."</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"تحذير: لن تعمل ميزات الحماية على هذا الجهاز أثناء تفعيل هذا الإعداد."</string>
<string name="mock_location_app" msgid="6269380172542248304">"اختيار تطبيق الموقع الزائف"</string>
<string name="mock_location_app_not_set" msgid="6972032787262831155">"لم يتم تعيين تطبيق موقع زائف"</string>
<string name="mock_location_app_set" msgid="4706722469342913843">"تطبيق الموقع الزائف: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -282,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"عرض أجهزة البلوتوث بدون أسماء"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"إيقاف مستوى الصوت المطلق"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"‏تفعيل Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"إمكانية اتصال محسّن"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"‏إصدار Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"‏اختيار إصدار Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"‏إصدار Bluetooth MAP"</string>
@@ -325,10 +299,8 @@
<string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"استخدام إعداد تسريع الأجهزة للتوصيل إن كان متاحًا"</string>
<string name="adb_warning_title" msgid="7708653449506485728">"‏هل تريد السماح بتصحيح أخطاء USB؟"</string>
<string name="adb_warning_message" msgid="8145270656419669221">"‏تم تصميم تصحيح أخطاء USB لأغراض التطوير فقط. يمكن استخدامه لنسخ البيانات بين الكمبيوتر والجهاز، وتثبيت التطبيقات على جهازك بدون تنبيه، وقراءة بيانات السجل."</string>
- <!-- no translation found for adbwifi_warning_title (727104571653031865) -->
- <skip />
- <!-- no translation found for adbwifi_warning_message (8005936574322702388) -->
- <skip />
+ <string name="adbwifi_warning_title" msgid="727104571653031865">"‏هل تريد السماح بتصحيح الأخطاء عبر شبكة Wi-Fi؟"</string>
+ <string name="adbwifi_warning_message" msgid="8005936574322702388">"‏تم تصميم ميزة \"تصحيح الأخطاء عبر شبكة Wi-Fi\" لأغراض التطوير فقط. يمكن استخدامها لنسخ البيانات بين الكمبيوتر والجهاز وتثبيت التطبيقات على جهازك بدون إرسال إشعار وقراءة بيانات السجلّ."</string>
<string name="adb_keys_warning_message" msgid="2968555274488101220">"‏هل تريد إلغاء إمكانية الدخول إلى تصحيح أخطاء USB من جميع أجهزة الكمبيوتر التي تم التصريح لها سابقًا؟"</string>
<string name="dev_settings_warning_title" msgid="8251234890169074553">"هل تريد السماح لإعدادات التطوير؟"</string>
<string name="dev_settings_warning_message" msgid="37741686486073668">"هذه الإعدادات مخصصة لاستخدام التطوير فقط. قد يتسبب هذا في حدوث أعطال أو خلل في أداء الجهاز والتطبيقات المثبتة عليه."</string>
@@ -337,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"‏سيتم عرض أجهزة البلوتوث بدون أسماء (عناوين MAC فقط)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"لإيقاف ميزة مستوى الصوت المطلق للبلوتوث في حال حدوث مشاكل متعلقة بمستوى الصوت في الأجهزة البعيدة، مثل مستوى صوت عالٍ بشكل غير مقبول أو عدم إمكانية التحكّم في الصوت"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"‏تفعيل حِزم ميزة Bluetooth Gabeldorsche"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"لتفعيل الميزة \"إمكانية اتصال محسّن\""</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"تطبيق طرفي محلي"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"تفعيل تطبيق طرفي يوفر إمكانية الدخول إلى واجهة النظام المحلية"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"‏التحقق من HDCP"</string>
@@ -383,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"‏عرض ملف التعريف HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"‏تفعيل طبقات تصحيح أخطاء GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"‏السماح بتحميل طبقات تصحيح أخطاء GPU لتطبيقات تصحيح الأخطاء"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"تفعيل التسجيل المطوَّل للمورّد"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"يمكنك تضمين سجلات المورّدين الإضافية الخاصة بالجهاز في تقارير الخطأ، وقد تحتوي على معلومات شخصية و/أو تستهلك المزيد من شحن البطارية و/أو تستهلك المزيد من مساحة التخزين."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"حجم الرسوم المتحركة للنافذة"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"حجم الرسوم المتحركة للنقل"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"طول مدة الرسوم المتحركة"</string>
@@ -427,11 +402,11 @@
<string name="select_webview_provider_title" msgid="3917815648099445503">"‏تطبيق WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"‏تعيين تطبيق WebView"</string>
<string name="select_webview_provider_toast_text" msgid="8512254949169359848">"لم يعد هذا الاختيار صالحًا. أعد المحاولة."</string>
- <string name="convert_to_file_encryption" msgid="2828976934129751818">"التحويل إلى تشفير ملفات"</string>
+ <string name="convert_to_file_encryption" msgid="2828976934129751818">"التحويل إلى ترميز ملفات"</string>
<string name="convert_to_file_encryption_enabled" msgid="840757431284311754">"تحويل…"</string>
- <string name="convert_to_file_encryption_done" msgid="8965831011811180627">"تم استخدام تشفير ملفات من قبل"</string>
- <string name="title_convert_fbe" msgid="5780013350366495149">"التحويل إلى تشفير على الملف"</string>
- <string name="convert_to_fbe_warning" msgid="34294381569282109">"تحويل قسم البيانات إلى تشفير على الملف.\n !!تحذير!! سيؤدي هذا إلى محو جميع بياناتك.\n لا تزال هذه الميزة في مرحلة ألفا، وقد لا تعمل على نحو سليم.\n للمتابعة، اضغط على \"مسح وتحويل…\"."</string>
+ <string name="convert_to_file_encryption_done" msgid="8965831011811180627">"تم استخدام ترميز ملفات من قبل"</string>
+ <string name="title_convert_fbe" msgid="5780013350366495149">"التحويل إلى ترميز على الملف"</string>
+ <string name="convert_to_fbe_warning" msgid="34294381569282109">"تحويل قسم البيانات إلى ترميز على الملف.\n !!تحذير!! سيؤدي هذا إلى محو جميع بياناتك.\n لا تزال هذه الميزة في مرحلة ألفا، وقد لا تعمل على نحو سليم.\n للمتابعة، اضغط على \"مسح وتحويل…\"."</string>
<string name="button_convert_fbe" msgid="1159861795137727671">"مسح وتحويل…"</string>
<string name="picture_color_mode" msgid="1013807330552931903">"نمط لون الصورة"</string>
<string name="picture_color_mode_desc" msgid="151780973768136200">"‏استخدام sRGB"</string>
@@ -441,8 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"غطش الأحمر (الأحمر والأخضر)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"غمش الأزرق (الأزرق والأصفر)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"تصحيح الألوان"</string>
- <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (6178138727195403796) -->
- <skip />
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"تساعد ميزة تصحيح الألوان المصابين بعمى الألوان على رؤية الألوان بدقة أكبر"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"تم الاستبدال بـ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا"</string>
@@ -461,27 +435,19 @@
<string name="power_remaining_less_than_duration" msgid="1812668275239801236">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g>."</string>
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (137330009791560774) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (145489081521468132) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1070562682853942350) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4429259621177089719) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7703677921000858479) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4374784375644214578) -->
- <skip />
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"قد يتم إغلاق الهاتف قريبًا"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"قد يتم إغلاق الجهاز اللوحي قريبًا"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"قد يتم إغلاق الجهاز قريبًا"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="4429259621177089719">"قد يتم إغلاق الهاتف قريبًا (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"قد يتم إغلاق الجهاز اللوحي قريبًا (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"قد يتم إغلاق الجهاز قريبًا (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> إلى أن يتم شحن الجهاز بالكامل"</string>
<string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> إلى أن يتم شحن الجهاز بالكامل"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"غير معروف"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"جارٍ الشحن"</string>
- <!-- no translation found for battery_info_status_charging_fast (8027559755902954885) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_slow (3190803837168962319) -->
- <skip />
+ <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"جارٍ الشحن سريعًا"</string>
+ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"جارٍ الشحن ببطء"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"لا يتم الشحن"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"تم التوصيل، ولكن يتعذّر الشحن الآن"</string>
<string name="battery_info_status_full" msgid="4443168946046847468">"ممتلئة"</string>
@@ -529,9 +495,9 @@
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"وقت أكثر."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"وقت أقل."</string>
<string name="cancel" msgid="5665114069455378395">"إلغاء"</string>
- <string name="okay" msgid="949938843324579502">"موافق"</string>
- <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تشغيل"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تشغيل وضع \"الرجاء عدم الإزعاج\""</string>
+ <string name="okay" msgid="949938843324579502">"حسنًا"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تفعيل"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل وضع \"الرجاء عدم الإزعاج\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"مطلقًا"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"الأولوية فقط"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -543,6 +509,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"الطلب في كل مرة"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"إلى أن توقف الوضع يدويًا"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"للتو"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"هذا الجهاز"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"مكبر صوت الهاتف"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index dc22f29ac6a5..ce967a38fde4 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"পূৰ্ণ মাত্ৰাৰ ভলিউম অক্ষম কৰক"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche সক্ষম কৰক"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"উন্নত সংযোগ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ব্লুটুথ AVRCP সংস্কৰণ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ব্লুটুথ AVRCP সংস্কৰণ বাছনি কৰক"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ব্লুটুথ MAP সংস্কৰণ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"নামহীন ব্লুটুথ ডিভাইচসমূহ (মাত্ৰ MAC ঠিকনাযুক্ত) দেখুওৱা হ\'ব"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ৰিম\'ট ডিভাইচবিলাকৰ সৈতে ভলিউম সম্পৰ্কীয় সমস্যা, যেনেকৈ অতি উচ্চ ভলিউম বা নিয়ন্ত্ৰণ কৰিবই নোৱাৰা অৱস্থাত ব্লুটুথৰ পূৰ্ণ ভলিউম সুবিধা অক্ষম কৰে।"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ব্লুটুথ Gabeldorche সুবিধাৰ সমষ্টিটো সক্ষম কৰে।"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"উন্নত সংযোগ সুবিধাটো সক্ষম কৰে।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"স্থানীয় টাৰ্মিনেল"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"স্থানীয় শ্বেল প্ৰৱেশাধিকাৰ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP পৰীক্ষণ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"প্ৰ\'ফাইল HWUI ৰেণ্ডাৰিং"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"জিপিইউ ডিবাগ স্তৰবোৰ সক্ষম কৰক"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ডিবাগ এপসমূহৰ বাবে জিপিইউ ডিবাগ তৰপ ল\'ড কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"বিক্ৰেতাৰ ভাৰ্ব’ছ লগিং সক্ষম কৰক"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"ৱিণ্ড\' এনিমেশ্বন স্কেল"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ট্ৰাঞ্জিশ্বন এনিমেশ্বন স্কেল"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"এনিমেটৰ কালদৈৰ্ঘ্য স্কেল"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্ৰতিবাৰতে সোধক"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এই মাত্ৰ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"এই ডিভাইচটো"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফ’নৰ স্পীকাৰ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 9b082b6d4f6b..29624ab31569 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth cihazlarını adsız göstərin"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Mütləq səs həcmi deaktiv edin"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche\'ni aktiv edin"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Təkmilləşdirilmiş Bağlantı"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP Versiya"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP Versiyasını seçin"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP Versiyası"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Adsız Bluetooth cihazları (yalnız MAC ünvanları) göstəriləcək"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Uzaqdan idarə olunan cihazlarda dözülməz yüksək səs həcmi və ya nəzarət çatışmazlığı kimi səs problemləri olduqda Bluetooth mütləq səs həcmi xüsusiyyətini deaktiv edir."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche funksiyasını aktiv edir."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Təkmilləşdirilmiş Bağlantı funksiyasını aktiv edir."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Yerli terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Yerli örtük girişini təklif edən terminal tətbiqi aktiv edin"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP yoxlanılır"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil HWUI bərpası"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU debaq təbəqələrini aktiv edin"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU debaq təbəqələrinin yüklənməsinə icazə verin"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Detallı təchizatçı qeydini aktiv edin"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Xəta hesabatlarına cihaza xas əlavə təchizatçı jurnallarını daxil edin, lakin nəzərə alın ki, onlar şəxsi məlumatları ehtiva edə, daha çox batareya istifadə edə və/və ya daha çox yaddaş istifadə edə bilər."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Pəncərə animasiya miqyası"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Animasiya keçid miqyası"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator müddət şkalası"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Hər dəfə soruşun"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Deaktiv edənə qədər"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Bu cihaz"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon dinamiki"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index cc637403d42c..2d28006ed86f 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Onemogući glavno podešavanje jačine zvuka"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Omogući Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Poboljšano povezivanje"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Verzija Bluetooth AVRCP-a"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Izaberite verziju Bluetooth AVRCP-a"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Verzija Bluetooth MAP-a"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Biće prikazani Bluetooth uređaji bez naziva (samo sa MAC adresama)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Onemogućava glavno podešavanje jačine zvuka na Bluetooth uređaju u slučaju problema sa jačinom zvuka na daljinskim uređajima, kao što su izuzetno velika jačina zvuka ili nedostatak kontrole."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Omogućava grupu Bluetooth Gabeldorsche funkcija."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Omogućava funkciju Poboljšano povezivanje."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Omogući apl. terminala za pristup lokalnom komandnom okruženju"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP provera"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Renderuj pomoću HWUI-a"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Omogući slojeve za otklanjanje grešaka GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Omogući učitavanje otk. greš. GPU-a u apl. za otk. greš."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Opširne evidencije prodavca"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Uvrstite u izveštaje o greškama dodatne posebne evidencije prodavca za uređaje, koje mogu da sadrže privatne podatke, da troše više baterije i/ili da koriste više memorije."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Razmera animacije prozora"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Razmera animacije prelaza"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatorova razmera trajanja"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ovaj uređaj"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f08726ecd6af..bd6fdf341658 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Паказваць прылады Bluetooth без назваў"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Адключыць абсалютны гук"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Уключыць Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Палепшанае падключэнне"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Версія Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Выбраць версію Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Версія Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Прылады Bluetooth будуць паказаны без назваў (толькі MAC-адрасы)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Адключыць функцыю абсалютнага гуку Bluetooth у выпадку праблем з гукам на аддаленых прыладах, напрыклад, пры непрымальна высокай гучнасці або адсутнасці кіравання."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Уключае стос функцый Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Уключае функцыю \"Палепшанае падключэнне\"."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Лакальны тэрмінал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Уключэнне прыкладання тэрмінала, якое прапануе доступ да лакальнай абалонкі"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Праверка HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Профіль візуалізацыі HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Уключыць слаі адладкі GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Загружаць слаі адладкі GPU для праграм адладкі"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Уключыць падрабязны журнал пастаўшчыка"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Дадаваць у справаздачы пра памылкі дадатковыя журналы пастаўшчыка для пэўнай прылады (могуць утрымлівацца прыватныя даныя, можа павышацца выкарыстанне акумулятара і/ці памяці)."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Маштаб анімацыі акна"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Маштаб перадачы анімацыі"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Працягласць анімацыі"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Заўсёды пытацца"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Гэта прылада"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Дынамік тэлефона"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 78ab01a301b8..3d27f63a5a66 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показване на устройствата с Bluetooth без имена"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Деактивиране на пълната сила на звука"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Активиране на Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Подобрена свързаност"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Версия на AVRCP за Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Избиране на версия на AVRCP за Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"MAP версия за Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Ще бъдат показани устройствата с Bluetooth без имена (само MAC адресите)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Деактивира функцията на Bluetooth за пълна сила на звука в случай на проблеми със звука на отдалечени устройства, като например неприемливо висока сила на звука или липса на управление."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Активира стека на функциите на Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Активира функцията за подобрена свързаност."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локален терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Актив. на прил. за терминал с достъп до локалния команден ред"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Проверка с HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Изобр. на HWUI: Профилир."</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Активиране на слоевете за отстр. на грешки в ГП"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Разреш. на зарежд. на слоевете за отстр. на грешки в ГП за съотв. прилож."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Подр. рег. файлове за доставчиците: Актив."</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Включване на допълнителни регистрационни файлове за доставчиците на конкретни устройства в сигналите за програмни грешки, които може да съдържат поверителна информация, да изразходват батерията в по-голяма степен и/или да използват повече място в хранилището."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Скала на аним.: Прозорец"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Скала на преходната анимация"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Скала за Animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Да се пита винаги"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"До изключване"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Това устройство"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Високоговорител на телефона"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 15ebfb88ea76..6c459fc88ce7 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"নামহীন ব্লুটুথ ডিভাইসগুলি দেখুন"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"চূড়ান্ত ভলিউম অক্ষম করুন"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche ফিচার চালু করুন"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"কানেক্টিভিটি উন্নত করা হয়েছে"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ব্লুটুথ AVRCP ভার্সন"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ব্লুটুথ AVRCP ভার্সন বেছে নিন"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ব্লুটুথ MAP ভার্সন"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"নামহীন ব্লুটুথ ডিভাইসগুলি দেখানো হবে (শুধুমাত্র MAC অ্যাড্রেস)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ব্লুটুথ Gabeldorche ফিচার স্ট্যাক চালু করে।"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"কানেক্টিভিটি ফিচার উন্নত করার বিষয়টি চালু করা হয়েছে।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"স্থানীয় টার্মিনাল"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"স্থানীয় শেল অ্যাক্সেসের প্রস্তাব করে এমন টার্মিনাল অ্যাপ্লিকেশন সক্ষম করুন"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP পরীক্ষণ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"প্রোফাইল HWUI রেন্ডারিং"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ডিবাগ স্তর চালু করুন"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ডিবাগ অ্যাপের জন্য GPU ডিবাগ স্তর লোড হতে দিন"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ভারবোস ভেন্ডর লগ-ইন চালু করুন"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"উইন্ডো অ্যানিমেশন স্কেল"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ট্র্যানজিশন অ্যানিমেশন স্কেল"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"অ্যানিমেটর সময়কাল স্কেল"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্রতিবার জিজ্ঞেস করা হবে"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"এই ডিভাইস"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফেনের স্পিকার"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index cb55c5d87560..e4c6e0cd42c7 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Onemogući apsolutnu jačinu zvuka"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Omogući Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Poboljšana povezivost"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP verzija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Odaberite Bluetooth AVRCP verziju"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP verzija"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Prikazat će se Bluetooth uređaji bez naziva (samo MAC adrese)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Onemogućava funkciju apsolutne jačine zvuka za Bluetooth u slučaju problema s jačinom zvuka na udaljenim uređajima, kao što je neprihvatljivo glasan zvuk ili nedostatak kontrole."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Omogućava grupisanje funkcije Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Omogućava funkciju Poboljšane povezivosti."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Omogući terminalnu aplik. koja nudi pristup lok. kom. okruženju"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP provjera"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil HWUI iscrtavanja"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Omogući slojeve za otklanjanje grešaka na GPU-u"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Omoguć. učit. sloj. za otkl. greš. na GPU-u za apl. za otkl. greš."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Omogući opširni zapisnik"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"U izvještaje o greškama uključite dodatne zapisnike dobavljača specifične za uređaj, koji mogu sadržavati lične informacije, povećati potrošnju baterije i/ili koristiti više prostora za pohranu."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animacije prozora"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animacije prijelaza"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala trajanja animatora"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ovaj uređaj"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 7ac03aa9ca16..1a6e078129cd 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostra els dispositius Bluetooth sense el nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desactiva el volum absolut"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Activa Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Connectivitat millorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versió AVRCP de Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona la versió AVRCP de Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versió MAP de Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Es mostraran els dispositius Bluetooth sense el nom (només l\'adreça MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desactiva la funció de volum absolut del Bluetooth en cas que es produeixin problemes de volum amb dispositius remots, com ara un volum massa alt o una manca de control."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Activa el conjunt de funcions de Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Activa la funció de connectivitat millorada."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Activa l\'aplicació de terminal que ofereix accés al shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Comprovació d\'HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Renderització perfil HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activa les capes de depuració de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permet capes de depuració de GPU en apps de depuració"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Activa el registre detallat"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclou altres registres de proveïdor específics del dispositiu als informes d’errors; és possible que continguin informació privada, consumeixin més bateria o utilitzin més espai d\'emmagatzematge."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala d\'animació finestra"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala d\'animació transició"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de durada d\'animació"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pregunta sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fins que no ho desactivis"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Aquest dispositiu"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altaveu del telèfon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Desactiva el dispositiu i torna\'l a activar."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 932051d4478e..cdec4613eadf 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Zobrazovat zařízení Bluetooth bez názvů"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Zakázat absolutní hlasitost"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Zapnout funkci Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Lepší připojování"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Verze profilu Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Vyberte verzi profilu Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Verze MAP pro Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Zařízení Bluetooth se budou zobrazovat bez názvů (pouze adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Zakáže funkci absolutní hlasitosti Bluetooth. Zabrání tak problémům s hlasitostí vzdálených zařízení (jako je příliš vysoká hlasitost nebo nemožnost ovládání)."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Zapne sadu funkcí Bluetooth Gabeldorche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktivuje funkci Lepší připojování."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Místní terminál"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktivovat terminálovou aplikaci pro místní přístup k prostředí shell"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Kontrola HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil – vykres. HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Povolit vrstvy ladění GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Povolit načítání vrstev ladění GPU pro ladicí aplikace"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Povolit podrobné protokolování dodavatele"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Zahrnovat do zpráv o chybách dodatečné protokoly dodavatelů specifické pro zařízení, které mohou obsahovat soukromé údaje, více vybíjet baterii nebo využívat více místa v úložišti."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Měřítko animace okna"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Měřítko animace přeměny"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Měřítko délky animace"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pokaždé se zeptat"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokud tuto funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Toto zařízení"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefonu"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 20fbf9490cb0..d88c1499ec5a 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Vis Bluetooth-enheder uden navne"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Deaktiver absolut lydstyrke"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktivér Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced Connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Vælg AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"MAP-version for Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-enheder uden navne (kun MAC-adresser) vises"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Deaktiverer funktionen til absolut lydstyrke via Bluetooth i tilfælde af problemer med lydstyrken på eksterne enheder, f.eks. uacceptabel høj lyd eller manglende kontrol."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktiverer funktioner fra Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktivér funktionen Enhanced Connectivity."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokal terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktivér terminalappen, der giver lokal shell-adgang"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-kontrol"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-profilgengivelse"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktivér fejlretningslag for grafikprocessor"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Tillad, at fejlretningslag indlæses for grafikprocessor i apps til fejlretning"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktivér detaljeret leverandørlogging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Medtag yderligere enhedsspecifikke leverandørlogfiler i fejlrapporter, som muligvis indeholder personlige oplysninger. Dette bruger muligvis mere batteri og/eller lagerplads."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Animationsskala for vindue"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Overgangsanimationsskala"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatorvarighedsskala"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spørg hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Denne enhed"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonens højttaler"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 3d46649ad3fc..b38868612959 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-Geräte ohne Namen anzeigen"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Absolute Lautstärkeregelung deaktivieren"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Bluetooth-Gabeldorsche aktivieren"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Verbesserte Konnektivität"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP-Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP-Version auswählen"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-Version"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-Geräte werden ohne Namen und nur mit ihren MAC-Adressen angezeigt"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Deaktiviert die Funktion \"Absolute Lautstärkeregelung\" für Bluetooth-Geräte, falls auf Remote-Geräten Probleme mit der Lautstärke auftreten, wie beispielsweise übermäßig laute Wiedergabe oder fehlende Steuerungsmöglichkeiten."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktiviert das Bluetooth-Gabeldorsche-Funktionspaket."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktiviert die Funktion \"Verbesserte Konnektivität\"."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokales Terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Terminal-App mit Zugriff auf lokale Shell aktivieren"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-Prüfung"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-Rendering für Profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU-Debug-Ebenen zulassen"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Debug-Apps das Laden von GPU-Debug-Ebenen erlauben"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ausführliche Protokollierung aktivieren"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"Fensteranimationsfaktor"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Übergangsanimationsfaktor"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animationsdauerfaktor"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Jedes Mal fragen"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"gerade eben"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Dieses Gerät"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Smartphone-Lautsprecher"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus &amp; und wieder ein."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 6bd87367c0c5..07f73c3171e5 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Εμφάνιση συσκευών Bluetooth χωρίς ονόματα"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Απενεργοποίηση απόλυτης έντασης"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ενεργοποίηση Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Βελτιωμένη συνδεσιμότητα"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Έκδοση AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Επιλογή έκδοσης AVRCP Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Έκδοση MAP Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Θα εμφανιστούν οι συσκευές Bluetooth χωρίς ονόματα (μόνο διευθύνσεις MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Απενεργοποιεί τη δυνατότητα απόλυτης έντασης του Bluetooth σε περίπτωση προβλημάτων έντασης με απομακρυσμένες συσκευές, όπως όταν υπάρχει μη αποδεκτά υψηλή ένταση ή απουσία ελέγχου."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ενεργοποιεί τη στοίβα λειτουργιών Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Επιτρέπει τη λειτουργία Βελτιωμένης συνδεσιμότητας."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Τοπική τερματική εφαρμογή"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Ενεργοπ.τερμ.εφαρμογής που προσφέρει πρόσβαση στο τοπικό κέλυφος"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Έλεγχος HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Απόδοση HWUI προφίλ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ενεργ. επιπ. εντ. σφ. GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Φόρτωση επιπ. εντοπ. σφ. GPU για εφαρμ. αντιμ. σφ."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ενεργ. λεπτ. καταγραφής προμ."</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Συμπερίληψη πρόσθετων αρχείων καταγραφής προμηθευτή για συγκεκριμένες συσκευές στις αναφορές σφαλμάτων, τα οποία ενδέχεται να περιέχουν ιδιωτικές πληροφορίες, να χρησιμοποιούν περισσότερη μπαταρία ή/και να χρησιμοποιούν περισσότερο αποθηκευτικό χώρο."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Κλίμακα κίνησης παραθύρου"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Κλίμακα κίνησης μετάβασης"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Κλίμ. διάρ. Animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Να ερωτώμαι κάθε φορά"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Αυτή η συσκευή"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Ηχείο τηλεφώνου"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 810f81ecfbc7..79cf4df30855 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Disable absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Enable Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP version"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Enables the Bluetooth Gabeldorsche feature stack."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Enables the enhanced connectivity feature."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Local terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Enable terminal app that offers local shell access"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP checking"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Allow loading GPU debug layers for debug apps"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Enable verbose vendor logging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery and/or use more storage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Window animation scale"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"This device"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 810f81ecfbc7..79cf4df30855 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Disable absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Enable Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP version"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Enables the Bluetooth Gabeldorsche feature stack."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Enables the enhanced connectivity feature."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Local terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Enable terminal app that offers local shell access"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP checking"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Allow loading GPU debug layers for debug apps"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Enable verbose vendor logging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery and/or use more storage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Window animation scale"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"This device"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 810f81ecfbc7..79cf4df30855 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Disable absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Enable Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP version"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Enables the Bluetooth Gabeldorsche feature stack."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Enables the enhanced connectivity feature."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Local terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Enable terminal app that offers local shell access"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP checking"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Allow loading GPU debug layers for debug apps"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Enable verbose vendor logging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery and/or use more storage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Window animation scale"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"This device"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 810f81ecfbc7..79cf4df30855 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Disable absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Enable Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP version"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Enables the Bluetooth Gabeldorsche feature stack."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Enables the enhanced connectivity feature."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Local terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Enable terminal app that offers local shell access"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP checking"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Allow loading GPU debug layers for debug apps"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Enable verbose vendor logging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery and/or use more storage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Window animation scale"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"This device"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index d142c0a55213..c128e2c1d17e 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎Show Bluetooth devices without names‎‏‎‎‏‎"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎Disable absolute volume‎‏‎‎‏‎"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎Enable Gabeldorsche‎‏‎‎‏‎"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎Enhanced Connectivity‎‏‎‎‏‎"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎Bluetooth AVRCP Version‎‏‎‎‏‎"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎Select Bluetooth AVRCP Version‎‏‎‎‏‎"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‎Bluetooth MAP Version‎‏‎‎‏‎"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎Bluetooth devices without names (MAC addresses only) will be displayed‎‏‎‎‏‎"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control.‎‏‎‎‏‎"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎Enables the Bluetooth Gabeldorsche feature stack.‎‏‎‎‏‎"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎Enables the Enhanced Connectivity feature.‎‏‎‎‏‎"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎Local terminal‎‏‎‎‏‎"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎Enable terminal app that offers local shell access‎‏‎‎‏‎"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎HDCP checking‎‏‎‎‏‎"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‎‎Profile HWUI rendering‎‏‎‎‏‎"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎Enable GPU debug layers‎‏‎‎‏‎"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎Allow loading GPU debug layers for debug apps‎‏‎‎‏‎"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎Enable verbose vendor logging‎‏‎‎‏‎"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‎‎Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery, and/or use more storage.‎‏‎‎‏‎"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎Window animation scale‎‏‎‎‏‎"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎Transition animation scale‎‏‎‎‏‎"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎Animator duration scale‎‏‎‎‏‎"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‎Ask every time‎‏‎‎‏‎"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎Until you turn off‎‏‎‎‏‎"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎Just now‎‏‎‎‏‎"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎This device‎‏‎‎‏‎"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎Phone speaker‎‏‎‎‏‎"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎Problem connecting. Turn device off &amp; back on‎‏‎‎‏‎"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎Wired audio device‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 8b99f72c6622..06660ee0692e 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sin nombre"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Inhabilitar volumen absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Habilitar Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectividad mejorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versión de AVRCP del Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona la versión de AVRCP del Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versión de MAP de Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Se mostrarán los dispositivos Bluetooth sin nombre (solo direcciones MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Inhabilita la función de volumen absoluto de Bluetooth si se producen problemas de volumen con dispositivos remotos (por ejemplo, volumen demasiado alto o falta de control)."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Habilita la pila de funciones de Bluetooth Gabeldorsche"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Habilita la función Conectividad mejorada."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Habilitar aplicac. de terminal que ofrece acceso al shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Comprobación HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Perfil procesamiento HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Habilitar depuración GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir capas de GPU para apps de depuración"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Habilitar registro detallado"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Incluye otros registros de proveedor específicos del dispositivo en los informes de errores, que podrían contener información privada, consumir más batería o usar más espacio de almacenamiento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animación de ventana"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animación de transición"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duración de animador"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 5c8efc5d44b2..2e5adb86e674 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -202,7 +202,7 @@
<string name="development_settings_not_available" msgid="355070198089140951">"Las opciones de desarrollador no están disponibles para este usuario"</string>
<string name="vpn_settings_not_available" msgid="2894137119965668920">"Los ajustes de VPN no están disponibles para este usuario"</string>
<string name="tethering_settings_not_available" msgid="266821736434699780">"Los ajustes para compartir conexión no están disponibles para este usuario"</string>
- <string name="apn_settings_not_available" msgid="1147111671403342300">"Los ajustes del nombre de punto de acceso no están disponibles para este usuario"</string>
+ <string name="apn_settings_not_available" msgid="1147111671403342300">"Los ajustes del nombre del punto de acceso no están disponibles para este usuario"</string>
<string name="enable_adb" msgid="8072776357237289039">"Depuración por USB"</string>
<string name="enable_adb_summary" msgid="3711526030096574316">"Activar el modo de depuración cuando el dispositivo esté conectado por USB"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"Revocar autorizaciones de depuración USB"</string>
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sin nombre"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Inhabilitar volumen absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Habilitar Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectividad mejorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versión AVRCP de Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona la versión AVRCP de Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versión de MAP de Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Mostrar dispositivos Bluetooth sin nombre (solo direcciones MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Inhabilitar la función de volumen absoluto de Bluetooth si se producen problemas de volumen con dispositivos remotos (por ejemplo, volumen demasiado alto o falta de control)"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Habilita la pila de funciones de Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Habilita la función de conectividad mejorada."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Habilitar aplicación de terminal que ofrece acceso a shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Comprobación de HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Trazar la renderización de HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activar capas de depuración de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir cargar capas de depuración de GPU en aplicaciones"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Habilit. registro de proveedor"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Incluye otros registros de proveedor específicos del dispositivo en informes de errores; es posible que contenga información privada, que consuma más batería o que ocupe más espacio de almacenamiento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animación de ventana"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animación de transición"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duración de animación"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que se desactive"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Justo ahora"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 7597476c07ff..027ab1a6ed6e 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Kuva ilma nimedeta Bluetoothi seadmed"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Keela absoluutne helitugevus"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Luba Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Täiustatud ühenduvus"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetoothi AVRCP versioon"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Valige Bluetoothi AVRCP versioon"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetoothi MAP-i versioon"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Kuvatakse ilma nimedeta (ainult MAC-aadressidega) Bluetoothi seadmed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Keelatakse Bluetoothi absoluutse helitugevuse funktsioon, kui kaugseadmetega on helitugevuse probleeme (nt liiga vali heli või juhitavuse puudumine)."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Lubab Bluetooth Gabeldorsche\'i funktsiooni virnastamise."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Lubab täiustatud ühenduvuse funktsiooni."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Kohalik terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Luba kohalikku turvalist juurdepääsu pakkuv terminalirakendus"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-kontrollimine"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profiili HWUI renderdamine"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU silumise kihtide lubamine"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU silumise kihtide laadimise lubamine silumisrakendustele"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Luba paljusõnaline logimine"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Veaaruannetesse kaasatakse täiendavad seadmepõhised teenusepakkuja logid, mis võivad sisaldada privaatset teavet, kasutada rohkem akut ja/või salvestusruumi."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Akna animatsioonimastaap"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Ülemineku animatsioonimastaap"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animaatori kestuse mastaap"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Küsi iga kord"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"See seade"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoni kõlar"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index fd2635a9cbe5..95ed7f043928 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -212,9 +212,9 @@
<string name="adb_wireless_settings" msgid="2295017847215680229">"Hari gabeko arazketa"</string>
<string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Erabilgarri dauden gailuak ikusteko eta erabiltzeko, aktibatu hari gabeko arazketa"</string>
<string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Parekatu gailua QR kodearekin"</string>
- <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Parekatu gailu berriak QR kodea eskaneatuta"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Parekatu gailu gehiago QR kodea eskaneatuta"</string>
<string name="adb_pair_method_code_title" msgid="1122590300445142904">"Parekatu gailua parekatze-kodearekin"</string>
- <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Parekatu gailu berriak sei digituko kodearekin"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Parekatu gailu gehiago sei digituko kodearekin"</string>
<string name="adb_paired_devices_title" msgid="5268997341526217362">"Parekatutako gailuak"</string>
<string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Konektatuta daudenak"</string>
<string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Gailuaren xehetasunak"</string>
@@ -226,12 +226,12 @@
<string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wifi bidezko parekatze-kodea"</string>
<string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Ezin izan da parekatu gailua"</string>
<string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Ziurtatu gailua sare berera konektatuta dagoela."</string>
- <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Parekatu gailua wifi sare baten bidez QR kode bat eskaneatuta"</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Parekatu gailua wifi-sare baten bidez QR kode bat eskaneatuta"</string>
<string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Gailua parekatzen…"</string>
- <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Ezin izan da parekatu gailua. QR kodea ez zen zuzena zen edo gailua ez dago sare berera konektatuta."</string>
+ <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Ezin izan da parekatu gailua. QR kodea ez da zuzena edo gailua ez dago sare berera konektatuta."</string>
<string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP helbidea eta ataka"</string>
<string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Eskaneatu QR kodea"</string>
- <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parekatu gailua wifi sare baten bidez QR kode bat eskaneatuta"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parekatu gailua wifi-sare baten bidez QR kode bat eskaneatuta"</string>
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, araztu, gailua"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Akatsen txostenerako lasterbidea"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Bateriaren menuan, erakutsi akatsen txostena sortzeko botoia"</string>
@@ -252,9 +252,10 @@
<string name="wifi_scan_throttling" msgid="2985624788509913617">"Wifi-sareen bilaketaren muga"</string>
<string name="mobile_data_always_on" msgid="8275958101875563572">"Datu-konexioa beti aktibo"</string>
<string name="tethering_hardware_offload" msgid="4116053719006939161">"Konexioa partekatzeko hardwarearen azelerazioa"</string>
- <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Erakutsi Bluetooth gailuak izenik gabe"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Erakutsi Bluetooth bidezko gailuak izenik gabe"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desgaitu bolumen absolutua"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gaitu Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Konexio hobeak"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Hautatu Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAParen bertsioa"</string>
@@ -305,9 +306,10 @@
<string name="dev_settings_warning_message" msgid="37741686486073668">"Ezarpen hauek garapen-xedeetarako pentsatu dira soilik. Baliteke ezarpenen eraginez gailua matxuratzea edo funtzionamendu okerra izatea."</string>
<string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Egiaztatu USBko aplikazioak"</string>
<string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Egiaztatu ADB/ADT bidez instalatutako aplikazioak portaera kaltegarriak atzemateko"</string>
- <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth gailuak izenik gabe (MAC helbideak soilik) erakutsiko dira"</string>
+ <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth bidezko gailuak izenik gabe (MAC helbideak soilik) erakutsiko dira"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Bluetooth bidezko bolumen absolutuaren eginbidea desgaitu egiten du urruneko gailuetan arazoak hautematen badira; esaterako, bolumena ozenegia bada edo ezin bada kontrolatu"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche eginbide sorta gaitzen du."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Konexioak hobetzeko eginbidea gaitzen du."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Tokiko terminala"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Gaitu tokiko shell-sarbidea duen terminal-aplikazioa"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP egiaztapena"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"Profilaren HWUI errendatzea"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Gaitu GPUaren arazketa-geruzak"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Eman GPUaren arazketa-geruzak kargatzeko baimena arazketa-aplikazioei"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Gaitu saltzaileen erregistro xehatuak"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"Leihoen animazio-eskala"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Trantsizioen animazio-eskala"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatzailearen iraupena"</string>
@@ -412,7 +417,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopia (gorri-berdeak)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopia (urdin-horia)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koloreen zuzenketa"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Kolore-zuzenketak kolore zehatzagoak ikusten laguntzen die kolore-itsutasuna duten pertsonei"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Koloreen zuzenketak kolore zehatzagoak ikusten laguntzen die kolore-itsutasuna duten pertsonei"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> hobespena gainjarri zaio"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Galdetu beti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Zuk desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Gailu hau"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonoaren bozgorailua"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazoren bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 9d92cfec75da..4cc6974a038a 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"نمایش دستگاه‌های بلوتوث بدون نام"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"غیرفعال کردن میزان صدای مطلق"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"‏فعال کردن Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"اتصال بهبودیافته"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"‏نسخه AVRCP بلوتوث"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"‏انتخاب نسخه AVRCP بلوتوث"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"‏نسخه MAP بلوتوث"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"‏دستگاه‌های بلوتوث بدون نام (فقط نشانی‌های MAC) نشان داده خواهند شد"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"درصورت وجود مشکل در صدا با دستگاه‌های راه دور مثل صدای بلند ناخوشایند یا عدم کنترل صدا، ویژگی میزان صدای کامل بلوتوث را غیرفعال کنید."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"‏دسته ویژگی Gabeldorsche، بلوتوث را فعال می‌کند."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ویژگی «اتصال بهبودیافته» را فعال می‌کند."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ترمینال محلی"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"فعال کردن ترمینال برنامه‌ کاربردی که دسترسی به برنامه محلی را پیشنهاد می‌کند"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"‏بررسی HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"‏پرداز زدن HWUI نمایه"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"‏فعال کردن لایه‌های اشکال‌زدایی GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"‏مجاز کردن بارگیری لایه‌های اشکال‌زدایی GPU برای برنامه‌های اشکا‌ل‌زدایی"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"فعال کردن گزارش طولانی فروشنده"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"شامل گزارشات اشکال تکمیلی ورود به سیستم فروشنده ویژه دستگاه می‌شود که ممکن است دربرگیرنده اطلاعات خصوصی، استفاده بیشتر از باتری، و/یا استفاده بیشتر از فضای ذخیره‌سازی باشد."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"مقیاس پویانمایی پنجره"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"مقیاس پویانمایی انتقالی"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"مقیاس طول مدت انیماتور"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"هربار پرسیده شود"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"تا زمانی‌که آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"هم‌اکنون"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"این دستگاه"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"بلندگوی تلفن"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 6bb6d5bfb434..a2531d57e2a3 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Näytä nimettömät Bluetooth-laitteet"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Poista yleinen äänenvoimakkuuden säätö käytöstä"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ota Gabeldorsche käyttöön"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Parannetut yhteydet"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetoothin AVRCP-versio"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Valitse Bluetoothin AVRCP-versio"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetoothin MAP-versio"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Näytetään Bluetooth-laitteet, joilla ei ole nimiä (vain MAC-osoitteet)."</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Bluetoothin yleinen äänenvoimakkuuden säätö poistetaan käytöstä ongelmien välttämiseksi esimerkiksi silloin, kun laitteen äänenvoimakkuus on liian kova tai sitä ei voi säätää."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetoothin Gabeldorsche-ominaisuuspino otetaan käyttöön."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ottaa käyttöön Parannetut yhteydet ‑ominaisuuden."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Paikallinen pääte"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Ota käyttöön päätesov. joka mahdollistaa paikall. liittymäkäytön"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-tarkistus"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-profiilirenderöinti"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU-virheenkorjaus päälle"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Salli GPU:n virheenkorjauskerrosten lataus."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Käytä laajennettua kirjausta"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Sisällytä virheraportteihin muita laitekohtaisia myyjälokeja, jotka voivat sisältää yksityisiä tietoja, käyttää enemmän akkua ja/tai käyttää enemmän tallennustilaa."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Ikkuna"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Siirtymä"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animaattori"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Kysy aina"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kunnes poistat sen käytöstä"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Tämä laite"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Puhelimen kaiutin"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index b040be9a4bec..8ee44ac5de6f 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -226,13 +226,13 @@
<string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Code d\'association Wi-Fi"</string>
<string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Échec de l\'association"</string>
<string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Vérifier que l\'appareil est connecté au même réseau."</string>
- <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Associer un appareil au Wi-Fi en numérisant un code QR"</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Associer un appareil par Wi-Fi en numérisant un code QR"</string>
<string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Association de l\'appareil en cours…"</string>
<string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Échec de l\'association de l\'appareil Soit le code QR est incorrect, soit l\'appareil n\'est pas connecté au même réseau."</string>
<string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresse IP et port"</string>
<string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Numériser le code QR"</string>
- <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Associer un appareil au Wi-Fi en numérisant un code QR"</string>
- <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, débogage, appareil"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Associer un appareil par Wi-Fi en numérisant un code QR"</string>
+ <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, débogage, concepteur"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Raccourci de rapport de bogue"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Afficher un bouton permettant d\'établir un rapport de bogue dans le menu de démarrage"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Rester activé"</string>
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afficher les appareils Bluetooth sans nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Désactiver le volume absolu"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Activer le Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Connectivité améliorée"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Version du profil Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Sélectionner la version du profil Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Version du profil Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Les appareils Bluetooth sans nom (adresses MAC seulement) seront affichés"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Désactive la fonctionnalité de volume absolu par Bluetooth en cas de problème de volume sur les appareils à distance, par exemple si le volume est trop élevé ou s\'il ne peut pas être contrôlé."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Active la pile de la fonctionnalité Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Active la fonctionnalité Connectivité améliorée."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Activer l\'application Terminal permettant l\'accès au shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Vérification HDCP"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"Rendu HWUI du profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activer couches débogage GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Autoriser couches débogage GPU pour applis de débogage"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Activer le journal détaillé des fournisseurs"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"Échelle animation fenêtres"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Échelle animination transitions"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Échelle durée animation"</string>
@@ -443,7 +448,7 @@
<string name="battery_info_status_unknown" msgid="268625384868401114">"Inconnu"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charge en cours…"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Recharge rapide"</string>
- <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charge lente"</string>
+ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Recharge lente"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"N\'est pas en charge"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"L\'appareil est branché, mais il ne peut pas être chargé pour le moment"</string>
<string name="battery_info_status_full" msgid="4443168946046847468">"Pleine"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Cet appareil"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index fb70c88dd408..271c52b61531 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afficher les appareils Bluetooth sans nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Désactiver le volume absolu"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Activer Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Connectivité améliorée"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Version Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Sélectionner la version Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Version Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Les appareils Bluetooth sans nom (adresses MAC seulement) seront affichés"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Désactive la fonctionnalité de volume absolu du Bluetooth en cas de problème de volume sur les appareils à distance, par exemple si le volume est trop élevé ou s\'il ne peut pas être contrôlé"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Active la pile de fonctionnalités Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Active la fonctionnalité Connectivité améliorée."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Activer l\'application Terminal permettant l\'accès au shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Vérification HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Rendu HWUI du profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activer les couches de débogage GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Autoriser le chargement de couches de débogage GPU"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Act. journalisation détaillée"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclure les journaux supplémentaires du fournisseur, spécifiques à l\'appareil, dans les rapports de bug. Ils peuvent contenir des informations personnelles, solliciter davantage la batterie et/ou utiliser plus d\'espace de stockage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Échelle d\'animation des fenêtres"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Échelle d\'animation des transitions"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Échelle de durée d\'animation"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Cet appareil"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 1407a50d7629..ec600c0cd0cd 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sen nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desactivar volume absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Activar Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectividade mellorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versión de Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona a versión de Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versión de MAP de Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Mostraranse dispositivos Bluetooth sen nomes (só enderezos MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desactiva a función do volume absoluto do Bluetooth en caso de que se produzan problemas de volume cos dispositivos remotos, como volume demasiado alto ou falta de control"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Activa o conxunto de funcións de Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Activa a función de conectividade mellorada."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Activa a aplicación terminal que ofrece acceso ao shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Comprobación HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Perfil procesamento HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activar depuración da GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite capas da GPU para apps de depuración"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Activar rexistro de provedores"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclúe outros rexistros de provedores específicos do dispositivo en informes de erros; pode conter información privada, consumir máis batería e ocupar máis espazo almacenamento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animación da ventá"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala animación-transición"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala duración animador"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altofalante do teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 889857ab8829..00c7b370dd42 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"નામ વિનાના બ્લૂટૂથ ઉપકરણો બતાવો"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ચોક્કસ વૉલ્યૂમને અક્ષમ કરો"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche ચાલુ કરો"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"વિસ્તૃત કનેક્ટિવિટી"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"બ્લૂટૂથ AVRCP સંસ્કરણ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"બ્લૂટૂથ AVRCP સંસ્કરણ પસંદ કરો"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"બ્લૂટૂથ MAP વર્ઝન"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"નામ વગરના (ફક્ત MAC ઍડ્રેસવાળા) બ્લૂટૂથ ઉપકરણો બતાવવામાં આવશે"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"રિમોટ ઉપકરણોમાં વધુ પડતું ઊંચું વૉલ્યૂમ અથવા નિયંત્રણની કમી જેવી વૉલ્યૂમની સમસ્યાઓની સ્થિતિમાં બ્લૂટૂથ ચોક્કસ વૉલ્યૂમ સુવિધાને અક્ષમ કરે છે."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"બ્લૂટૂથ Gabeldorsche સુવિધાનું સ્ટૅક ચાલુ કરે છે."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"કનેક્ટિવિટીની વિસ્તૃત સુવિધા ચાલુ કરે છે."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"સ્થાનિક ટર્મિનલ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"સ્થાનિક શેલ અ‍ૅક્સેસની ઑફર કરતી ટર્મિનલ એપ્લિકેશનને સક્ષમ કરો"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP તપાસણી"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUIની પ્રોફાઇલ રેંડરીંગ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ડિબગ સ્તરોને સક્ષમ કરો"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ડિબગ ઍપ માટે GPU ડિબગ સ્તરો લોડ કરવાની મંજૂરી આપો"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"વર્બોઝ વેન્ડર લૉગિંગ ચાલુ કરો"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"વિંડો એનિમેશન સ્કેલ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"સંક્રમણ એનિમેશન સ્કેલ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"એનિમેટર અવધિ સ્કેલ"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"દર વખતે પૂછો"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"તમે બંધ ન કરો ત્યાં સુધી"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"હમણાં જ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"આ ડિવાઇસ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ફોન સ્પીકર"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 24153b9a04df..b38223429a2c 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -206,60 +206,33 @@
<string name="enable_adb" msgid="8072776357237289039">"USB डीबग करना"</string>
<string name="enable_adb_summary" msgid="3711526030096574316">"डीबग मोड जब USB कनेक्‍ट किया गया हो"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"USB डीबग करने की मंज़ूरी रद्द करें"</string>
- <!-- no translation found for enable_adb_wireless (6973226350963971018) -->
- <skip />
- <!-- no translation found for enable_adb_wireless_summary (7344391423657093011) -->
- <skip />
- <!-- no translation found for adb_wireless_error (721958772149779856) -->
- <skip />
- <!-- no translation found for adb_wireless_settings (2295017847215680229) -->
- <skip />
- <!-- no translation found for adb_wireless_list_empty_off (1713707973837255490) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_title (6982904096137468634) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_summary (3729901496856458634) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_title (1122590300445142904) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_summary (6370414511333685185) -->
- <skip />
- <!-- no translation found for adb_paired_devices_title (5268997341526217362) -->
- <skip />
- <!-- no translation found for adb_wireless_device_connected_summary (3039660790249148713) -->
- <skip />
- <!-- no translation found for adb_wireless_device_details_title (7129369670526565786) -->
- <skip />
- <!-- no translation found for adb_device_forget (193072400783068417) -->
- <skip />
- <!-- no translation found for adb_device_fingerprint_title_format (291504822917843701) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_title (664211177427438438) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_message (9213896700171602073) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_title (7141739231018530210) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_pairing_code_label (3639239786669722731) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_title (3426758947882091735) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_msg (6611097519661997148) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_summary (8051414549011801917) -->
- <skip />
- <!-- no translation found for adb_wireless_verifying_qrcode_text (6123192424916029207) -->
- <skip />
- <!-- no translation found for adb_qrcode_pairing_device_failed_msg (6936292092592914132) -->
- <skip />
- <!-- no translation found for adb_wireless_ip_addr_preference_title (8335132107715311730) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_title (1906409667944674707) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_description (8578868049289910131) -->
- <skip />
- <!-- no translation found for keywords_adb_wireless (6507505581882171240) -->
- <skip />
+ <string name="enable_adb_wireless" msgid="6973226350963971018">"वायरलेस डीबग करना"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"डिवाइस के वाई-फ़ाई से कनेक्ट हाेने पर, डीबग मोड चालू करें"</string>
+ <string name="adb_wireless_error" msgid="721958772149779856">"गड़बड़ी"</string>
+ <string name="adb_wireless_settings" msgid="2295017847215680229">"वायरलेस डीबग करना"</string>
+ <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध डिवाइस देखने और इस्तेमाल करने के लिए, वायरलेस डीबग करने की सुविधा चालू करें"</string>
+ <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"क्यूआर कोड की मदद से डिवाइस जोड़ें"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"क्यूआर कोड स्कैनर का इस्तेमाल करके, नए डिवाइस जोड़ें"</string>
+ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"जोड़ने का कोड इस्तेमाल करके, डिवाइस जोड़ें"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"छह अंकों का कोड इस्तेमाल करके, नए डिवाइस जोड़ें"</string>
+ <string name="adb_paired_devices_title" msgid="5268997341526217362">"जोड़े गए डिवाइस"</string>
+ <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"फ़िलहाल, कनेक्ट किया गया"</string>
+ <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"डिवाइस की जानकारी"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"जानकारी हटाएं"</string>
+ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"डिवाइस फ़िंगरप्रिंट: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
+ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"कनेक्ट नहीं किया जा सका"</string>
+ <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"पक्का करें कि <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सही नेटवर्क से कनेक्ट किया गया है"</string>
+ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"डिवाइस से जोड़ें"</string>
+ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"वाई-फ़ाई से जोड़ने का कोड"</string>
+ <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"दूसरे डिवाइस से जोड़ा नहीं जा सका"</string>
+ <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"पक्का करें कि आपका डिवाइस और दूसरा डिवाइस, दाेनाें एक ही नेटवर्क से जुड़े हैं."</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"क्यूआर कोड स्कैन करके, वाई-फ़ाई से डिवाइस को जोड़ें"</string>
+ <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"डिवाइस जोड़ा जा रहा है…"</string>
+ <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"डिवाइस को जोड़ा नहीं जा सका. शायद, क्यूआर कोड ठीक नहीं था या फिर आपका डिवाइस और दूसरा डिवाइस, दाेनाें एक ही नेटवर्क से नहीं जुड़े हैं."</string>
+ <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"आईपी पता और पोर्ट"</string>
+ <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"क्यूआर कोड स्कैन करें"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"क्यूआर कोड स्कैन करके, वाई-फ़ाई से डिवाइस को जोड़ें"</string>
+ <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"गड़बड़ी की रिपोर्ट का शॉर्टकट"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"गड़बड़ी की रिपोर्ट लेने के लिए पावर मेन्यू में कोई बटन दिखाएं"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"स्क्रीन को चालू रखें"</string>
@@ -282,6 +255,8 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ब्लूटूथ से आवाज़ के नियंत्रण की सुविधा रोकें"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche चालू करें"</string>
+ <!-- no translation found for enhanced_connectivity (7201127377781666804) -->
+ <skip />
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ब्लूटूथ एवीआरसीपी वर्शन"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ब्लूटूथ AVRCP वर्शन चुनें"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ब्लूटूथ का MAP वर्शन"</string>
@@ -325,10 +300,8 @@
<string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"हार्डवेयर से तेज़ी लाने के लिए टेदर करने की सुविधा मौजूद होने पर उसका इस्तेमाल करें"</string>
<string name="adb_warning_title" msgid="7708653449506485728">"USB डीबग करने की अनुमति दें?"</string>
<string name="adb_warning_message" msgid="8145270656419669221">"USB डीबग करने का मकसद केवल डेवेलप करना है. इसका इस्तेमाल आपके कंप्‍यूटर और आपके डिवाइस के बीच डेटा को कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप इंस्‍टॉल करने और लॉग डेटा पढ़ने के लिए करें."</string>
- <!-- no translation found for adbwifi_warning_title (727104571653031865) -->
- <skip />
- <!-- no translation found for adbwifi_warning_message (8005936574322702388) -->
- <skip />
+ <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डीबग करने की अनुमति देना चाहते हैं?"</string>
+ <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डीबग करने का मकसद सिर्फ़ डेवलपमेंट करना है. इसका इस्तेमाल, आपके कंप्यूटर और डिवाइस के बीच डेटा कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप्लिकेशन इंस्टॉल करने, और लॉग डेटा पढ़ने के लिए करें."</string>
<string name="adb_keys_warning_message" msgid="2968555274488101220">"उन सभी कंप्यूटरों से USB डीबग करने की पहुंचर रद्द करें, जिन्हें आपने पहले इसकी मंज़ूरी दी थी?"</string>
<string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिंग की अनुमति दें?"</string>
<string name="dev_settings_warning_message" msgid="37741686486073668">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्‍थित ऐप्लिकेशन को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string>
@@ -337,6 +310,8 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"बिना नाम वाले ब्लूटूथ डिवाइस (केवल MAC पते वाले) दिखाए जाएंगे"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"दूर के डिवाइस पर आवाज़ बहुत बढ़ जाने या उससे नियंत्रण हटने जैसी समस्याएं होने पर, यह ब्लूटूथ के ज़रिए आवाज़ के नियंत्रण की सुविधा रोक देता है."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ब्लूटूथ सेटिंग में Gabeldorsche सुविधा को चालू करता है."</string>
+ <!-- no translation found for enhanced_connectivity_summary (1576414159820676330) -->
+ <skip />
<string name="enable_terminal_title" msgid="3834790541986303654">"स्थानीय टर्मिनल"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"लोकल शेल तक पहुंचने की सुविधा देने वाले टर्मिनल ऐप को चालू करें"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"एचडीसीपी जाँच"</string>
@@ -383,6 +358,9 @@
<string name="track_frame_time" msgid="522674651937771106">"प्रोफ़ाइल HWUI रेंडरिंग"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"जीपीयू डीबग लेयर चालू करें"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"डीबग ऐप के लिए जीपीयू डीबग लेयर लोड करने दें"</string>
+ <!-- no translation found for enable_verbose_vendor_logging (1196698788267682072) -->
+ <skip />
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"गड़बड़ियों की रिपोर्ट में खास डिवाइस से जुड़े वेंडर लॉग शामिल करें. इन लॉग में निजी जानकारी, बैटरी का ज़्यादा इस्तेमाल, और/या डिवाइस की मेमोरी ज़्यादा इस्तेमाल करने की जानकारी हो सकती है."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"विंडो एनिमेशन स्‍केल"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ट्रांज़िशन एनिमेशन स्‍केल"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"एनिमेटर अवधि स्केल"</string>
@@ -441,8 +419,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"लाल रंग पहचान न पाना (लाल-हरा)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"नीला रंग पहचान न पाना (नीला-पीला)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रंग सुधार"</string>
- <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (6178138727195403796) -->
- <skip />
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"रंग में सुधार करने की सेटिंग, वर्णान्धता (कलर ब्लाइंडनेस) वाले लोगों को ज़्यादा सटीक रंग देखने में मदद करती है"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> के द्वारा ओवरराइड किया गया"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"बैटरी करीब <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी"</string>
@@ -461,27 +438,19 @@
<string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा चलने लायक बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा चलने लायक बैटरी बची है"</string>
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (137330009791560774) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (145489081521468132) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1070562682853942350) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4429259621177089719) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7703677921000858479) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4374784375644214578) -->
- <skip />
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"फ़ोन जल्द ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"टैबलेट जल्द ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"डिवाइस जल्द ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="4429259621177089719">"फ़ोन जल्द ही बंद हो सकता है (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"टैबलेट जल्द ही बंद हो सकता है (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"डिवाइस जल्द ही बंद हो सकता है (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"चार्ज पूरा होने में <xliff:g id="TIME">%1$s</xliff:g> बचा है"</string>
<string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज हो रही है"</string>
- <!-- no translation found for battery_info_status_charging_fast (8027559755902954885) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_slow (3190803837168962319) -->
- <skip />
+ <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"तेज़ चार्ज हो रही है"</string>
+ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"धीरे चार्ज हो रही है"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"चार्ज नहीं हो रही है"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"प्लग इन है, अभी चार्ज नहीं हो सकती"</string>
<string name="battery_info_status_full" msgid="4443168946046847468">"पूरी"</string>
@@ -539,6 +508,9 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"हर बार पूछें"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"जब तक आप इसे बंद नहीं करते"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अभी-अभी"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"यह डिवाइस"</string>
+ <!-- no translation found for media_transfer_this_device_name (2716555073132169240) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
+ <!-- no translation found for media_transfer_wired_device_name (4447880899964056007) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 28a88582db82..a3d1b95352e7 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Onemogući apsolutnu glasnoću"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Omogući Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Poboljšana povezivost"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Verzija AVRCP-a za Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Odaberite verziju AVRCP-a za Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Verzija MAP-a za Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Prikazivat će se Bluetooth uređaji bez naziva (samo MAC adrese)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Onemogućuje Bluetoothovu značajku apsolutne glasnoće ako udaljeni uređaji imaju poteškoća sa zvukom, kao što su neprihvatljiva glasnoća ili nepostojanje kontrole"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Omogućuje nizove značajke Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Omogućuje značajku Poboljšana povezivost."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Omogući aplikaciju terminala koja nudi pristup lokalnoj ovojnici"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP provjera"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil HWUI generiranja"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Omogući slojeve za otklanjanje pogrešaka GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Omogućite učitavanje slojeva za otklanjanje pogrešaka GPU-a za aplikacije za otklanjanje pogrešaka"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Omogući opširni zapisnik"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Uključite dodatne zapisnike dobavljača pojedinog uređaja u izvješća o programskoj pogrešci koja mogu sadržavati privatne podatke, trošiti više baterije i/ili zauzeti više prostora za pohranu."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Brzina animacije prozora"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Brzina animacije prijelaza"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Razmjer duljine animatora"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo sad"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ovaj uređaj"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 61433be1549c..e1c49c8aff3a 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Név nélküli Bluetooth-eszközök megjelenítése"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Abszolút hangerő funkció letiltása"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"A Gabeldorsche engedélyezése"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Enhanced Connectivity"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"A Bluetooth AVRCP-verziója"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"A Bluetooth AVRCP-verziójának kiválasztása"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"A Bluetooth MAP-verziója"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Név nélküli Bluetooth-eszközök jelennek meg (csak MAC-címekkel)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Letiltja a Bluetooth abszolút hangerő funkcióját a távoli eszközökkel kapcsolatos hangerőproblémák – például elfogadhatatlanul magas vagy nem vezérelhető hangerő – esetén."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Engedélyezi a Bluetooth Gabeldorsche funkcióit."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Bekapcsolja az Enhanced Connectivity funkciót."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Helyi végpont"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Végalkalmazás engedélyezése a helyi rendszerhéj eléréséhez"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ellenőrzés"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil HWUI-renderelése"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU-hibakeresési rétegek engedélyezése"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU-hibakeresési rétegek betöltésének engedélyezése"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Részletes szolgáltatói naplózás engedélyezése"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"További eszközspecifikus szolgáltatói naplók felvétele a hibajelentésekbe. Ezek a naplók tartalmazhatnak privát információkat, ezenkívül előfordulhat, hogy jobban merítik az akkumulátort, illetve nagyobb tárhelyet foglalnak el."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Ablakanimáció tempója"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Áttűnési animáció tempója"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animáció tempója"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Mindig kérdezzen rá"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ez az eszköz"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hangszórója"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 2e39f2cfdcb7..db1748dff35d 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Ցուցադրել Bluetooth սարքերն առանց անունների"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Անջատել ձայնի բացարձակ ուժգնությունը"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Միացնել Gabeldorsche-ը"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Տվյալների լավացված փոխանակում"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP տարբերակը"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Ընտրել Bluetooth AVRCP տարբերակը"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-ի տարբերակ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth սարքերը կցուցադրվեն առանց անունների (միայն MAC հասցեները)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Կասեցնում է Bluetooth-ի ձայնի բացարձակ ուժգնության գործառույթը՝ հեռավոր սարքերի հետ ձայնի ուժգնությանը վերաբերող խնդիրներ ունենալու դեպքում (օրինակ՝ երբ ձայնի ուժգնությունն անընդունելի է կամ դրա կառավարումը հնարավոր չէ):"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Միացնել Bluetooth Gabeldorsche գործառույթի զտիչը"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Միացնում է «Տվյալների լավացված փոխանակում» գործառույթը։"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Տեղային տերմինալ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Միացնել տերմինալային հավելվածը, որն առաջարկում է մուտք տեղային խեցի"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ստուգում"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Պրոֆիլի HWUI արտապատկերում"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Միացնել GPU վրիպազերծման շերտերը"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Թույլատրել GPU վրիպազերծման շերտերի բեռնումը վրիպազերծման հավելվածների համար"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Մատակարարի մանրամասն գրանցամատյան"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Վրիպակների հաշվետվություններում ներառել կոնկրետ սարքի վերաբերյալ մատակարարի լրացուցիչ մատյանները։ Դա կարող է պարունակել խիստ անձնական տեղեկություններ, ավելի արագ սպառել մարտկոցի լիցքը և/կամ ավելի շատ տարածք օգտագործել։"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Պատուհանի շարժապատկերի սանդղակ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Անցումային շարժական սանդղակ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Շարժանկարի տևողության սանդղակ"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Հարցնել ամեն անգամ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Մինչև չանջատեք"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Այս սարքը"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Հեռախոսի բարձրախոս"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index b75fa357b938..02500ef2b361 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Tampilkan perangkat Bluetooth tanpa nama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Nonaktifkan volume absolut"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktifkan Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Konektivitas Yang Disempurnakan"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Pilih Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versi MAP Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Perangkat Bluetooth tanpa nama (hanya alamat MAC) akan ditampilkan"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Menonaktifkan fitur volume absolut Bluetooth jika ada masalah volume dengan perangkat jarak jauh, misalnya volume terlalu keras atau kurangnya kontrol."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Mengaktifkan stack fitur Gabeldorsche Bluetooth."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Mengaktifkan fitur Konektivitas Yang Disempurnakan."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal lokal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktifkan aplikasi terminal yang menawarkan akses kerangka lokal"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Pemeriksaan HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Rendering HWUI profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktifkan lapisan debug GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Izinkan memuat lapisan debug GPU untuk aplikasi debug"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktifkan logging vendor panjang"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Sertakan log vendor khusus perangkat tambahan dalam laporan bug, yang mungkin berisi informasi pribadi, menggunakan lebih banyak baterai, dan/atau menggunakan lebih banyak ruang penyimpanan."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animasi jendela"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animasi transisi"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala durasi animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Selalu tanya"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Perangkat ini"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ponsel"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat &amp; aktifkan kembali"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index c75c689874c5..7a7ba4c70e34 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Sýna Bluetooth-tæki án heita"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Slökkva á samstillingu hljóðstyrks"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Virkja Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Aukin tengigeta"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP-útgáfa"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Velja Bluetooth AVRCP-útgáfu"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-útgáfa"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-tæki án heita (aðeins MAC-vistfang) verða birt"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Slekkur á samstillingu Bluetooth-hljóðstyrks ef vandamál koma upp með hljóðstyrk hjá fjartengdum tækjum, svo sem of hár hljóðstyrkur eða erfiðleikar við stjórnun."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Kveikir á eiginleikastafla Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Virkjar eiginleika aukinnar tengigetu."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Staðbundin skipanalína"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Virkja skipanalínuforrit sem leyfir staðbundinn skeljaraðgang"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-athugun"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-teiknun prófíls"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Virkja villuleit skják."</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Leyfa villuleit skjákorts fyrir villuleit forrita"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Nákvæm skráning söluaðila"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"Kvarði gluggahreyfinga"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Lengd hreyfiumbreytinga"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Tímalengd hreyfiáhrifa"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spyrja í hvert skipti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Þetta tæki"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Símahátalari"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index f0dba684f757..01d7a65622aa 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostra dispositivi Bluetooth senza nome"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Disattiva volume assoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Attiva Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Connettività migliorata"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versione Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Seleziona versione Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versione Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Verranno mostrati solo dispositivi Bluetooth senza nome (solo indirizzo MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Disattiva la funzione del volume assoluto Bluetooth in caso di problemi con il volume dei dispositivi remoti, ad esempio un volume troppo alto o la mancanza di controllo"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Consente di attivare lo stack delle funzionalità Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Consente di attivare la funzionalità Connettività migliorata."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminale locale"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Abilita l\'app Terminale che offre l\'accesso alla shell locale"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Verifica HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Rendering HWUI profilo"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Attiva livelli debug GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Consenti caricamento livelli debug GPU per app di debug"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Attiva reg. dettagl. fornitori"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Includi log aggiuntivi di fornitori relativi a un dispositivo specifico nelle segnalazioni di bug che potrebbero contenere informazioni private, causare un maggior consumo della batteria e/o utilizzare più spazio di archiviazione."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Scala animazione finestra"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Scala animazione transizione"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Scala durata animatore"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Chiedi ogni volta"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Questo dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlante telefono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 524a87d282f7..49929d4a2fe0 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"‏הצגת מכשירי Bluetooth ללא שמות"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"השבת עוצמת קול מוחלטת"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"‏הפעלת Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"קישוריות משופרת"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"‏Bluetooth גרסה AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"‏בחר Bluetooth גרסה AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"‏גרסת Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"‏יוצגו מכשירי Bluetooth ללא שמות (כתובות MAC בלבד)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"‏משבית את תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"‏הפעלת מקבץ הפיצ\'רים של Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"הפעלה של תכונת הקישוריות המשופרת."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"מסוף מקומי"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"הפעל אפליקציית מסוף המציעה גישה מקומית למעטפת"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"‏בדיקת HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"‏עיבוד פרופיל ב-HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"‏הפעלת שכבות לניפוי באגים ב-GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"‏טעינת שכבות לניפוי באגים ב-GPU לאפליקציות ניפוי באגים"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"הפעלת רישום ספקים מפורט ביומן"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"הכללת יומני ספקים נוספים, ספציפיים למכשירים, בדוחות על באגים, שעשויים להכיל מידע פרטי, לצרוך יותר מהסוללה ו/או להשתמש ביותר אחסון."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"קנה מידה לאנימציה של חלון"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"קנה מידה לאנימציית מעבר"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"קנה מידה למשך זמן אנימציה"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"שאל בכל פעם"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"המכשיר הזה"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"רמקול של טלפון"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index acefe20b423c..c7380f64d0cb 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth デバイスを名前なしで表示"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"絶対音量を無効にする"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche を有効にする"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"接続強化"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP バージョン"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP バージョンを選択する"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP バージョン"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth デバイスを名前なしで(MAC アドレスのみで)表示します"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"リモートデバイスで音量に関する問題(音量が大きすぎる、制御できないなど)が発生した場合に、Bluetooth の絶対音量の機能を無効にする"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche 機能スタックを有効にします。"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"接続強化機能を有効にします。"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ローカルターミナル"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ローカルシェルアクセスを提供するターミナルアプリを有効にします"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCPチェック"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI レンダリングのプロファイル作成"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU デバッグレイヤの有効化"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"デバッグアプリに GPU デバッグレイヤの読み込みを許可"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ベンダーの詳細なロギングを有効にする"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"バグレポートには、その他のデバイス固有のベンダーログが含まれます。これには、非公開の情報が含まれることがあります。また、電池やストレージの使用量が増えることもあります。"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"ウィンドウアニメスケール"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"トランジションアニメスケール"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator再生時間スケール"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"毎回確認"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"このデバイス"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"スマートフォンのスピーカー"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index ddc46adc114e..43a52f367f00 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-მოწყობილობების ჩვენება სახელების გარეშე"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ხმის აბსოლუტური სიძლიერის გათიშვა"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche-ის ჩართვა"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"კავშირის გაძლიერებული შესაძლებლობა"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth-ის AVRCP-ის ვერსია"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"აირჩიეთ Bluetooth-ის AVRCP-ის ვერსია"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-ის ვერსია"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-მოწყობილობები ნაჩვენები იქნება სახელების გარეშე (მხოლოდ MAC-მისამართები)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"გათიშავს Bluetooth-ის ხმის აბსოლუტური სიძლიერის ფუნქციას დისტანციურ მოწყობილობებზე ხმასთან დაკავშირებული ისეთი პრობლემების არსებობის შემთხვევაში, როგორიცაა ხმის დაუშვებლად მაღალი სიძლიერე ან კონტროლის შეუძლებლობა."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ჩართავს Bluetooth Gabeldorsche-ის ფუნქციების დასტას."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ჩართავს კავშირის გაძლიერებული შესაძლებლობის ფუნქციას."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ადგილობრივი ტერმინალი"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ლოკალურ გარსზე წვდომის ტერმინალური აპლიკაციის ჩართვა"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP შემოწმება"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"პროფილის HWUI რენდერი"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU-ს შეცდომების გამართვის შრეების ჩართვა"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"გასამართი აპებისთვის GPU-ს შეცდომების გამართვის შრეების გაშვების დაშვება"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ჟურნალებში მომწოდებელთა დაწვრილებითი აღრიცხვის ჩართვა"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"გამყიდველის მოწყობილობისთვის სპეციფიკური დამატებითი ჟურნალები შევიდეს სისტემის ხარვეზის ანგარიშებში, რომლებიც შეიძლება შეიცავდეს პირად ინფორმაციას, ხარჯავდეს ბატარეის მეტ მუხტს და/ან იყენებდეს მეტ მეხსიერებას."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"ფანჯარა: მასშტაბი"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"გადასვლის მასშტაბი"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ანიმაციების ხანგრძლივობის მასშტაბი"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ყოველთვის მკითხეთ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ახლახან"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ეს მოწყობილობა"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ტელეფონის დინამიკი"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 47babb197460..2b2093b543b0 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth құрылғыларын атаусыз көрсету"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Абсолютті дыбыс деңгейін өшіру"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche функциясын іске қосу"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Жетілдірілген байланыс"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP нұсқасы"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP нұсқасын таңдау"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP нұсқасы"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth құрылғылары атаусыз (тек MAC мекенжайымен) көрсетіледі"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Қашықтағы құрылғыларда дыбыстың тым қатты шығуы немесе реттеуге келмеуі сияқты дыбыс деңгейіне қатысты мәселелер туындағанда, Bluetooth абсолютті дыбыс деңгейі функциясын өшіреді."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche функциясы стегін қосады."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Жетілдірілген байланыс функциясын қосады."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Жергілікті терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Жергілікті шелл-код қол жетімділігін ұсынатын терминалды қолданбаны қосу"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP тексеру"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Профиль бойынша HWUI рендерингі"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU жөндеу қабаттарын қосу"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU жөндеу қабаттарының жүктелуіне рұқсат ету"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Жеткізушілерді журналға тіркеу"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Қате туралы есепте қызмет көрсетушінің құрылғыға қатысты қосымша ақпаратын қамту. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Терезе анимациясының өлшемі"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Ауысу анимациясының өлшемі"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Аниматор ұзақтығы"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Әрдайым сұрау"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Осы құрылғы"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефон динамигі"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index f62408d5aec1..337bb8b6b70f 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"បង្ហាញ​ឧបករណ៍​ប្ល៊ូធូស​គ្មានឈ្មោះ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"បិទកម្រិតសំឡេងលឺខ្លាំង"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"បើក Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"ការតភ្ជាប់​ដែលបានធ្វើឱ្យប្រសើរឡើង"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"កំណែប្ល៊ូធូស AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ជ្រើសរើសកំណែប្ល៊ូធូស AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"កំណែ​ប៊្លូធូស MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"​ឧបករណ៍​ប្ល៊ូធូសគ្មានឈ្មោះ​ (អាសយដ្ឋាន MAC តែប៉ុណ្ណោះ) នឹង​បង្ហាញ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"បិទមុខងារកម្រិតសំឡេងឮខ្លាំងពេលភ្ជាប់ប៊្លូធូសក្នុងករណីមានបញ្ហាជាមួយឧបករណ៍បញ្ជាពីចម្ងាយ ដូចជាកម្រិតសំឡេងឮខ្លាំងដែលមិនអាចទទួលយកបាន ឬខ្វះការគ្រប់គ្រង។"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"បើកជង់​មុខងារ​ប៊្លូធូស Gabeldorsche។"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"បើក​មុខងារ​ការតភ្ជាប់​ដែលបានធ្វើឱ្យប្រសើរឡើង។"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ស្ថានីយ​មូលដ្ឋាន"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"បើក​កម្មវិធី​ស្ថានីយ​ដែល​ផ្ដល់​ការ​ចូល​សែល​មូលដ្ឋាន"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"ពិនិត្យ HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"ការបំប្លែង​កម្រងព័ត៌មាន HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"បើក​ស្រទាប់​ជួសជុល GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"អនុញ្ញាតឱ្យ​ផ្ទុក​ស្រទាប់​ជួស​ជុល GPU សម្រាប់​កម្មវិធី​ជួសជុល"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"បើកកំណត់ហេតុរៀបរាប់អំពីអ្នកលក់"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"រួមមានកំណត់​ហេតុបន្ថែមអំពី​អ្នកលក់ឧបករណ៍ជាក់លាក់​នៅក្នុងរបាយការណ៍​អំពីបញ្ហា ដែលអាច​មានព័ត៌មាន​ឯកជន ប្រើប្រាស់​ថ្មច្រើនជាងមុន និង/ឬប្រើប្រាស់​ទំហំផ្ទុកច្រើនជាងមុន។"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"មាត្រដ្ឋាន​ចលនា​វិនដូ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"មាត្រដ្ឋាន​ដំណើរ​ផ្លាស់ប្ដូរ​ចលនា"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"មាត្រដ្ឋាន​រយៈពេល​នៃ​កម្មវិធី​ចលនា"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"សួរគ្រប់ពេល"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"រហូតទាល់តែ​អ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"អម្បាញ់មិញ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ឧបករណ៍នេះ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ឧបករណ៍​បំពង​សំឡេង​ទូរសព្ទ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មាន​បញ្ហា​ក្នុងការ​ភ្ជាប់។ បិទ រួច​បើក​ឧបករណ៍​វិញ"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍​សំឡេងប្រើខ្សែ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 39d6069b67a5..926c98a605db 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ಹೆಸರುಗಳಿಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ಸಂಪೂರ್ಣ ವಾಲ್ಯೂಮ್‌ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"ವರ್ಧಿತ ಸಂಪರ್ಕ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ಬ್ಲೂಟೂತ್ AVRCP ಆವೃತ್ತಿ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ಬ್ಲೂಟೂತ್ AVRCP ಆವೃತ್ತಿಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ಬ್ಲೂಟೂತ್ MAP ಆವೃತ್ತಿ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ಹೆಸರುಗಳಿಲ್ಲದ (ಕೇವಲ MAC ವಿಳಾಸಗಳು ಮಾತ್ರ) ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ರಿಮೋಟ್ ಸಾಧನಗಳಲ್ಲಿ ಕಂಡುಬರುವ ಸ್ವೀಕಾರಾರ್ಹವಲ್ಲದ ಜೋರಾದ ವಾಲ್ಯೂಮ್ ಅಥವಾ ನಿಯಂತ್ರಣದ ಕೊರತೆಯಂತಹ ವಾಲ್ಯೂಮ್ ಸಮಸ್ಯೆಗಳಂತಹ ಸಂದರ್ಭದಲ್ಲಿ ಬ್ಲೂಟೂತ್‍ನ ನಿಚ್ಚಳ ವಾಲ್ಯೂಮ್ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ಬ್ಲೂಟೂತ್ Gabeldorsche ವೈಶಿಷ್ಟ್ಯದ ಸ್ಟ್ಯಾಕ್‌ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ವರ್ಧಿತ ಸಂಪರ್ಕ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ಸ್ಥಳೀಯ ಟರ್ಮಿನಲ್"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ಸ್ಥಳೀಯ ಶೆಲ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುವ ಟರ್ಮಿನಲ್ ಅಪ್ಲಿಕೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"ಪ್ರೊಫೈಲ್ HWUI ಸಲ್ಲಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ಡೀಬಗ್ ಲೇಯರ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ GPU ಡೀಬಗ್ ಲೇಯರ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸಿ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ವೆರ್‌ಬೋಸ್ ವೆಂಡರ್ ಲಾಗಿಂಗ್‌ ಆನ್"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"Window ಅನಿಮೇಶನ್ ಸ್ಕೇಲ್‌"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ಪರಿವರ್ತನೆ ಅನಿಮೇಶನ್ ಸ್ಕೇಲ್‌"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ಅನಿಮೇಟರ್ ಅವಧಿಯ ಪ್ರಮಾಣ"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ಈ ಸಾಧನ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ಫೋನ್ ಸ್ಪೀಕರ್"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 1ac029cd9cfa..991bc22b6840 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"이름이 없는 블루투스 기기 표시"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"절대 볼륨 사용 안함"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche 사용 설정"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"향상된 연결"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"블루투스 AVRCP 버전"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"블루투스 AVRCP 버전 선택"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"블루투스 MAP 버전"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"이름이 없이 MAC 주소만 있는 블루투스 기기 표시"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"참기 어려울 정도로 볼륨이 크거나 제어가 되지 않는 등 원격 기기에서 볼륨 문제가 발생할 경우 블루투스 절대 볼륨 기능을 사용 중지"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"블루투스 Gabeldorsche 기능 스택을 사용 설정합니다."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"향상된 연결 기능을 사용 설정합니다."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"로컬 터미널"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"로컬 셸 액세스를 제공하는 터미널 앱 사용"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP 확인"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"프로필 HWUI 렌더링"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU 디버그 레이어 사용 설정"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"디버그 앱에 GPU 디버그 레이어 로드 허용"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"상세 공급업체 로깅 사용 설정"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"버그 신고에 추가적인 기기별 공급업체 로그를 포함합니다. 여기에는 개인정보가 포함될 수 있으며, 배터리 또는 저장공간 사용량이 늘어날 수 있습니다."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"창 애니메이션 배율"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"전환 애니메이션 배율"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 길이 배율"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"항상 확인"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"이 기기"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"휴대전화 스피커"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 2070056fad14..d6ed0743929e 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -26,7 +26,7 @@
<string name="wifi_disconnected" msgid="7054450256284661757">"Ажыратылды"</string>
<string name="wifi_disabled_generic" msgid="2651916945380294607">"Өчүрүлгөн"</string>
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP конфигурациясы бузулду"</string>
- <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Тармактын сапаты начар болгондуктан туташкан жок"</string>
+ <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Тармактын сапаты начар болгондуктан, туташкан жок"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"WiFi туташуусу бузулду"</string>
<string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Аутентификация маселеси бар"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Туташпай жатат"</string>
@@ -117,7 +117,7 @@
<string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Жок"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Жупташканда байланыштарыңыз менен чалуу таржымалыңызды пайдалана аласыз."</string>
<string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> менен жупташуу мүмкүн эмес."</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PIN же код туура эмес болгондуктан <xliff:g id="DEVICE_NAME">%1$s</xliff:g> туташуу мүмкүн эмес."</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PIN же код туура эмес болгондуктан, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> туташуу мүмкүн эмес."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> менен байланышуу мүмкүн эмес."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"Жупташтырууну <xliff:g id="DEVICE_NAME">%1$s</xliff:g> четке какты."</string>
<string name="bluetooth_talkback_computer" msgid="3736623135703893773">"Компьютер"</string>
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Үндүн абсолюттук деңгээли өчүрүлсүн"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche функциясын иштетүү"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Жакшыртылган туташуу"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP версиясы"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP версиясын тандоо"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP версиясы"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Аталышсыз Bluetooth түзмөктөрү (MAC даректери менен гана) көрсөтүлөт"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Алыскы түзмөктөр өтө катуу добуш чыгарып же көзөмөлдөнбөй жатса Bluetooth \"Үндүн абсолюттук деңгээли\" функциясын өчүрөт."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche функциясынын топтомун иштетет."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Жакшыртылган туташуу функциясын иштетет."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Жергиликтүү терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Жергиликтүү буйрук кабыгын сунуштаган терминалга уруксат берүү"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP текшерүү"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI профили түзүлүүдө"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетүү"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетет"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Кызмат көрсөтүүчүнү оозеки киргизүүнү иштетет"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Түзмөккө байланыштуу кызмат көрсөтүүчүнүн кирүүлөрү боюнча мүчүлүштүк тууралуу кабар берүү камтылсын. Анда купуя маалымат көрсөтүлүп, батарея тезирээк отуруп жана/же сактагычтан көбүрөөк орун ээлениши мүмкүн."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Терезелердин анимациясы"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Өткөрүү анимацснн шкаласы"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Анимациянын узактыгы"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ар дайым суралсын"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Азыр эле"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ушул түзмөк"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефондун динамиги"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 5d504d486f7c..5f58dfb4f615 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ປິດໃຊ້ລະດັບສຽງສົມບູນ"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"ເປີດໃຊ້ Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"ການເຊື່ອມຕໍ່ທີ່ເສີມແຕ່ງແລ້ວ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ເວີຊັນ Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ເລືອກເວີຊັນ Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ເວີຊັນ Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ຈະສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່ (ທີ່ຢູ່ MAC ເທົ່ານັ້ນ)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ປິດໃຊ້ຄຸນສົມບັດລະດັບສຽງສົມບູນຂອງ Bluetooth ໃນກໍລະນີເກີດບັນຫາລະດັບສຽງສົມບູນກັບອຸປະກອນທາງໄກ ເຊັ່ນວ່າ ລະດັບສຽງດັງເກີນຍອມຮັບໄດ້ ຫຼື ຄວບຄຸມບໍ່ໄດ້."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ເປີດໃຊ້ສະແຕັກຄຸນສົມບັດ Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ເປີດນຳໃຊ້ຄຸນສົມບັດການເຊື່ອມຕໍ່ທີ່ເສີມແຕ່ງແລ້ວ"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal ໃນໂຕເຄື່ອງ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ເປີດນຳໃຊ້ແອັບຯ Terminal ທີ່ໃຫ້ການເຂົ້າເຖິງ shell ໃນໂຕເຄື່ອງໄດ້"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"ການກວດສອບ HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"ການປະມວນຜົນໂປຣໄຟລ໌ HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"ເປີດໃຊ້ຊັ້ນຂໍ້ມູນດີບັກ GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ອະນຸຍາດການໂຫລດຊັ້ນຂໍ້ມູນດີບັກ GPU ສຳລັບແອັບດີບັກ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ເປີດໃຊ້ການບັນທຶກຜູ້ຂາຍແບບລະອຽດ"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"ຮວມທັງການລາຍງານຂໍ້ຜິດພາດການເຂົ້າສູ່ລະບົບຂອງຜູ້ຂາຍສະເພາະອຸປະກອນເພີ່ມເຕີມ, ເຊິ່ງອາດມີຂໍ້ມູນສ່ວນຕົວ, ໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ ແລະ/ຫຼື ໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່ມເຕີມ."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"ຂະໜາດໜ້າ​ຈໍ​ຂອງອະນິເມຊັນ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ຂະໜາດອະນິເມຊັນ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ໄລຍະເວລາອະນິເມຊັນ"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ຖາມທຸກເທື່ອ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ອຸປະກອນນີ້"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ລຳໂພງໂທລະສັບ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 6cdb547bc40d..ce41bc5c2b78 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Rodyti „Bluetooth“ įrenginius be pavadinimų"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Išjungti didžiausią garsą"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Įgalinti „Gabeldorsche“"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Patobulintas ryšys"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"„Bluetooth“ AVRCP versija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Pasirinkite „Bluetooth“ AVRCP versiją"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"„Bluetooth“ MRK versija"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bus rodomi „Bluetooth“ įrenginiai be pavadinimų (tik MAC adresai)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Išjungiama „Bluetooth“ didžiausio garso funkcija, jei naudojant nuotolinio valdymo įrenginius kyla problemų dėl garso, pvz., garsas yra per didelis arba jo negalima tinkamai valdyti."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Įgalinama „Bluetooth Gabeldorsche“ funkcijų grupė."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Įgalinti patobulinto ryšio funkciją."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Vietinis terminalas"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Įgal. terminalo progr., siūlančią prieigą prie viet. apvalkalo"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP tikrinimas"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profilio HWUI atvaizdav."</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Įg. graf. proc. der. sl."</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Leisti įkelti graf. proc. der. sluoks. der. progr."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Įg. daugiaž. pasl. teik. reg."</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Į pranešimus apie riktą įtraukiami papildomi konkretaus įrenginio paslaugų teikėjo žurnalai, kuriuose gali būti privačios informacijos, kurie gali naudoti daugiau akumuliatoriaus energijos ir (arba) daugiau vietos saugykloje."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Lango animacijos mast."</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Animuoto perėjimo mast."</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator. trukmės skalė"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Klausti kaskart"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Šis įrenginys"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefono garsiakalbis"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 8257d5389764..7c2dfbd37bc5 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Rādīt Bluetooth ierīces bez nosaukumiem"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Atspējot absolūto skaļumu"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Iespējot Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Uzlabota savienojamība"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP versija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Atlasiet Bluetooth AVRCP versiju"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP versija"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Tiks parādītas Bluetooth ierīces bez nosaukumiem (tikai MAC adreses)."</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Atspējo Bluetooth absolūtā skaļuma funkciju skaļuma problēmu gadījumiem attālajās ierīcēs, piemēram, ja ir nepieņemami liels skaļums vai nav iespējas kontrolēt skaļumu."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Tiek iespējota funkciju grupa Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Tiek iespējota uzlabotās savienojamības funkcija."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Vietējā beigu lietotne"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Iespējot beigu lietotni, kurā piedāvāta vietējā čaulas piekļuve"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP pārbaude"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profila HWUI atveide"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Iesp. GPU atkļūd. slāņus"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Atļaut GPU atkļūd. slāņu ielādi atkļūd. lietotnēm"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Iespējot izvērsto reģistrēšanu"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Iekļaut kļūdu pārskatos konkrētas ierīces papildu nodrošinātāju žurnālus (var iekļaut privātu informāciju, patērēt vairāk akumulatora enerģijas un/vai aizņemt vairāk vietas krātuvē)."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Loga animācijas mērogs"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Pārejas animācijas mērogs"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animācijas ilguma mērogs"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vaicāt katru reizi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Šī ierīce"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Tālruņa skaļrunis"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index ae2df9a9e76f..33f8f451370b 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Прикажувај уреди со Bluetooth без имиња"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Оневозможете апсолутна јачина на звук"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Овозможи Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Подобрена поврзливост"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Верзија Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Изберете верзија Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Верзија на Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Уредите со Bluetooth без имиња (само MAC-адреси) ќе се прикажуваат"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Ја оневозможува карактеристиката за апсолутна јачина на звук преку Bluetooth во случај кога ќе настанат проблеми со далечинските уреди, како на пр., неприфатливо силен звук или недоволна контрола."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ја овозможува функцијата Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ја овозможува функцијата „Подобрена поврзливост“."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локален терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Овозможи апликација на терминал што овозможува локален пристап кон школка."</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Проверување HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-прикажување профил"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Овозм. отстр. греш. на GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Дозволи отстр. греш. на GPU за поправање апликации"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Опширна евиденција на продавачи"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Вклучува дополнителна евиденција на продавачи во извештаите за грешки за конкретен уред, којашто може да содржи приватни податоци, повеќе да ја користи батеријата и/или да користи повеќе капацитет."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Опсег на аним. на прозор."</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Опсег на преодна анимац."</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Скала за времетраење на аниматор"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Секогаш прашувај"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Неодамнешни"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Овој уред"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефонски звучник"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 8727755dc788..a360fcde9844 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -206,60 +206,33 @@
<string name="enable_adb" msgid="8072776357237289039">"USB ഡീബഗ്ഗിംഗ്"</string>
<string name="enable_adb_summary" msgid="3711526030096574316">"USB കണ‌ക്റ്റുചെയ്‌തിരിക്കുമ്പോഴുള്ള ഡീബഗ് മോഡ്"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"USB ഡീബഗ്ഗിംഗ് അംഗീകാരം പിൻവലിക്കുക"</string>
- <!-- no translation found for enable_adb_wireless (6973226350963971018) -->
- <skip />
- <!-- no translation found for enable_adb_wireless_summary (7344391423657093011) -->
- <skip />
- <!-- no translation found for adb_wireless_error (721958772149779856) -->
- <skip />
- <!-- no translation found for adb_wireless_settings (2295017847215680229) -->
- <skip />
- <!-- no translation found for adb_wireless_list_empty_off (1713707973837255490) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_title (6982904096137468634) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_summary (3729901496856458634) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_title (1122590300445142904) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_summary (6370414511333685185) -->
- <skip />
- <!-- no translation found for adb_paired_devices_title (5268997341526217362) -->
- <skip />
- <!-- no translation found for adb_wireless_device_connected_summary (3039660790249148713) -->
- <skip />
- <!-- no translation found for adb_wireless_device_details_title (7129369670526565786) -->
- <skip />
- <!-- no translation found for adb_device_forget (193072400783068417) -->
- <skip />
- <!-- no translation found for adb_device_fingerprint_title_format (291504822917843701) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_title (664211177427438438) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_message (9213896700171602073) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_title (7141739231018530210) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_pairing_code_label (3639239786669722731) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_title (3426758947882091735) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_msg (6611097519661997148) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_summary (8051414549011801917) -->
- <skip />
- <!-- no translation found for adb_wireless_verifying_qrcode_text (6123192424916029207) -->
- <skip />
- <!-- no translation found for adb_qrcode_pairing_device_failed_msg (6936292092592914132) -->
- <skip />
- <!-- no translation found for adb_wireless_ip_addr_preference_title (8335132107715311730) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_title (1906409667944674707) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_description (8578868049289910131) -->
- <skip />
- <!-- no translation found for keywords_adb_wireless (6507505581882171240) -->
- <skip />
+ <string name="enable_adb_wireless" msgid="6973226350963971018">"വയർലെസ് ഡീബഗ് ചെയ്യൽ"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"വൈഫൈ കണക്റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ ഡീബഗ് ചെയ്യൽ മോഡിലാക്കുക"</string>
+ <string name="adb_wireless_error" msgid="721958772149779856">"പിശക്"</string>
+ <string name="adb_wireless_settings" msgid="2295017847215680229">"വയർലെസ് ഡീബഗ് ചെയ്യൽ"</string>
+ <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ലഭ്യമായ ഉപകരണങ്ങൾ കാണാനും ഉപയോഗിക്കാനും വയർലെസ് ഡീബഗ് ചെയ്യൽ ഓണാക്കുക"</string>
+ <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR കോഡ് ഉപയോഗിച്ച് ഉപകരണം ജോടിയാക്കുക"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR കോഡ് സ്‌കാനർ ഉപയോഗിച്ച് പുതിയ ഉപകരണങ്ങൾ ജോടിയാക്കുക"</string>
+ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ജോടിയാക്കൽ കോഡ് ഉപയോഗിച്ച് ഉപകരണം ജോടിയാക്കുക"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ആറക്ക കോഡ് ഉപയോഗിച്ച് പുതിയ ഉപകരണങ്ങൾ ജോടിയാക്കുക"</string>
+ <string name="adb_paired_devices_title" msgid="5268997341526217362">"ജോടിയാക്കിയ ഉപകരണങ്ങൾ"</string>
+ <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"നിലവിൽ കണക്റ്റ് ചെയ്‌തത്"</string>
+ <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"ഉപകരണ വിശദാംശങ്ങൾ"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"മറക്കുക"</string>
+ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"ഉപകരണ ഫിംഗർപ്രിന്റ്: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
+ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"കണക്റ്റ് ചെയ്യാനായില്ല"</string>
+ <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"ശരിയായ നെറ്റ്‌വർക്കിൽ ആണ് <xliff:g id="DEVICE_NAME">%1$s</xliff:g> കണക്റ്റ് ചെയ്‌തിട്ടുള്ളത് എന്ന് ഉറപ്പാക്കുക"</string>
+ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"ഉപകരണവുമായി ജോടിയാക്കുക"</string>
+ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"വൈഫൈ ജോടിയാക്കൽ കോഡ്"</string>
+ <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"ജോടിയാക്കാനായില്ല"</string>
+ <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"ഒരേ നെറ്റ്‌വർക്കിൽ തന്നെയാണ് ഉപകരണം കണക്റ്റ് ചെയ്‌തിട്ടുള്ളതെന്ന് ഉറപ്പാക്കുക."</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR കോഡ് സ്‌കാൻ ചെയ്‌ത് വൈഫൈയിലൂടെ ഉപകരണം ജോടിയാക്കുക"</string>
+ <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"ഉപകരണം ജോടിയാക്കുന്നു…"</string>
+ <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ഉപകരണം ജോടിയാക്കാനായില്ല. ഒന്നുകിൽ QR കോഡ് തെറ്റായിരുന്നു അല്ലെങ്കിൽ ഉപകരണം ഒരേ നെറ്റ്‌വർക്കിൽ അല്ല കണക്റ്റ് ചെയ്‌തിട്ടുള്ളത്."</string>
+ <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP വിലാസവും പോർട്ടും"</string>
+ <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR കോഡ് സ്‌കാൻ ചെയ്യുക"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR കോഡ് സ്‌കാൻ ചെയ്‌ത് വൈഫൈയിലൂടെ ഉപകരണം ജോടിയാക്കുക"</string>
+ <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"ബഗ് റിപ്പോർട്ട് കുറുക്കുവഴി"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"ബഗ് റിപ്പോർട്ട് എടുക്കുന്നതിന് പവർ മെനുവിൽ ഒരു ബട്ടൺ കാണിക്കുക"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"സജീവമായി തുടരുക"</string>
@@ -282,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ കാണിക്കുക"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"അബ്‌സൊല്യൂട്ട് വോളിയം പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche പ്രവർത്തനക്ഷമമാക്കുക"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"മെച്ചപ്പെടുത്തിയ കണക്റ്റിവിറ്റി"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP പതിപ്പ്"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP പതിപ്പ് തിരഞ്ഞെടുക്കുക"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP പതിപ്പ്"</string>
@@ -325,10 +299,8 @@
<string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"ലഭ്യമാണെങ്കിൽ \'ടെതറിംഗ് ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തൽ\' ഉപയോഗിക്കുക"</string>
<string name="adb_warning_title" msgid="7708653449506485728">"USB ഡീബഗ്ഗുചെയ്യാൻ അനുവദിക്കണോ?"</string>
<string name="adb_warning_message" msgid="8145270656419669221">"USB ഡീബഗ്ഗിംഗ് വികസന ആവശ്യകതകൾക്ക് മാത്രമുള്ളതാണ്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിനും ഉപകരണത്തിനുമിടയിൽ ഡാറ്റ പകർത്തുന്നതിനും അറിയിപ്പില്ലാതെ തന്നെ നിങ്ങളുടെ ഉപകരണത്തിൽ അപ്ലിക്കേഷനുകൾ ഇൻസ്‌റ്റാളുചെയ്യുന്നതിനും ലോഗ് ഡാറ്റ റീഡുചെയ്യുന്നതിനും ഇത് ഉപയോഗിക്കുക."</string>
- <!-- no translation found for adbwifi_warning_title (727104571653031865) -->
- <skip />
- <!-- no translation found for adbwifi_warning_message (8005936574322702388) -->
- <skip />
+ <string name="adbwifi_warning_title" msgid="727104571653031865">"വയർലെസ് ഡീബഗ് ചെയ്യൽ അനുവദിക്കണോ?"</string>
+ <string name="adbwifi_warning_message" msgid="8005936574322702388">"വയർലെസ് ഡീബഗ് ചെയ്യൽ ഡെവലപ്മെന്റ് ആവശ്യങ്ങൾക്ക് മാത്രമുള്ളതാണ്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഉപകരണത്തിലേക്കും തിരിച്ചും ഡാറ്റ പകർത്തുന്നതിനും ലോഗ് ഡാറ്റ റീഡ് ചെയ്യുന്നതിനും അറിയിപ്പില്ലാതെ നിങ്ങളുടെ ഉപകരണത്തിൽ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനും ഇത് ഉപയോഗിക്കുക."</string>
<string name="adb_keys_warning_message" msgid="2968555274488101220">"നിങ്ങൾ മുമ്പ് അംഗീകരിച്ച എല്ലാ കമ്പ്യൂട്ടറുകളിൽ നിന്നും USB ഡീബഗ്ഗുചെയ്യുന്നതിനുള്ള ആക്‌സസ്സ് പിൻവലിക്കണോ?"</string>
<string name="dev_settings_warning_title" msgid="8251234890169074553">"വികസന ക്രമീകരണങ്ങൾ അനുവദിക്കണോ?"</string>
<string name="dev_settings_warning_message" msgid="37741686486073668">"ഈ ക്രമീകരണങ്ങൾ വികസന ഉപയോഗത്തിന് മാത്രമായുള്ളതാണ്. അവ നിങ്ങളുടെ ഉപകരണവും അതിലെ അപ്ലിക്കേഷനുകളും തകരാറിലാക്കുന്നതിനോ തെറ്റായി പ്രവർത്തിക്കുന്നതിനോ ഇടയാക്കാം."</string>
@@ -337,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ (MAC വിലാസങ്ങൾ മാത്രം) പ്രദർശിപ്പിക്കും"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"അസ്വീകാര്യമായ തരത്തിൽ ഉയർന്ന വോളിയമോ ശബ്ദ നിയന്ത്രണത്തിന്റെ അഭാവമോ പോലെ, വിദൂര ഉപകരണങ്ങളുമായി ബന്ധപ്പെട്ട വോളിയം പ്രശ്നങ്ങൾ ഉണ്ടാകുന്ന സാഹചര്യത്തിൽ, Bluetooth അബ്‌സൊല്യൂട്ട് വോളിയം ഫീച്ചർ പ്രവർത്തനരഹിതമാക്കുന്നു."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche ഫീച്ചർ സ്റ്റാക്ക് പ്രവർത്തനക്ഷമമാക്കുന്നു."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"മെച്ചപ്പെടുത്തിയ കണക്റ്റിവിറ്റി ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുന്നു."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"പ്രാദേശിക ടെർമിനൽ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"പ്രാദേശിക ഷെൽ ആക്‌സസ് നൽകുന്ന ടെർമിനൽ അപ്ലിക്കേഷൻ പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP പരിശോധന"</string>
@@ -383,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI റെൻഡറിംഗ് പ്രൊഫൈൽ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ഡീബഗ് ലെയറുകൾ പ്രവർത്തനക്ഷമമാക്കൂ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ഡീബഗ് ആപ്പുകൾക്കായി GPU ഡീബഗ് ലെയറുകൾ ലോഡ് ചെയ്യാൻ അനുവദിക്കുക"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"വെർബോസ് വെണ്ടർ ലോഗ് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കൂ"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"വിൻഡോ ആനിമേഷൻ സ്‌കെയിൽ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"സംക്രമണ ആനിമേഷൻ സ്‌കെയിൽ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ആനിമേറ്റർ ദൈർഘ്യ സ്‌കെയിൽ"</string>
@@ -441,8 +417,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"പ്രോട്ടാനോമലി (ചുവപ്പ്-പച്ച)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ട്രിട്ടാനോമലി (നീല-മഞ്ഞ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
- <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (6178138727195403796) -->
- <skip />
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"വർണ്ണം ശരിയാക്കൽ, വർണ്ണാന്ധത ബാധിച്ച ആളുകൾക്ക് നിറങ്ങൾ കൂടുതൽ കൃത്യമായി കാണാൻ സഹായിക്കുന്നു"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ഉപയോഗിച്ച് അസാധുവാക്കി"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
@@ -461,27 +436,19 @@
<string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു"</string>
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (137330009791560774) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (145489081521468132) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1070562682853942350) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4429259621177089719) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7703677921000858479) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4374784375644214578) -->
- <skip />
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ഫോൺ ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ടാബ്‌ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ഉപകരണം ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="4429259621177089719">"ഫോൺ ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ടാബ്‌ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ഉപകരണം ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"പൂർണ്ണമായി ചാർജാവാൻ <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
<string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - പൂർണ്ണമായി ചാർജാവാൻ <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"അജ്ഞാതം"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ചാർജ് ചെയ്യുന്നു"</string>
- <!-- no translation found for battery_info_status_charging_fast (8027559755902954885) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_slow (3190803837168962319) -->
- <skip />
+ <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"അതിവേഗ ചാർജിംഗ്"</string>
+ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"പതുക്കെയുള്ള ചാർജിംഗ്"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ചാർജ്ജുചെയ്യുന്നില്ല"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"പ്ലഗ് ഇൻ ചെയ്‌തു, ഇപ്പോൾ ചാർജ് ചെയ്യാനാവില്ല"</string>
<string name="battery_info_status_full" msgid="4443168946046847468">"നിറഞ്ഞു"</string>
@@ -539,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"എപ്പോഴും ചോദിക്കുക"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ഇപ്പോൾ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ഈ ഉപകരണം"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ഫോൺ സ്‌പീക്കർ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്‌റ്റ് ചെയ്യുന്നതിൽ പ്രശ്‌നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index dc57b3b84e2e..c8fb2a50a5b3 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Нэргүй Bluetooth төхөөрөмжийг харуулах"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Үнэмлэхүй дууны түвшинг идэвхгүй болгох"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche-г идэвхжүүлэх"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Сайжруулсан холболт"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP хувилбар"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP хувилбарыг сонгох"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP хувилбар"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Нэргүй Bluetooth төхөөрөмжийг (зөвхөн MAC хаяг) харуулна"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Хэт чанга дуугаралт эсвэл муу тохиргоо зэрэг алсын зайн төхөөрөмжийн дуугаралттай холбоотой асуудлын үед Bluetooth-ийн үнэмлэхүй дууны түвшинг идэвхгүй болго."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche онцлогийн өрөлтийг идэвхжүүлдэг."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Сайжруулсан холболтын онцлогийг идэвхжүүлдэг."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локал терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Локал суурьт хандалт хийх боломж олгодог терминалын апп-г идэвхжүүлэх"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP шалгах"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Профайл HWUI-н буулгалт"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU дебаг хийх давхаргыг идэвхжүүлэх"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Дебаг хийх аппад GPU дебаг хийх давхарга ачааллахыг зөвшөөрөх"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Нийлүүлэгчийн дэлгэрэнгүй логийг идэвхжүүлэх"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Төхөөрөмжийн тодорхойосон нийлүүлэгчийн нэвтрэх үеийн алдааны нэмэлт мэдээг оруулах бөгөөд энэ нь хувийн мэдээлэл агуулж, батарейг илүү ашиглах болон/эсвэл хадгалах сан илүү ашиглаж болзошгүй."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Цонхны дүрс амилуулалтын далайц"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Шилжилтийн дүрс амилуулалтын далайц"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Дүрс амилуулалт үргэлжлэх далайц"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Тухай бүрд асуух"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Энэ төхөөрөмж"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Утасны чанга яригч"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 1240c5b6673a..afb88de651f5 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"नावांशिवाय ब्‍लूटूथ डिव्‍हाइस दाखवा"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"संपूर्ण आवाज बंद करा"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"गाबलडॉर्ष सुरू करा"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"वर्धित कनेक्टिव्हिटी"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ब्लूटूथ AVRCP आवृत्ती"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ब्लूटूथ AVRCP आवृत्ती निवडा"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ब्लूटूथ MAP आवृत्ती"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"नावांशिवाय ब्‍लूटूथ डीव्‍हाइस (फक्‍त MAC पत्‍ते) दाखवले जातील"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"रिमोट डिव्हाइसमध्ये सहन न होणारा मोठा आवाज किंवा नियंत्रणाचा अभाव यासारखी आवाजाची समस्या असल्यास ब्लूटूथ संपूर्ण आवाज वैशिष्ट्य बंद करते."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ब्लूटूथ गाबलडॉर्ष वैशिष्‍ट्य स्टॅक सुरू करा."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"वर्धित कनेक्टिव्हिटी वैशिष्‍ट्य सुरू करा."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"स्थानिक टर्मिनल"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"स्थानिक शेल प्रवेश देणारा टर्मिनल अ‍ॅप सुरू करा"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP तपासणी"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"प्रोफाइल HWUI रेंडरिंग"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU डीबग स्तर सुरू करा"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"डीबग अ‍ॅप्ससाठी GPU डीबग स्तर लोड करण्याची अनुमती द्या"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"व्हर्बोझ विक्रेता लॉगिंग सुरू करा"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"विंडो ॲनिमेशन स्केल"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ट्रांझिशन ॲनिमेशन स्केल"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ॲनिमेटर कालावधी स्केल"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक वेळी विचारा"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"आत्ताच"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"हे डिव्हाइस"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनचा स्पीकर"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्‍ट करण्‍यात समस्‍या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index b4c3f60143c9..2c59768cfe59 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Tunjukkan peranti Bluetooth tanpa nama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Lumpuhkan kelantangan mutlak"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Dayakan Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Kesambungan Dipertingkat"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Pilih Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versi MAP Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Peranti Bluetooth tanpa nama (alamat MAC sahaja) akan dipaparkan"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Lumpuhkan ciri kelantangan mutlak Bluetooth dalam kes isu kelantangan menggunakan peranti kawalan jauh seperti kelantangan yang sangat kuat atau tidak dapat mengawal."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Mendayakan tindanan ciri Gabeldorche Bluetooth."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Mendayakan ciri Kesambungan Dipertingkat"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal setempat"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Dayakan apl terminal yang menawarkan akses shell tempatan"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Penyemakan HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Pemaparan HWUI profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Dayakan lpsn nyhppjat GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Bnrkn pemuatan lpsn nyhppjt GPU utk apl pnyhppjtn"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Dayakn pngelogan vendor brjela"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Sertakan log tambahan vendor khusus peranti dalam laporan pepijat, yang mungkin mengandungi maklumat peribadi, menggunakan lebih banyak kuasa bateri dan/atau menggunakan lebih banyak storan."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animasi tetingkap"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animasi peralihan"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala tempoh juruanimasi"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Tanya setiap kali"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sebentar tadi"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Peranti ini"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Pembesar suara telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan &amp; hidupkan kembali peranti"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index ae8c1b9e0780..ff24590c62f3 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"အမည်မရှိသော ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသရန်"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ပကတိ အသံနှုန်း သတ်မှတ်ချက် ပိတ်ရန်"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche ကို ဖွင့်ရန်"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"အရည်အသွေးမြှင့်တင်ထားသော ချိတ်ဆက်နိုင်မှု"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ဘလူးတုသ် AVRCP ဗားရှင်း"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ဘလူးတုသ် AVRCP ဗားရှင်းကို ရွေးပါ"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ဘလူးတုသ် MAP ဗားရှင်း"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"အမည်မရှိသော (MAC လိပ်စာများသာပါသော) ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသပါမည်"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ချိတ်ဆက်ထားသည့် ကိရိယာတွင် လက်မခံနိုင်လောက်အောင် ဆူညံ သို့မဟုတ် ထိန်းညှိမရနိုင်သော အသံပိုင်းပြဿနာ ရှိခဲ့လျှင် ဘလူးတုသ် ပကတိ အသံနှုန်းကို ပိတ်ပါ။"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ဘလူးတုသ် Gabeldorsche လုပ်ဆောင်ချက်အပိုင်းကို ဖွင့်သည်။"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"အရည်အသွေးမြှင့်တင်ထားသော ချိတ်ဆက်နိုင်သည့် ဝန်ဆောင်မှုကို ဖွင့်ပါ။"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"လိုကယ်တာမီနယ်"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"local shell အသုံးပြုခွင့်ကမ်းလှမ်းသော တာမင်နယ်အပလီကေးရှင်းဖွင့်ပါ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP စစ်ဆေးမှု"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI ပရိုဖိုင် ဆောင်ရွက်ခြင်း"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU အမှားရှာ အလွှာများဖွင့်ထားပါ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"အမှားရှာအက်ပ်များအတွက် GPU အမှားရှာအလွှာများ ထည့်သွင်းခွင့်ပြုပါ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"verbose vendor မှတ်တမ်းဖွင့်ရန်"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"ချွတ်ယွင်းမှု အစီရင်ခံချက်တွင် စက်ပစ္စည်းအလိုက် ထုတ်လုပ်သူမှတ်တမ်းများကို ထည့်သွင်းခြင်းဖြင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များ ပါဝင်ခြင်း၊ ဘက်ထရီပိုသုံးခြင်း နှင့်/သို့မဟုတ် သိုလှောင်ခန်းပိုသုံးခြင်းတို့ ဖြစ်စေနိုင်သည်။"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"လှုပ်ရှားသက်ဝင်ပုံစကေး"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"သက်ဝင်အသွင်ပြောင်းခြင်း"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"လှုပ်ရှားမှုကြာချိန်စကေး"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"အမြဲမေးပါ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ဤစက်ပစ္စည်း"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ဖုန်းစပီကာ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 960398d02ba5..8c4e24153041 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Vis Bluetooth-enheter uten navn"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Slå av funksjonen for absolutt volum"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktiver Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Forbedret tilkobling"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP-versjon"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Velg Bluetooth AVRCP-versjon"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP-versjon"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-enheter uten navn (bare MAC-adresser) vises"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Slår av funksjonen for absolutt volum via Bluetooth i tilfelle det oppstår volumrelaterte problemer med eksterne enheter, for eksempel uakseptabelt høyt volum eller mangel på kontroll."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktiverer funksjonsstabelen Bluetooth Gabeldorsche"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Slår på Forbedret tilkobling-funksjonen."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokal terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktiver terminalappen som gir lokal kommandolistetilgang"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-kontroll"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-gjengivelse av profil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Slå på GPU-feilsøkingslag"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Tillat GPU-feilsøkingslag for feilsøkingsapper"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Detaljert leverandørlogging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inkluder ytterligere enhetsspesifikke leverandørlogger i feilrapporter, som kan inneholde privat informasjon, bruke mer batteri og/eller bruke mer lagringsplass."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Animasjonsskala for vindu"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Animasjonsskala for overgang"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Varighetsskala for animasjoner"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spør hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Denne enheten"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonhøyttaler"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index e11f02d0bc04..e78e8fa29fc6 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू देखाउनुहोस्"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"निरपेक्ष आवाज असक्षम गर्नुहोस्"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche सक्षम पार्नुहोस्"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"परिष्कृत जडान"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ब्लुटुथको AVRCP संस्करण"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ब्लुटुथको AVRCP संस्करण चयन गर्नुहोस्"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ब्लुटुथको MAP संस्करण"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू (MAC ठेगाना भएका मात्र) देखाइनेछ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"रिमोट यन्त्रहरूमा अस्वीकार्य चर्को आवाज वा नियन्त्रणमा कमी जस्ता आवाज सम्बन्धी समस्याहरूको अवस्थामा ब्लुटुथ निरपेक्ष आवाज सुविधालाई असक्षम गराउँछ।"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ब्लुटुथ Gabeldorsche सुविधाको स्ट्याक सक्षम पार्नुहोस्।"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"यसले परिष्कृत जडानको सुविधा सक्षम पार्छ।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"स्थानीय टर्मिनल"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"स्थानीय सेल पहुँच प्रदान गर्ने टर्मिनल अनुप्रयोग सक्षम गर्नुहोस्"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP जाँच गर्दै"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"प्रोफाइल HWUI रेन्डर गरिँदै छ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU का डिबग तहहरूलाई सक्षम पार्नुहोस्"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"डिबगसम्बन्धी अनुप्रयोगहरूका लागि GPU का डिबग तहहरूलाई लोड गर्न दिनुहोस्"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"भर्वस भेन्डर लगिङ सक्षम पार्नु…"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"विन्डो सजीविकरण स्केल"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"संक्रमण सजीविकरण मापन"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"सजीविकरण अवधि मापन"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक पटक सोध्नुहोस्"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तपाईंले निष्क्रिय नपार्दासम्म"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अहिले भर्खरै"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"यो यन्त्र"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनको स्पिकर"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि सक्रिय गर्नुहोस्"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index e79784cff206..221ba537db56 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-apparaten zonder namen weergeven"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Absoluut volume uitschakelen"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche inschakelen"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Verbeterde connectiviteit"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth-AVRCP-versie"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth-AVRCP-versie selecteren"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"MAP-versie voor bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-apparaten zonder namen (alleen MAC-adressen) worden weergegeven"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth ingeschakeld."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Hiermee wordt de functie voor verbeterde connectiviteit ingeschakeld."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokale terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Terminal-app inschakelen die lokale shell-toegang biedt"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-controle"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI-weergave van profiel"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU-foutopsporingslagen inschakelen"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Laden van GPU-foutopsporingslagen toestaan voor foutopsporingsapps"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Uitgebreide leverancierslogboeken inschakelen"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Aanvullende apparaatspecifieke leverancierslogboeken opnemen in bugrapporten. Deze kunnen privégegevens bevatten, meer batterijlading gebruiken en/of meer opslagruimte gebruiken."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Venster­animatieschaal"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Overgangs­animatieschaal"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Duur van animatieschaal"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Altijd vragen"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat je uitschakelt"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Dit apparaat"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoonspeaker"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Schakel het apparaat uit en weer in."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 7e7c22d23730..65c44cbdb88a 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ବ୍ଲୁଟୂଥ୍‍‌ ଡିଭାଇସ୍‌ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ପୂର୍ଣ୍ଣ ଭଲ୍ୟୁମ୍‌ ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"ଗାବେଲ୍‌ଡୋର୍ସ ସକ୍ରିୟ କରନ୍ତୁ"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"ଏନହାନ୍ସଡ୍ କନେକ୍ଟିଭିଟି"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ବ୍ଲୁଟୂଥ୍‌ AVRCP ଭର୍ସନ୍"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ବ୍ଲୁଟୂଥ୍‍‌ AVRCP ଭର୍ସନ୍‌"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ବ୍ଲୁଟୁଥ୍ MAP ସଂସ୍କରଣ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"(କେବଳ MAC ଠିକଣା ଥାଇ) ନାମ ବିନା ବ୍ଲୁଟୂଥ ଡିଭାଇସଗୁଡ଼ିକ ପ୍ରଦର୍ଶିତ ହେବ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ରିମୋଟ୍‌ ଡିଭାଇସ୍‌ଗୁଡ଼ିକରେ ଯଦି ଅସ୍ୱୀକାର୍ଯ୍ୟ ଭାବେ ଉଚ୍ଚ ଭଲ୍ୟୁମ୍ କିମ୍ବା ନିୟନ୍ତ୍ରଣର ଅଭାବ ପରି ଭଲ୍ୟୁମ୍ ସମସ୍ୟା ଥାଏ, ବ୍ଲୁଟୂଥ୍‌ ପୂର୍ଣ୍ଣ ଭଲ୍ୟୁମ୍ ଫିଚର୍ ଅକ୍ଷମ କରିଥାଏ।"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ବ୍ଲୁଟୁଥ୍ ଗାବେଲଡୋର୍ସ ଫିଚର୍ ଷ୍ଟକ୍ ସକ୍ଷମ କରେ।"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ଏନହାନ୍ସଡ୍ କନେକ୍ଟିଭିଟି ଫିଚର୍ ସକ୍ଷମ କରିଥାଏ।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ସ୍ଥାନୀୟ ଟର୍ମିନାଲ୍‌"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ସ୍ଥାନୀୟ ଶେଲ୍‌କୁ ଆକ‌ସେସ୍‌ ଦେଉଥିବା ଟର୍ମିନଲ୍‌ ଆପ୍‌କୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ଯାଞ୍ଚ କରୁଛି"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"ପ୍ରୋଫାଇଲ୍ HWUI ରେଣ୍ଡର୍ ହେଉଛି"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ଡିବଗ୍‌ ଲେୟର୍‌ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ଡିବଗ୍‌ ଆପ୍‌ଗୁଡ଼ିକ ପାଇଁ GPU ଡିବଗ୍‌ ଲେୟର୍‌ ଲୋଡ୍ କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ଭର୍ବୋସ ଭେଣ୍ଡର୍ ଲଗିଂ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"ୱିଣ୍ଡୋ ଆନିମେସନ୍‌ ସ୍କେଲ୍‌"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ଟ୍ରାଞ୍ଜିସନ୍‌ ଆନିମେସନ୍‌ ସ୍କେଲ୍‌"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ଆନିମେଟର୍‌ ଅବଧି ସ୍କେଲ୍‌"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ଏହି ଡିଭାଇସ୍‍"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ଫୋନ୍ ସ୍ପିକର୍"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 7279f31b35ff..ed020e8fb963 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਓ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ਪੂਰਨ ਅਵਾਜ਼ ਨੂੰ ਬੰਦ ਕਰੋ"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"ਵਿਸਤ੍ਰਿਤ ਕਨੈਕਟੀਵਿਟੀ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ ਚੁਣੋ"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP ਵਰਜਨ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਈਆਂ ਜਾਣਗੀਆਂ (ਸਿਰਫ਼ MAC ਪਤੇ)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਅਵਾਜ਼ੀ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਅਵਾਜ਼ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਅਵਾਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ।"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ਬਲੂਟੁੱਥ Gabeldorsche ਵਿਸ਼ੇਸ਼ਤਾ ਸਟੈਕ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ਵਿਸਤ੍ਰਿਤ ਕਨੈਕਟੀਵਿਟੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ਸਥਾਨਕ ਟਰਮੀਨਲ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਚਾਲੂ ਕਰੋ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਪੇਸ਼ਕਸ਼ ਕਰਦਾ ਹੈ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ਜਾਂਚ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"ਪ੍ਰੋਫਾਈਲ HWUI ਰੈਂਡਰਿੰਗ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU ਡੀਬੱਗ ਲੇਅਰਾਂ ਚਾਲੂ ਕਰੋ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"ਡੀਬੱਗ ਐਪਾਂ ਲਈ GPU ਡੀਬੱਗ ਲੇਅਰਾਂ ਨੂੰ ਲੋਡ ਹੋਣ ਦਿਓ"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ਵਰਬੋਸ ਵਿਕਰੇਤਾ ਲੌਗਿੰਗ ਚਾਲੂ ਕਰੋ"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"ਵਿੰਡੋ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ਟ੍ਰਾਂਜਿਸ਼ਨ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"ਐਨੀਮੇਟਰ ਮਿਆਦ ਸਕੇਲ"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ਹਰ ਵਾਰ ਪੁੱਛੋ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ਇਹ ਡੀਵਾਈਸ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ਫ਼ੋਨ ਦਾ ਸਪੀਕਰ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 3b12891e23df..8ab91fa517fb 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Pokaż urządzenia Bluetooth bez nazw"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Wyłącz głośność bezwzględną"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Włącz Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Lepsza obsługa połączeń"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Wersja AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Wybierz wersję AVRCP Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Wersja MAP Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Zostaną wyświetlone urządzenia Bluetooth bez nazw (tylko adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Wyłącza funkcję Głośność bezwzględna Bluetooth, jeśli występują problemy z urządzeniami zdalnymi, np. zbyt duża głośność lub brak kontroli."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Włącza funkcje Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Włącza funkcję lepszej obsługi połączeń."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal lokalny"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Włącz terminal, który umożliwia dostęp do powłoki lokalnej"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Sprawdzanie HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil renderowania HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Warstwy debugowania GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Zezwól na ładowanie warstw debugowania GPU"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Włącz szczegółowe rejestrowanie dostawcy"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animacji okna"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animacji przejścia"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala długości animacji"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Zawsze pytaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Przed chwilą"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"To urządzenie"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Głośnik telefonu"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 5e76fe00c40d..16b92e951b1e 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ativar Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectividade melhorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecionar versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versão MAP do Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Dispositivos Bluetooth sem nomes (somente endereços MAC) serão exibidos"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desativa o recurso Bluetooth de volume absoluto em caso de problemas com o volume em dispositivos remotos, como volume excessivamente alto ou falta de controle"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ativa a pilha de recursos Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ativa o recurso \"Conectividade melhorada\"."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Ativar o app terminal que oferece acesso ao shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Verificação HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Classificar renderização HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ativar camadas de depuração de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir carregamento de camadas de depuração de GPU p/ apps de depuração"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ativ. registro detal. de fornecedor"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclui mais registros de fornecedores específicos do dispositivo em relatórios de bugs, que podem conter informações privadas e usar mais bateria e/ou armazenamento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animação da janela"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animação de transição"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duração do Animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index d1b29f0cd079..f1cb1135598a 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ativar o Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conetividade melhorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versão de Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecionar versão de Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versão do MAP do Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"São apresentados os dispositivos Bluetooth sem nomes (apenas endereços MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desativa a funcionalidade de volume absoluto do Bluetooth caso existam problemas de volume com dispositivos remotos, como um volume insuportavelmente alto ou a ausência de controlo."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ativa a pilha de funcionalidades Bluetooth Gabeldorche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ativa a funcionalidade Conetividade melhorada."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Ativar aplicação terminal que oferece acesso local à shell"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Verificação HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Renderização HWUI do perfil"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ativar cam. depuração GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir carreg. cam. depuração GPU p/ dep. app"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ativ. regist. verbo. forneced."</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclua registos adicionais de fornecedores específicos de dispositivos em relatórios de erros, que podem conter informações privadas, utilizar mais bateria e/ou utilizar mais armazenamento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animação de transição"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animação de transição"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duração de animação"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até ser desativado"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altifalante do telemóvel"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 5e76fe00c40d..16b92e951b1e 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ativar Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectividade melhorada"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecionar versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versão MAP do Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Dispositivos Bluetooth sem nomes (somente endereços MAC) serão exibidos"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desativa o recurso Bluetooth de volume absoluto em caso de problemas com o volume em dispositivos remotos, como volume excessivamente alto ou falta de controle"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ativa a pilha de recursos Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ativa o recurso \"Conectividade melhorada\"."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Ativar o app terminal que oferece acesso ao shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Verificação HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Classificar renderização HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ativar camadas de depuração de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir carregamento de camadas de depuração de GPU p/ apps de depuração"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ativ. registro detal. de fornecedor"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclui mais registros de fornecedores específicos do dispositivo em relatórios de bugs, que podem conter informações privadas e usar mais bateria e/ou armazenamento."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animação da janela"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animação de transição"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duração do Animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Este dispositivo"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index e1aa85b3c850..06a83f5b78da 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afișați dispozitivele Bluetooth fără nume"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Dezactivați volumul absolut"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Activați Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Conectivitate îmbunătățită"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versiunea AVRCP pentru Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selectați versiunea AVRCP pentru Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versiunea MAP pentru Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Vor fi afișate dispozitivele Bluetooth fără nume (numai adresele MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Dezactivează funcția Bluetooth de volum absolut în cazul problemelor de volum apărute la dispozitivele la distanță, cum ar fi volumul mult prea ridicat sau lipsa de control asupra acestuia."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Activează setul de funcții Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Activează funcția Conectivitate îmbunătățită."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Aplicație terminal locală"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Activați aplicația terminal care oferă acces la shell local"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Verificare HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil redare cu HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activați nivelurile de depanare GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permiteți încărcarea nivelurilor de depanare GPU pentru aplicațiile de depanare"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Activați înregistrarea detaliată a furnizorilor"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Includeți alte jurnale ale furnizorilor de dispozitive în rapoartele de eroare, care pot conține informații private, folosiți mai multă baterie și/sau mai mult spațiu de stocare."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Scară animație fereastră"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Scară tranziție animații"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Scară durată Animator"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Întreabă de fiecare dată"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Acest dispozitiv"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Difuzorul telefonului"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Opriți și reporniți dispozitivul."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 3df750dc1a18..5439979703a9 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показывать Bluetooth-устройства без названий"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Отключить абсолютный уровень громкости"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Включить Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Улучшенный обмен данными"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Версия Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Выберите версию Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Версия Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Показывать Bluetooth-устройства без названий (только с MAC-адресами)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Отключить абсолютный уровень громкости Bluetooth при возникновении проблем на удаленных устройствах, например при слишком громком звучании или невозможности контролировать настройку"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Включить стек Bluetooth Gabeldorsche"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Включить улучшенный обмен данными"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локальный терминальный доступ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Разрешить терминальный доступ к локальной оболочке"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Проверка HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Учет времени работы HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Отладка графического процессора"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Включить загрузку слоев отладки графического процессора"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Подробный журнал поставщика"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Включать в информацию об ошибках дополнительные записи поставщика об устройстве, которые могут содержать личные данные и занимать больше места. Также это может увеличить расход заряда батареи."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Анимация окон"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Анимация переходов"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Длительность анимации"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Всегда спрашивать"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Только что"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Это устройство"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Встроенный динамик"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index c1452d26b2d4..b441209e23d8 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"නම් නොමැති බ්ලූටූත් උපාංග පෙන්වන්න"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"නිරපේක්ෂ හඩ පරිමාව අබල කරන්න"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche සබල කරන්න"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"වැඩිදියුණු කළ සබැඳුම් හැකියාව"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"බ්ලූටූත් AVRCP අනුවාදය"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"බ්ලූටූත් AVRCP අනුවාදය තෝරන්න"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP අනුවාදය"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"නම් නොමැති බ්ලූටූත් උපාංග (MAC ලිපින පමණි) සංදර්ශනය කරනු ඇත"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"පිළිගත නොහැකි ලෙස වැඩි හඩ පරිමාව හෝ පාලනය නොමැති වීම යනාදී දුරස්ථ උපාංග සමගින් වන හඬ පරිමා ගැටලුවලදී බ්ලූටූත් නිරපේක්ෂ හඬ පරිමා විශේෂාංගය අබල කරයි."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche විශේෂාංග අට්ටිය සබල කරයි."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"වැඩිදියුණු කළ සබැඳුම් හැකියා විශේෂාංගය සබල කරයි."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"අභ්‍යන්තර අන්තය"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"දේශීය ෂෙල් ප්‍රවේශනය පිරිනමන ටර්මිනල් යෙදුම සබල කරන්න"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP පරික්ෂාව"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"පැතිකඩ HWUI විදහමින්"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU නිදොසීමේ ස්තර සබල කර."</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"නිදොසීමේ යෙදුම්වලට GPU නිදොසීමේ ස්තර පූරණයට ඉඩ දෙ."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"verbose vendor පිරීම සබල කරන්න"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"පුද්ගලික තොරතුරු අන්තර්ගත විය හැකි, වැඩි බැටරි බලයක් භාවිත කිරීමට සහ/හෝ වැඩි ගබඩා ඉඩක් භාවිත කිරීමට හැකි අමතර උපාංග නිශ්චිත විකුණුම්කරු ලොග, දෝෂ වාර්තාවල අඩංගු වේ."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"කවුළු සජීවිකරණ පරිමාණය"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"සංක්‍රමණ සජීවන පරිමාණය"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"සජීවක කාල පරාස පරිමාණය"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"සෑම විටම ඉල්ලන්න"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ඔබ ක්‍රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"මේ දැන්"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"මෙම උපාංගය"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"දුරකථන ස්පීකරය"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්‍රියාවිරහිත කර &amp; ආපසු ක්‍රියාත්මක කරන්න"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 0f1fbceab85e..41a858d5d294 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Zobrazovať zariadenia Bluetooth bez názvov"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Zakázať absolútnu hlasitosť"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Povoliť Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Zlepšené možnosti pripojenia"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Verzia rozhrania Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Zvoľte verziu rozhrania Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Verzia profilu Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Zariadenia Bluetooth sa budú zobrazovať bez názvov (iba adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Umožňuje zakázať funkciu absolútnej hlasitosti rozhrania Bluetooth v prípade problémov s hlasitosťou vo vzdialených zariadeniach, ako je napríklad neprijateľne vysoká hlasitosť alebo absencia ovládacích prvkov."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Umožňuje povoliť skupinu funkcií Bluetooth Gabeldorche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Povoľuje funkciu Zlepšené možnosti pripojenia."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Miestny terminál"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Povoliť terminálovú apl. na miestny prístup k prostrediu shell"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Kontrola HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Vykresľovanie HWUI profilu"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Povoliť vrstvy ladenia grafického procesora"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Povoliť načítanie vrstiev ladenia grafického procesora na ladenie aplikácií"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktivovať podr. zapis. dodáv. do denníka"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Zahŕňajte v hláseniach chýb ďalšie denníky dodávateľa pre konkrétne zariadenie, ktoré môžu obsahovať osobné údaje, zvýšiť spotrebu batérie alebo zabrať viac ukladacieho priestoru."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Mierka animácie okna"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Mierka animácie premeny"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Mierka dĺžky animácie"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vždy sa opýtať"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokiaľ túto funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Toto zariadenie"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefónu"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 08a74fb5e08a..50b8ef2d9fed 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži naprave Bluetooth brez imen"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Onemogočanje absolutne glasnosti"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Omogoči Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Izboljšana povezljivost"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Različica profila AVRCP za Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Izberite različico profila AVRCP za Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Različica profila MAP za Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Prikazane bodo naprave Bluetooth brez imen (samo z naslovi MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Onemogoči funkcijo absolutne glasnosti za Bluetooth, če pride do težav z glasnostjo z oddaljenimi napravami, kot je nesprejemljivo visoka glasnost ali pomanjkanje nadzora."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Omogoči sklad funkcij Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Omogoči funkcijo Izboljšana povezljivost."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Omogočanje terminalske aplikacije za dostop do lokalne lupine"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Preverjanje HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Upodob. profilov s HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Omog. sloje odpr. nap. GPE"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Aplikacijam za odpravljanje napak dovoli nalaganje slojev za odpravljanje napak GPE"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Omogoči podrobno beleženje za ponudnika"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Vključitev dodatnih dnevnikov ponudnika, odvisnih od posamezne naprave, v poročila o napakah. Takšno poročilo lahko vsebuje zasebne podatke, porabi več energije baterije in/ali več shrambe."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Merilo animacije okna"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Merilo animacije prehoda"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Merilo trajanja animacije"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vedno vprašaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"pravkar"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ta naprava"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvočnik telefona"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 1bd942405377..e3f268002610 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Shfaq pajisjet me Bluetooth pa emra"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Çaktivizo volumin absolut"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktivizo Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Lidhshmëria e përmirësuar"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versioni AVRCP i Bluetooth-it"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Zgjidh versionin AVRCP të Bluetooth-it"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versioni MAP i Bluetooth-it"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Pajisjet me Bluetooth do të shfaqen pa emra (vetëm adresat MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Çaktivizon funksionin e volumit absolut të Bluetooth në rast të problemeve të volumit me pajisjet në largësi, si p.sh. një volum i lartë i papranueshëm ose mungesa e kontrollit."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktivizon grupin e veçorive të Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktivizon veçorinë e \"Lidhshmërisë së përmirësuar\"."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Terminali lokal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktivizo aplikacionin terminal që ofron qasje në guaskën lokale"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Kontrolli HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Interpretimi i profilit me HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktivizo shtresat e korrigjimit të GPU-së"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Lejo ngarkimin e shtresave të korrigjimit të GPU-së për aplikacionet e korrigjimit"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktivizo evidencat e tregtuesit me shumë fjalë"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Përfshi evidenca shtesë të treguesve specifike për pajisjen në raportet e defekteve, që mund të përfshijnë informacion privat, mund të përdorin më shumë bateri dhe/ose të përdorin më shumë hapësirë ruajtëse."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Animacioni i dritares"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Animacioni kalimtar"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Kohëzgjatja e animatorit"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pyet çdo herë"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Deri sa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Kjo pajisje"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlanti i telefonit"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 3355c57e1f53..31e395cdd3f2 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Прикажи Bluetooth уређаје без назива"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Онемогући главно подешавање јачине звука"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Омогући Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Побољшано повезивање"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Верзија Bluetooth AVRCP-а"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Изаберите верзију Bluetooth AVRCP-а"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Верзија Bluetooth MAP-а"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Биће приказани Bluetooth уређаји без назива (само са MAC адресама)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Онемогућава главно подешавање јачине звука на Bluetooth уређају у случају проблема са јачином звука на даљинским уређајима, као што су изузетно велика јачина звука или недостатак контроле."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Омогућава групу Bluetooth Gabeldorsche функција."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Омогућава функцију Побољшано повезивање."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локални терминал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Омогући апл. терминала за приступ локалном командном окружењу"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP провера"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Рендеруј помоћу HWUI-а"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Омогући слојеве за отклањање грешака GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Омогући учитавање отк. греш. GPU-a у апл. за отк. греш."</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Опширне евиденције продавца"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Уврстите у извештаје о грешкама додатне посебне евиденције продавца за уређаје, које могу да садрже приватне податке, да троше више батерије и/или да користе више меморије."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Размера анимације прозора"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Размера анимације прелаза"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Аниматорова размера трајања"</string>
@@ -502,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Питај сваки пут"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Управо"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Овај уређај"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Звучник телефона"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index fce23af8a2c8..634a16ebf91d 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Visa namnlösa Bluetooth-enheter"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Inaktivera Absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Aktivera Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Förbättrad anslutning"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"AVRCP-version för Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Välj AVRCP-version för Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"MAP-version för Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth-enheter utan namn (enbart MAC-adresser) visas"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Inaktivera Bluetooth-funktionen Absolute volume om det skulle uppstå problem med volymen på fjärrenheter, t.ex. alldeles för hög volym eller brist på kontroll."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Aktiverar funktionsgruppen Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Aktiverar funktionen Förbättrad anslutning."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokal terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Aktivera en terminalapp som ger åtkomst till hyllor lokalt"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-kontroll"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profilens HWUI-rendering"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktivera GPU-felsökningslager"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Tillåt att felsökningsappar läser in GPU-felsökningslager"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktivera verbose-loggning"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Ta med ytterligare enhetsspecifika leverantörsloggar i felrapporter. Dessa kan innehålla privata uppgifter samt använda mer batteri och/eller mer lagringsutrymme."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Skala – fönsteranimering"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala – övergångsanimering"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Längdskala för Animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Fråga varje gång"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Den här enheten"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonens högtalare"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 3ca705f71e18..3263a6c6fcb1 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Onyesha vifaa vya Bluetooth visivyo na majina"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Zima sauti kamili"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Washa Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Muunganisho Ulioboreshwa"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Toleo la Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Chagua Toleo la Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Toleo la Ramani ya Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Itaonyesha vifaa vya Bluetooth bila majina (anwani za MAC pekee)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Huzima kipengele cha Bluetooth cha sauti kamili kunapotokea matatizo ya sauti katika vifaa vya mbali kama vile sauti ya juu mno au inaposhindikana kuidhibiti."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Huwasha rafu ya kipengele ya Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Huwasha kipengele cha Muunganisho Ulioboreshwa."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Kituo cha karibu"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Washa programu ya mwisho inayotoa ufikiaji mkuu wa karibu"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Inakagua HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Kutekeleza HWUI ya wasifu"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ruhusu safu za utatuzi wa GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Ruhusu upakiaji wa safu za utatuzi wa GPU za programu za utatuzi"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Washa uwekaji kumbukumbu za muuzaji kwa kutumia sauti"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Jumuisha kumbukumbu zaidi za muuzaji ambazo ni mahususi kwa kifaa kwenye ripoti za hitilafu, ambazo huenda zikawa na maelezo ya faragha, zikatumia chaji nyingi ya betri na/au zikatumia nafasi kubwa ya hifadhi."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Uhuishaji kwenye dirisha"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Mageuzi ya kipimo cha uhuishaji"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Mizani ya muda wa uhuishaji"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Uliza kila wakati"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Kifaa hiki"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Spika ya simu"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 4f0b779f63a9..18ab23dc7750 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -206,60 +206,33 @@
<string name="enable_adb" msgid="8072776357237289039">"USB பிழைதிருத்தம்"</string>
<string name="enable_adb_summary" msgid="3711526030096574316">"USB இணைக்கப்பட்டிருக்கும்போது பிழைத்திருத்தப் பயன்முறையை அமை"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"USB பிழைத்திருத்த அங்கீகரிப்புகளை நிராகரி"</string>
- <!-- no translation found for enable_adb_wireless (6973226350963971018) -->
- <skip />
- <!-- no translation found for enable_adb_wireless_summary (7344391423657093011) -->
- <skip />
- <!-- no translation found for adb_wireless_error (721958772149779856) -->
- <skip />
- <!-- no translation found for adb_wireless_settings (2295017847215680229) -->
- <skip />
- <!-- no translation found for adb_wireless_list_empty_off (1713707973837255490) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_title (6982904096137468634) -->
- <skip />
- <!-- no translation found for adb_pair_method_qrcode_summary (3729901496856458634) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_title (1122590300445142904) -->
- <skip />
- <!-- no translation found for adb_pair_method_code_summary (6370414511333685185) -->
- <skip />
- <!-- no translation found for adb_paired_devices_title (5268997341526217362) -->
- <skip />
- <!-- no translation found for adb_wireless_device_connected_summary (3039660790249148713) -->
- <skip />
- <!-- no translation found for adb_wireless_device_details_title (7129369670526565786) -->
- <skip />
- <!-- no translation found for adb_device_forget (193072400783068417) -->
- <skip />
- <!-- no translation found for adb_device_fingerprint_title_format (291504822917843701) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_title (664211177427438438) -->
- <skip />
- <!-- no translation found for adb_wireless_connection_failed_message (9213896700171602073) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_title (7141739231018530210) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_pairing_code_label (3639239786669722731) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_title (3426758947882091735) -->
- <skip />
- <!-- no translation found for adb_pairing_device_dialog_failed_msg (6611097519661997148) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_summary (8051414549011801917) -->
- <skip />
- <!-- no translation found for adb_wireless_verifying_qrcode_text (6123192424916029207) -->
- <skip />
- <!-- no translation found for adb_qrcode_pairing_device_failed_msg (6936292092592914132) -->
- <skip />
- <!-- no translation found for adb_wireless_ip_addr_preference_title (8335132107715311730) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_title (1906409667944674707) -->
- <skip />
- <!-- no translation found for adb_wireless_qrcode_pairing_description (8578868049289910131) -->
- <skip />
- <!-- no translation found for keywords_adb_wireless (6507505581882171240) -->
- <skip />
+ <string name="enable_adb_wireless" msgid="6973226350963971018">"வயர்லெஸ் பிழைதிருத்தம்"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"வைஃபையை இணைக்கும்போது பிழைதிருத்தப் பயன்முறை இயக்கப்படும்"</string>
+ <string name="adb_wireless_error" msgid="721958772149779856">"பிழை"</string>
+ <string name="adb_wireless_settings" msgid="2295017847215680229">"வயர்லெஸ் பிழைதிருத்தம்"</string>
+ <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"கிடைக்கும் சாதனங்களைப் பார்க்கவும் பயன்படுத்தவும் வயர்லெஸ் பிழைதிருத்தத்தை ஆன் செய்யவும்"</string>
+ <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR குறியீட்டின் மூலம் சாதனத்தை இணைத்தல்"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR குறியீடு ஸ்கேனரைப் பயன்படுத்தி புதிய சாதனங்களை இணைக்கலாம்"</string>
+ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"இணைத்தல் குறியீட்டின் மூலம் சாதனத்தை இணைத்தல்"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ஆறு இலக்கக் குறியீட்டைப் பயன்படுத்தி புதிய சாதனங்களை இணைக்கலாம்"</string>
+ <string name="adb_paired_devices_title" msgid="5268997341526217362">"இணைக்கப்பட்ட சாதனங்கள்"</string>
+ <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"தற்போது இணைக்கப்பட்டுள்ளது"</string>
+ <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"சாதன விவரங்கள்"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"அகற்று"</string>
+ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"சாதனக் கைரேகை: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
+ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"இணைக்கப்படவில்லை"</string>
+ <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> சரியான நெட்வொர்க்குடன் இணைக்கப்பட்டுள்ளதை உறுதிசெய்துகொள்ளவும்"</string>
+ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"சாதனத்துடன் இணைத்தல்"</string>
+ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"வைஃபை இணைத்தல் குறியீடு"</string>
+ <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"இணைக்கப்படவில்லை"</string>
+ <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"சாதனம் அதே நெட்வொர்க்கில் இணைக்கப்பட்டுள்ளதை உறுதிசெய்து கொள்ளவும்."</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR குறியீட்டை ஸ்கேன் செய்வதன் மூலம் சாதனத்தை வைஃபை மூலம் இணைக்கலாம்"</string>
+ <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"சாதனத்தை இணைக்கிறது…"</string>
+ <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"சாதனத்துடன் இணைக்க முடியவில்லை. தவறான QR குறியீடாகவோ சாதனம் அதே நெர்வொர்க்குடன் இணைக்கப்படாமலோ இருக்கலாம்."</string>
+ <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP முகவரி &amp; போர்ட்"</string>
+ <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR குறியீட்டை ஸ்கேன் செய்தல்"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR குறியீட்டை ஸ்கேன் செய்வதன் மூலம் சாதனத்தை வைஃபை மூலம் இணைக்கலாம்"</string>
+ <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"பிழைப் புகாருக்கான ஷார்ட்கட்"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"பிழை அறிக்கையைப் பெற பவர் மெனுவில் விருப்பத்தைக் காட்டு"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"செயலில் வைத்திரு"</string>
@@ -282,6 +255,8 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"பெயர்கள் இல்லாத புளூடூத் சாதனங்களைக் காட்டு"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கு"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorscheவை இயக்கு"</string>
+ <!-- no translation found for enhanced_connectivity (7201127377781666804) -->
+ <skip />
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"புளூடூத் AVRCP பதிப்பு"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"புளூடூத் AVRCP பதிப்பைத் தேர்ந்தெடு"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"புளூடூத்தின் MAP பதிப்பு"</string>
@@ -306,7 +281,7 @@
<string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS வழங்குநரின் ஹோஸ்ட் பெயரை உள்ளிடவும்"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"இணைக்க முடியவில்லை"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string>
- <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string>
+ <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வுக் கருவியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string>
<string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"பேட்டரி தீர்ந்துபோவதைக் குறைத்து நெட்வொர்க்கின் செயல்திறனை மேம்படுத்தும்"</string>
<string name="wifi_metered_label" msgid="8737187690304098638">"கட்டண நெட்வொர்க்"</string>
<string name="wifi_unmetered_label" msgid="6174142840934095093">"கட்டணமில்லா நெட்வொர்க்"</string>
@@ -325,10 +300,8 @@
<string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை கிடைக்கும் போது, அதைப் பயன்படுத்தும்"</string>
<string name="adb_warning_title" msgid="7708653449506485728">"USB பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
<string name="adb_warning_message" msgid="8145270656419669221">"USB பிழைதிருத்தம் மேம்படுத்தல் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கணினி மற்றும் சாதனத்திற்கு இடையில் தரவை நகலெடுக்கவும், அறிவிப்பு இல்லாமல் உங்கள் சாதனத்தில் ஆப்ஸை நிறுவவும், பதிவு தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
- <!-- no translation found for adbwifi_warning_title (727104571653031865) -->
- <skip />
- <!-- no translation found for adbwifi_warning_message (8005936574322702388) -->
- <skip />
+ <string name="adbwifi_warning_title" msgid="727104571653031865">"வயர்லெஸ் பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
+ <string name="adbwifi_warning_message" msgid="8005936574322702388">"\'வயர்லெஸ் பிழைதிருத்தம்\' டெவெலப்மெண்ட் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கம்ப்யூட்டருக்கும் சாதனத்திற்கும் இடையே தரவை நகலெடுக்கவும், உங்கள் சாதனத்தில் அறிவிப்பின்றி ஆப்ஸை நிறுவவும், பதிவுத் தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
<string name="adb_keys_warning_message" msgid="2968555274488101220">"நீங்கள் ஏற்கனவே அனுமதித்த எல்லா கணினிகளிலிருந்தும் USB பிழைத்திருத்தத்திற்கான அணுகலைத் திரும்பப்பெற வேண்டுமா?"</string>
<string name="dev_settings_warning_title" msgid="8251234890169074553">"மேம்பட்ட அமைப்புகளை அனுமதிக்கவா?"</string>
<string name="dev_settings_warning_message" msgid="37741686486073668">"இந்த அமைப்பு மேம்பட்டப் பயன்பாட்டிற்காக மட்டுமே. உங்கள் சாதனம் மற்றும் அதில் உள்ள பயன்பாடுகளைச் சிதைக்கும் அல்லது தவறாகச் செயல்படும் வகையில் பாதிப்பை ஏற்படுத்தும்."</string>
@@ -337,6 +310,8 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"பெயர்கள் இல்லாத புளூடூத் சாதனங்கள் (MAC முகவரிகள் மட்டும்) காட்டப்படும்"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"மிகவும் அதிகமான ஒலியளவு அல்லது கட்டுப்பாடு இழப்பு போன்ற தொலைநிலைச் சாதனங்களில் ஏற்படும் ஒலி தொடர்பான சிக்கல்கள் இருக்கும் சமயங்களில், புளூடூத் அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கும்."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"புளூடூத்தின் Gabeldorsche அம்சங்களை இயக்கும்."</string>
+ <!-- no translation found for enhanced_connectivity_summary (1576414159820676330) -->
+ <skip />
<string name="enable_terminal_title" msgid="3834790541986303654">"அக முனையம்"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"அக ஷெல் அணுகலை வழங்கும் இறுதிப் ஆப்ஸை இயக்கு"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP சரிபார்ப்பு"</string>
@@ -383,6 +358,10 @@
<string name="track_frame_time" msgid="522674651937771106">"சுயவிவர HWUI ரெண்டரிங்"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU பிழைத்திருத்த லேயர்களை இயக்கு"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"பிழைத்திருத்த ஆப்ஸிற்கு, GPU பிழைத்திருத்த லேயர்களை ஏற்றுவதற்கு அனுமதி"</string>
+ <!-- no translation found for enable_verbose_vendor_logging (1196698788267682072) -->
+ <skip />
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"சாளர அனிமேஷன் வேகம்"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"அனிமேஷன் மாற்றத்தின் வேகம்"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"அனிமேட்டர் கால அளவு"</string>
@@ -441,8 +420,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"நிறம் அடையாளங்காண முடியாமை (நீலம்-மஞ்சள்)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"வண்ணத்திருத்தம்"</string>
- <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (6178138727195403796) -->
- <skip />
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"நிறக்குருடு உள்ளவர்கள் வண்ணங்களை இன்னும் துல்லியமாகப் பார்க்க வண்ணத் திருத்தம் உதவுகிறது"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> மூலம் மேலெழுதப்பட்டது"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string>
@@ -461,27 +439,19 @@
<string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கும் மேல் பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கும் மேல் பயன்படுத்த முடியும்"</string>
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (137330009791560774) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (145489081521468132) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1070562682853942350) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4429259621177089719) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7703677921000858479) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (4374784375644214578) -->
- <skip />
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"மொபைல் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"சாதனம் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="4429259621177089719">"மொபைல் விரைவில் ஆஃப் ஆகக்கூடும் (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும் (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"சாதனம் விரைவில் ஆஃப் ஆகக்கூடும் (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"முழு சார்ஜாக <xliff:g id="TIME">%1$s</xliff:g> ஆகும்"</string>
<string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">%2$s</xliff:g> ஆகும்"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"அறியப்படாத"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"சார்ஜ் ஆகிறது"</string>
- <!-- no translation found for battery_info_status_charging_fast (8027559755902954885) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_slow (3190803837168962319) -->
- <skip />
+ <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"வேகமாக சார்ஜாகிறது"</string>
+ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"மெதுவாக சார்ஜாகிறது"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"சார்ஜ் செய்யப்படவில்லை"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"செருகப்பட்டது, ஆனால் இப்போது சார்ஜ் செய்ய முடியவில்லை"</string>
<string name="battery_info_status_full" msgid="4443168946046847468">"முழுவதும் சார்ஜ் ஆனது"</string>
@@ -539,6 +509,9 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ஒவ்வொரு முறையும் கேள்"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"இந்தச் சாதனம்"</string>
+ <!-- no translation found for media_transfer_this_device_name (2716555073132169240) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
+ <!-- no translation found for media_transfer_wired_device_name (4447880899964056007) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 3a354e0806cd..74739ee7a4fa 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించు"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"సంపూర్ణ వాల్యూమ్‌‍ను నిలిపివేయి"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorscheను ఎనేబుల్ చేయి"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"మెరుగైన కనెక్టివిటీ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"బ్లూటూత్ AVRCP వెర్షన్"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"బ్లూటూత్ AVRCP సంస్కరణను ఎంచుకోండి"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"బ్లూటూత్ MAP వెర్షన్‌"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"పేర్లు (MAC చిరునామాలు మాత్రమే) లేని బ్లూటూత్ పరికరాలు ప్రదర్శించబడతాయి"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"రిమోట్ పరికరాల్లో ఆమోదించలేని స్థాయిలో అధిక వాల్యూమ్ ఉండటం లేదా వాల్యూమ్ నియంత్రణ లేకపోవడం వంటి సమస్యలు ఉంటే బ్లూటూత్ సంపూర్ణ వాల్యూమ్ ఫీచర్‌ని నిలిపివేస్తుంది."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"బ్లూటూత్ Gabeldorsche ఫీచర్ స్ట్యాక్‌ను ఎనేబుల్ చేస్తుంది."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"మెరుగైన కనెక్టివిటీ ఫీచర్‌ను ఎనేబుల్ చేస్తుంది."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"స్థానిక టెర్మినల్"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ అనువర్తనాన్ని ప్రారంభించు"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP తనిఖీ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"ప్రొఫైల్ HWUI రెండరింగ్"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU డీబగ్ లేయర్‌లను ప్రారంభించండి"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"డీబగ్ యాప్‌ల కోసం GPU డీబగ్ లేయర్‌లను లోడ్ చేయడాన్ని అనుమతించండి"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"వివరణాత్మక విక్రేత లాగింగ్‌ను ఎనేబుల్ చేయండి"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"విండో యానిమేషన్ ప్రమాణం"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"పరివర్తన యానిమేషన్ ప్రమాణం"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"యానిమేటర్ వ్యవధి ప్రమాణం"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ప్రతిసారి అడుగు"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"మీరు ఆఫ్‌ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ఇప్పుడే"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"ఈ పరికరం"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ఫోన్ స్పీకర్"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index e34c548b68e2..bc0970ca6356 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"แสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ปิดใช้การควบคุมระดับเสียงของอุปกรณ์อื่น"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"เปิดใช้ Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"การเชื่อมต่อที่ปรับปรุงแล้ว"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"เวอร์ชันของบลูทูธ AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"เลือกเวอร์ชันของบลูทูธ AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"เวอร์ชัน MAP ของบลูทูธ"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ระบบจะแสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ (มีเฉพาะที่อยู่ MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ปิดใช้ฟีเจอร์การควบคุมระดับเสียงของอุปกรณ์อื่นผ่านบลูทูธในกรณีที่มีปัญหาเกี่ยวกับระดับเสียงของอุปกรณ์ระยะไกล เช่น ระดับเสียงที่ดังเกินไปหรือระดับเสียงที่ไม่มีการควบคุม"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"เปิดใช้สแต็กฟีเจอร์ Bluetooth Gabeldorsche"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"เปิดใช้ฟีเจอร์การเชื่อมต่อที่ปรับปรุงแล้ว"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"เทอร์มินัลในตัวเครื่อง"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"เปิดใช้งานแอปเทอร์มินัลที่ให้การเข้าถึงเชลล์ในตัวเครื่อง"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"การตรวจสอบ HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"การแสดงผล HWUI ตามโปรไฟล์"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"เปิดใช้เลเยอร์การแก้ไขข้อบกพร่อง GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"อนุญาตให้โหลดเลเยอร์การแก้ไขข้อบกพร่อง GPU สำหรับแอปแก้ไขข้อบกพร่อง"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"เปิดบันทึกเวนเดอร์เพิ่มเติม"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"รวมบันทึกเวนเดอร์เพิ่มเติมเฉพาะอุปกรณ์ไว้ในรายงานข้อบกพร่อง ซึ่งอาจมีข้อมูลส่วนตัว ใช้แบตเตอรี่มากขึ้น และ/หรือใช้พื้นที่เก็บข้อมูลมากขึ้น"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"อัตราการเคลื่อนไหวของหน้าต่าง"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"อัตราการเคลื่อนไหวของการเปลี่ยนภาพ"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"อัตราความเร็วตามตัวสร้างภาพเคลื่อนไหว"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ถามทุกครั้ง"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"เมื่อสักครู่"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"อุปกรณ์นี้"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ลำโพงโทรศัพท์"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index ee042888e90e..9ed2d9ace6e0 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Ipakita ang mga Bluetooth device na walang pangalan"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"I-disable ang absolute volume"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"I-enable ang Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Pinagandang Pagkakonekta"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bersyon ng AVRCP ng Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Pumili ng Bersyon ng AVRCP ng Bluetooth"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bersyon ng MAP ng Bluetooth"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Ipapakita ang mga Bluetooth device na walang pangalan (mga MAC address lang)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Dini-disable ang absolute volume feature ng Bluetooth kung may mga isyu sa volume ang mga malayong device gaya ng hindi katanggap-tanggap na malakas na volume o kawalan ng kontrol."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ine-enable ang stack ng feature ng Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ine-enable ang feature na Pinagandang Pagkakonekta."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Lokal na terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Paganahin ang terminal app na nag-aalok ng lokal na shell access"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Pagsusuring HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Rendering ng Profile HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"I-enable ang GPU debug layer"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Payagang i-load ang GPU debug layer sa debug app"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Enable verbose vendor logging"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Magsama sa mga ulat ng bug ng mga karagdagang log ng vendor na partikular sa device, na posibleng may pribadong impormasyon, gumamit ng mas maraming baterya, at/o gumamit ng mas malaking storage."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Scale ng window animation"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Scale ng transition animation"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Scale ng tagal ng animator"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Magtanong palagi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ngayon lang"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Ang device na ito"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ng telepono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 5015e383a0ca..1a489d1c97d0 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Adsız Bluetooth cihazlarını göster"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Mutlak sesi iptal et"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche\'yi etkileştir"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Gelişmiş Bağlantı"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP Sürümü"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP Sürümünü seçin"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP Sürümü"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Adsız Bluetooth cihazları (yalnızca MAC adresleri) gösterilecek"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Uzak cihazda sesin aşırı yüksek olması veya kontrol edilememesi gibi ses sorunları olması ihtimaline karşı Bluetooh mutlak ses özelliğini iptal eder."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche özellik yığınını etkinleştirir."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Gelişmiş Bağlantı özelliğini etkinleştirir."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Yerel terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Yerel kabuk erişimi sunan terminal uygulamasını etkinleştir"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP denetimi"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Profil HWUI oluşturma"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU hata ayıklama katmanlarını etkinleştir"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Hata ayıklama uygulamaları için GPU hata ayıklama katmanlarının yüklenmesine izin ver"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ayrıntılı satıcı günlüğünü etkinleştir"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Hata raporlarına cihaza özgü ek satıcı günlükleri ekle. Bu günlükler gizli bilgiler içerebilir, daha fazla pil ve/veya daha fazla depolama alanı kullanabilir."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Pencere animasyonu ölçeği"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Geçiş animasyonu ölçeği"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatör süre ölçeği"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Her zaman sor"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Bu cihaz"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hoparlörü"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 3c8f4819a63e..fbe2ba6226de 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показувати пристрої Bluetooth без назв"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Вимкнути абсолютну гучність"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Увімкнути Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Покращене з\'єднання"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Версія Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Виберіть версію Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Версія Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Пристрої Bluetooth відображатимуться без назв (лише MAC-адреси)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Функція абсолютної гучності Bluetooth вимикається, якщо на віддалених пристроях виникають проблеми, як-от надто висока гучність або втрата контролю."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Вмикає функції Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Вмикає функцію покращеного з\'єднання."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Локальний термінал"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Увімк. програму-термінал, що надає локальний доступ до оболонки"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Перевірка HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Обробка HWUI за профілем"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Увімкнути шари налагодження ГП"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Дозвольте завантажувати шари налагодження ГП для додатків налагодження"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Увімкнути докладну реєстрацію постачальника"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Включати у звіти про помилки додаткові записи про постачальника пристрою, які можуть містити особисті дані, призводити до надмірного споживання заряду акумулятора та/або використовувати більший обсяг пам\'яті."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Анімація вікон"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Анімація переходів"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Тривалість анімації"</string>
@@ -503,6 +507,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Запитувати щоразу"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Доки не вимкнути"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Цей пристрій"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Динамік телефона"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 27e5b2015975..10bce1bbda02 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"بغیر نام والے بلوٹوتھ آلات دکھائیں"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"مطلق والیوم کو غیر فعال کریں"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"‏Gabeldorsche فعال کریں"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"بہتر کردہ کنیکٹوٹی"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"‏بلوٹوتھ AVRCP ورژن"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"‏بلوٹوتھ AVRCP ورژن منتخب کریں"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"‏بلوٹوتھ MAP ورژن"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"‏بغیر نام والے بلوٹوتھ آلات (صرف MAC پتے) ڈسپلے کئے جائیں گے"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ریموٹ آلات کے ساتھ والیوم کے مسائل مثلاً نا قابل قبول حد تک بلند والیوم یا کنٹرول نہ ہونے کی صورت میں بلو ٹوتھ مطلق والیوم والی خصوصیت کو غیر فعال کریں۔"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"‏بلوٹوتھ Gabeldorsche خصوصیت کے انبار کو فعال کرتا ہے۔"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"بہتر کردہ کنیکٹوٹی کی خصوصیات کو فعال کرتا ہے۔"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"مقامی ٹرمینل"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"مقامی شیل رسائی پیش کرنے والی ٹرمینل ایپ فعال کریں"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"‏HDCP چیکنگ"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"‏پروفائل HWUI رینڈرنگ"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"‏GPU ڈیبگ پرتیں فعال کریں"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"‏ڈیبگ ایپس کیلئے GPU ڈیبگ پرتوں کو لوڈ کرنے دیں"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"وربوس وینڈر لاگنگ فعال کریں"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"ونڈو اینیمیشن اسکیل"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"ٹرانزیشن اینیمیشن اسکیل"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"اینیمیٹر دورانیے کا اسکیل"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ہر بار پوچھیں"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ابھی ابھی"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"یہ آلہ"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"فون اسپیکر"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index ee787959ff7a..df1100460f5d 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth qurilmalarini nomlarisiz ko‘rsatish"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Tovush balandligining mutlaq darajasini faolsizlantirish"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche funksiyasini yoqish"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Kuchaytirilgan aloqa"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP versiyasi"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Bluetooth AVRCP versiyasini tanlang"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAP versiyasi"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth qurilmalari nomsiz (faqat MAC manzillari) ko‘rsatiladi"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Masofadan ulanadigan qurilmalar bilan muammolar yuz berganda, jumladan, juda baland ovoz yoki sozlamalarni boshqarib bo‘lmaydigan holatlarda Bluetooth ovozi balandligining mutlaq darajasini o‘chirib qo‘yadi."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche funksiyasini ishga tushiradi."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Kuchaytirilgan aloqa funksiyasini ishga tushiradi."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Mahalliy terminal"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Mahalliy terminalga kirishga ruxsat beruvchi terminal ilovani faollashtirish"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP tekshiruvi"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI ishlash vaqtining hisobi"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Grafik protsessorni tuzatish"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Grafik protsessorni tuzatish qatlamlarini yuklashni yoqish"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Taʼminotchining batafsil jurnali"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Xatoliklar hisobotiga shaxsiy maʼlumotlari bor va koʻp joy olishi mumkin boʻlgan qurilma haqida taʼminotchining qoʻshimcha yozuvlari kiradi. Bunda batareya quvvati tezroq sarflanishi mumkin."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Oynalar animatsiyasi"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"O‘tish animatsiyasi"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatsiya tezligi"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Har safar so‘ralsin"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Rejimdan chiqilgunicha"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Shu qurilma"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon karnayi"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 6d769623d8b3..9863bfebf14e 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Hiển thị các thiết bị Bluetooth không có tên"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Vô hiệu hóa âm lượng tuyệt đối"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Bật tính năng Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Kết nối nâng cao"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Phiên bản Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Chọn phiên bản Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Phiên bản Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Các thiết bị Bluetooth không có tên (chỉ có địa chỉ MAC) sẽ được hiển thị"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Vô hiệu hóa tính năng âm lượng tuyệt đối qua Bluetooth trong trường hợp xảy ra sự cố về âm lượng với các thiết bị từ xa, chẳng hạn như âm lượng lớn không thể chấp nhận được hoặc thiếu kiểm soát."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bật ngăn xếp tính năng Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Bật tính năng Kết nối nâng cao."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Dòng lệnh cục bộ"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Bật ứng dụng dòng lệnh cung cấp quyền truy cập vỏ cục bộ"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Kiểm tra HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Kết xuất HWUI cấu hình"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Bật lớp gỡ lỗi GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Cho phép tải lớp gỡ lỗi GPU cho ứng dụng gỡ lỗi"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Bật tùy chọn ghi nhật ký chi tiết của nhà cung cấp"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Đưa thêm nhật ký của nhà cung cấp dành riêng cho thiết bị vào các báo cáo lỗi. Nhật ký này có thể chứa thông tin cá nhân, dùng nhiều pin hơn và/hoặc chiếm nhiều dung lượng lưu trữ hơn."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Tỷ lệ hình động của cửa sổ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Tỷ lệ hình động chuyển tiếp"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Tỷ lệ thời lượng của trình tạo hình động"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Luôn hỏi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Thiết bị này"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Loa điện thoại"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index fbb30ca0d79d..b2b9dc706df7 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"显示没有名称的蓝牙设备"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"停用绝对音量功能"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"启用“Gabeldorsche”"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"增强连接性"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"蓝牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"选择蓝牙 AVRCP 版本"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"蓝牙 MAP 版本"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"系统将显示没有名称(只有 MAC 地址)的蓝牙设备"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"停用蓝牙绝对音量功能,即可避免在连接到远程设备时出现音量问题(例如音量高得让人无法接受或无法控制音量等)。"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"启用“蓝牙 Gabeldorsche”功能堆栈。"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"启用增强连接性功能。"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"本地终端"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"启用终端应用,以便在本地访问 Shell"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP 检查"</string>
@@ -354,6 +356,9 @@
<string name="track_frame_time" msgid="522674651937771106">"HWUI 呈现模式分析"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"启用 GPU 调试层"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"允许为调试应用加载 GPU 调试层"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"启用详细供应商日志记录"</string>
+ <!-- no translation found for enable_verbose_vendor_logging_summary (5426292185780393708) -->
+ <skip />
<string name="window_animation_scale_title" msgid="5236381298376812508">"窗口动画缩放"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"过渡动画缩放"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 时长缩放"</string>
@@ -501,6 +506,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都询问"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"此设备"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手机扬声器"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 0b4ee7a0940f..992cb5f557b0 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"顯示沒有名稱的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"停用絕對音量功能"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"啟用 Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"強化連線功能"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"選擇藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"藍牙 MAP 版本"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"系統將顯示沒有名稱 (只有 MAC 位址) 的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"連線至遠端裝置時,如發生音量過大或無法控制音量等問題,請停用藍牙絕對音量功能。"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"啟用藍牙 Gabeldorsche 功能組合。"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"啟用強化連線功能。"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"本機終端機"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"啟用可提供本機命令介面存取權的終端機應用程式"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP 檢查"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"分析 HWUI 轉譯"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"啟用 GPU 偵錯圖層"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"允許為偵錯應用程式載入 GPU 偵錯圖層"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"啟用詳細供應商記錄"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"在錯誤報告中加入其他裝置專屬供應商記錄,其中可能包含私人資料,並會耗用更多電量及/或儲存空間。"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"視窗動畫比例"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"轉場動畫比例"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 片長比例"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"此裝置"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 487c33df1d4f..6c664d95b7c9 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"顯示沒有名稱的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"停用絕對音量功能"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"啟用 Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"加強型連線"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"選取藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"藍牙 MAP 版本"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"系統會顯示沒有名稱 (僅具有 MAC 位址) 的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"只要停用藍牙絕對音量功能,即可避免在連線到遠端裝置時,發生音量過大或無法控制音量等問題。"</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"啟用藍牙 Gabeldorsche 功能堆疊。"</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"啟用「加強型連線」功能。"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"本機終端機"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"啟用可提供本機命令介面存取權的終端機應用程式"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP 檢查"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"剖析 HWUI 轉譯"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"啟用 GPU 偵錯圖層"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"允許載入 GPU 偵錯圖層為應用程式偵錯"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"啟用詳細供應商記錄功能"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"在錯誤報告中附上其他的裝置專屬供應商記錄。如果你這麼做,可能會增加電池用量及/或占用較多儲存空間,報告中可能也會包含私人資訊。"</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"視窗動畫比例"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"轉場動畫比例"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"動畫影片長度比例"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"這個裝置"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 684c1001e9be..6def21767533 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -255,6 +255,7 @@
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bonisa amadivayisi e-Bluetooth ngaphandle kwamagama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Khubaza ivolumu ngokuphelele"</string>
<string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Nika amandla i-Gabeldorsche"</string>
+ <string name="enhanced_connectivity" msgid="7201127377781666804">"Ukuxhumeka Okuthuthukisiwe"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Inguqulo ye-Bluetooth ye-AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Khetha inguqulo ye-Bluetooth AVRCP"</string>
<string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Inguqulo ye-Bluetooth MAP"</string>
@@ -308,6 +309,7 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Amadivayisi e-Bluetooth anganawo amagama (Amakheli e-MAC kuphela) azoboniswa"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Ikhubaza isici esiphelele sevolumu ye-Bluetooth uma kuba nezinkinga zevolumu ngamadivayisi esilawuli kude ezifana nevolumu ephezulu noma eshoda ngokulawuleka."</string>
<string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Inika amandla isitaki sesici se-Bluetooth Gabeldorsche."</string>
+ <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Inika amandla isici Sokuxhumeka Okuthuthukisiwe."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Itheminali yasendaweni"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Nika amandla uhlelo lokusebenza letheminali olunikeza ukufinyelela kwasendaweni kwe-shell"</string>
<string name="hdcp_checking_title" msgid="3155692785074095986">"Ihlola i-HDCP"</string>
@@ -354,6 +356,8 @@
<string name="track_frame_time" msgid="522674651937771106">"Inikezela iphrofayela ye-HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Nika amandla izendlalelo zokususa amaphutha ze-GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Vumela izendlalelo zokususa amaphutha ze-GPU ngezinhlelo zokusebenza zokususa amaphutha"</string>
+ <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Nika amandla ilogu yomthengisi we-verbose"</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Faka phakathi amalogu athize womthengisi wedivayisi angeziwe, angase afake phakathi ulwazi oluyimfihlo, kusebenzisa ibhethri eningi, futhi/noma kusebenzisa isitoreji esiningi."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Iwindi yesilinganisi sesithombe esinyakazayo"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Isilinganiso sesithombe soku"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Isilinganiso sobude besikhathi somenzi womfanekiso onyakazayo"</string>
@@ -501,6 +505,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Buza njalo"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string>
- <string name="media_transfer_this_device_name" msgid="2858384945459339073">"Le divayisi"</string>
+ <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Isipikha sefoni"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
+ <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
</resources>
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 56d5de473bfc..ef7f167652f2 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -269,6 +269,9 @@
<!-- Permission needed to test mainline permission module rollback -->
<uses-permission android:name="android.permission.UPGRADE_RUNTIME_PERMISSIONS" />
+ <!-- Permission needed to read wifi network credentials for CtsNetTestCases -->
+ <uses-permission android:name="android.permission.READ_WIFI_CREDENTIAL" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml b/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml
new file mode 100644
index 000000000000..cfe783892b1d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp">
+ <item android:state_checked="true"
+ android:drawable="@drawable/star_filled"
+ android:tint="@color/control_primary_text"/>
+ <item android:drawable="@drawable/star_outline"
+ android:tint="@color/control_primary_text"/>
+</selector>
diff --git a/packages/SystemUI/res/drawable-nodpi/star_filled.xml b/packages/SystemUI/res/drawable-nodpi/star_filled.xml
new file mode 100644
index 000000000000..62802d3cb838
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/star_filled.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M 11.99 0.027 L 8.628 8.382 L 0.027 9.15 L 6.559 15.111 L 4.597 23.97 L 11.99 19.27 L 19.383 23.97 L 17.421 15.111 L 23.953 9.15 L 15.352 8.382 Z"
+ android:fillColor="#FFFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/star_outline.xml b/packages/SystemUI/res/drawable-nodpi/star_outline.xml
new file mode 100644
index 000000000000..13983c6fda8d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/star_outline.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M 11.99 6.491 L 13.15 9.377 L 13.713 10.776 L 15.148 10.902 L 18.103 11.167 L 15.854 13.221 L 14.766 14.216 L 15.089 15.703 L 15.759 18.74 L 13.222 17.127 L 11.99 16.321 L 10.758 17.102 L 8.222 18.715 L 8.891 15.678 L 9.215 14.191 L 8.126 13.196 L 5.877 11.141 L 8.832 10.877 L 10.267 10.751 L 10.83 9.352 L 11.99 6.491 M 11.99 0.027 L 8.628 8.382 L 0.027 9.15 L 6.559 15.111 L 4.597 23.97 L 11.99 19.27 L 19.383 23.97 L 17.421 15.111 L 23.953 9.15 L 15.352 8.382 Z"
+ android:fillColor="#FFFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/controls_list_divider.xml b/packages/SystemUI/res/drawable/controls_list_divider.xml
new file mode 100644
index 000000000000..f8211d5297f3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/controls_list_divider.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:tint="@color/control_secondary_text">
+ <solid android:color="#33000000" />
+ <size
+ android:height="1dp"
+ android:width="1dp" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/ic_more_vert.xml b/packages/SystemUI/res/drawable/ic_more_vert.xml
deleted file mode 100644
index 1309fa875b55..000000000000
--- a/packages/SystemUI/res/drawable/ic_more_vert.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
-</vector>
diff --git a/packages/SystemUI/res/layout/controls_base_item.xml b/packages/SystemUI/res/layout/controls_base_item.xml
index 823bbcd6e68c..c571b9bbf908 100644
--- a/packages/SystemUI/res/layout/controls_base_item.xml
+++ b/packages/SystemUI/res/layout/controls_base_item.xml
@@ -59,7 +59,7 @@
android:textAppearance="@style/TextAppearance.Control.Title"
app:layout_constraintBottom_toTopOf="@+id/subtitle"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/icon" />
+ app:layout_constraintTop_toBottomOf="@+id/icon"/>
<TextView
android:id="@+id/subtitle"
@@ -67,13 +67,23 @@
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Control.Subtitle"
app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintStart_toStartOf="parent" />
+ app:layout_constraintStart_toStartOf="parent"/>
- <CheckBox
- android:id="@+id/favorite"
+ <FrameLayout
+ android:id="@+id/favorite_container"
android:visibility="gone"
android:layout_width="48dp"
android:layout_height="48dp"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <CheckBox
+ android:id="@+id/favorite"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|end"
+ android:button="@drawable/controls_btn_star"/>
+ </FrameLayout>
+
+
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/controls_spinner_item.xml b/packages/SystemUI/res/layout/controls_spinner_item.xml
new file mode 100644
index 000000000000..6b880545b296
--- /dev/null
+++ b/packages/SystemUI/res/layout/controls_spinner_item.xml
@@ -0,0 +1,50 @@
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dp"
+ android:paddingBottom="12dp">
+
+ <Space
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="1dp" />
+ <ImageView
+ android:id="@+id/app_icon"
+ android:layout_gravity="center"
+ android:layout_width="34dp"
+ android:layout_height="24dp"
+ android:layout_marginEnd="10dp" />
+
+ <TextView
+ android:id="@+id/controls_spinner_item"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="center"
+ android:textSize="25sp"
+ android:textColor="@color/control_secondary_text"
+ android:fontFamily="@*android:string/config_headlineFontFamily" />
+
+ <Space
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="1dp" />
+</LinearLayout>
+
diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml
index 2cd9505b8fe4..77bcc3575fad 100644
--- a/packages/SystemUI/res/layout/controls_with_favorites.xml
+++ b/packages/SystemUI/res/layout/controls_with_favorites.xml
@@ -14,44 +14,47 @@
~ limitations under the License.
-->
<merge
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
+ xmlns:android="http://schemas.android.com/apk/res/android">
- <androidx.constraintlayout.widget.ConstraintLayout
+ <LinearLayout
+ android:id="@+id/controls_header"
+ android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingBottom="20dp">
+ android:paddingTop="12dp">
- <TextView
- android:text="@string/quick_controls_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:gravity="center"
- android:textSize="25sp"
- android:textColor="@*android:color/foreground_material_dark"
- android:fontFamily="@*android:string/config_headlineFontFamily"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
+ <Space
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="1dp" />
<ImageView
- android:id="@+id/controls_more"
- android:src="@drawable/ic_more_vert"
- android:layout_width="34dp"
+ android:id="@+id/app_icon"
+ android:layout_gravity="center"
+ android:layout_width="24dp"
android:layout_height="24dp"
- android:layout_marginEnd="10dp"
- android:tint="@*android:color/foreground_material_dark"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
+ android:layout_marginEnd="10dp" />
+
+ <TextView
+ style="@style/Control.Spinner.Header"
+ android:clickable="false"
+ android:id="@+id/app_or_structure_spinner"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="center"
+ android:ellipsize="end" />
- </androidx.constraintlayout.widget.ConstraintLayout>
+ <Space
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="1dp" />
+ </LinearLayout>
<LinearLayout
android:id="@+id/global_actions_controls_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical" />
+ android:orientation="vertical"
+ android:paddingTop="20dp" />
</merge>
diff --git a/packages/SystemUI/res-keyguard/layout/controls_zone_header.xml b/packages/SystemUI/res/layout/controls_zone_header.xml
index 7b43a0315c10..93f99b12fd31 100644
--- a/packages/SystemUI/res-keyguard/layout/controls_zone_header.xml
+++ b/packages/SystemUI/res/layout/controls_zone_header.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2019 The Android Open Source Project
+ ~ Copyright (C) 2020 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Control.Title"
- android:textColor="?android:attr/colorPrimary"
android:layout_marginStart="12dp"
android:layout_marginEnd="2dp"
android:layout_marginTop="8dp"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index aefe4a20a496..016b48bb48a1 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1217,6 +1217,7 @@
<!-- Home Controls -->
<dimen name="control_spacing">4dp</dimen>
+ <dimen name="control_list_divider">1dp</dimen>
<dimen name="control_corner_radius">15dp</dimen>
<dimen name="control_height">100dp</dimen>
<dimen name="control_padding">15dp</dimen>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index d9b1452b6bb1..83c507095534 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -656,6 +656,12 @@
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
</style>
+ <style name="Control.Spinner.Header" parent="@*android:style/Widget.DeviceDefault.Spinner.DropDown">
+ <item name="android:textSize">25sp</item>
+ <item name="android:textColor">@color/control_primary_text</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+ </style>
+
<style name="TextAppearance.Control.Status">
<item name="android:textSize">12sp</item>
<item name="android:textColor">@color/control_primary_text</item>
@@ -669,5 +675,8 @@
<item name="android:textSize">12sp</item>
<item name="android:textColor">@color/control_secondary_text</item>
</style>
+ <style name="Control.ListPopupWindow" parent="@android:style/Widget.ListPopupWindow">
+ <item name="android:overlapAnchor">true</item>
+ </style>
</resources>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 97b21135d661..6a6255f616a3 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -263,6 +263,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private final IDreamManager mDreamManager;
private boolean mIsDreaming;
private final DevicePolicyManager mDevicePolicyManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mLogoutEnabled;
// If the user long pressed the lock icon, disabling face auth for the current session.
private boolean mLockIconPressed;
@@ -1482,6 +1483,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
mBackgroundExecutor = backgroundExecutor;
+ mBroadcastDispatcher = broadcastDispatcher;
dumpManager.registerDumpable(getClass().getName(), this);
mHandler = new Handler(mainLooper) {
@@ -1617,7 +1619,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
- broadcastDispatcher.registerReceiverWithHandler(mBroadcastReceiver, filter, mHandler);
+ mBroadcastDispatcher.registerReceiverWithHandler(mBroadcastReceiver, filter, mHandler);
final IntentFilter allUserFilter = new IntentFilter();
allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED);
@@ -1628,25 +1630,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
allUserFilter.addAction(ACTION_USER_UNLOCKED);
allUserFilter.addAction(ACTION_USER_STOPPED);
allUserFilter.addAction(ACTION_USER_REMOVED);
- broadcastDispatcher.registerReceiverWithHandler(mBroadcastAllReceiver, allUserFilter,
+ mBroadcastDispatcher.registerReceiverWithHandler(mBroadcastAllReceiver, allUserFilter,
mHandler, UserHandle.ALL);
mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
try {
- ActivityManager.getService().registerUserSwitchObserver(
- new UserSwitchObserver() {
- @Override
- public void onUserSwitching(int newUserId, IRemoteCallback reply) {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING,
- newUserId, 0, reply));
- }
-
- @Override
- public void onUserSwitchComplete(int newUserId) throws RemoteException {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE,
- newUserId, 0));
- }
- }, TAG);
+ ActivityManager.getService().registerUserSwitchObserver(mUserSwitchObserver, TAG);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
@@ -1701,6 +1690,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
}
}
+ private final UserSwitchObserver mUserSwitchObserver = new UserSwitchObserver() {
+ @Override
+ public void onUserSwitching(int newUserId, IRemoteCallback reply) {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING,
+ newUserId, 0, reply));
+ }
+
+ @Override
+ public void onUserSwitchComplete(int newUserId) throws RemoteException {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE,
+ newUserId, 0));
+ }
+ };
+
private void updateAirplaneModeState() {
// ACTION_AIRPLANE_MODE_CHANGED do not broadcast if device set AirplaneMode ON and boot
if (!WirelessUtils.isAirplaneModeOn(mContext)
@@ -2711,6 +2714,35 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
}
}
+ /**
+ * Unregister all listeners.
+ */
+ public void destroy() {
+ // TODO: inject these dependencies:
+ TelephonyManager telephony =
+ (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ if (telephony != null) {
+ telephony.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ }
+
+ mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener);
+
+ if (mDeviceProvisionedObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mDeviceProvisionedObserver);
+ }
+
+ try {
+ ActivityManager.getService().unregisterUserSwitchObserver(mUserSwitchObserver);
+ } catch (RemoteException e) {
+ Log.d(TAG, "RemoteException onDestroy. cannot unregister userSwitchObserver");
+ }
+
+ ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskStackListener);
+
+ mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mBroadcastAllReceiver);
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardUpdateMonitor state:");
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlInfo.kt
index f62412069b92..6f2af1bda45c 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlInfo.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlInfo.kt
@@ -16,59 +16,27 @@
package com.android.systemui.controls.controller
-import android.content.ComponentName
import android.service.controls.DeviceTypes
-import android.util.Log
/**
* Stores basic information about a [Control] to persist and keep track of favorites.
*
- * The identifier of this [Control] is the combination of [component] and [controlId]. The other
- * two fields are there for persistence. In this way, basic information can be shown to the user
+ * The identifier of this [Control] is the [controlId], and is only unique per app. The other
+ * fields are there for persistence. In this way, basic information can be shown to the user
* before the service has to report on the status.
*
- * @property component the name of the component that provides the [Control].
- * @property controlId unique (for the given [component]) identifier for this [Control].
+ * @property controlId unique identifier for this [Control].
* @property controlTitle last title reported for this [Control].
* @property deviceType last reported type for this [Control].
*/
data class ControlInfo(
- val component: ComponentName,
val controlId: String,
val controlTitle: CharSequence,
@DeviceTypes.DeviceType val deviceType: Int
) {
companion object {
- private const val TAG = "ControlInfo"
private const val SEPARATOR = ":"
-
- /**
- * Creates a [ControlInfo] from a [SEPARATOR] separated list of fields.
- *
- * @param separator fields of a [ControlInfo] separated by [SEPARATOR]
- * @return a [ControlInfo] or `null` if there was an error.
- * @see [ControlInfo.toString]
- */
- fun createFromString(string: String): ControlInfo? {
- val parts = string.split(SEPARATOR)
- val component = ComponentName.unflattenFromString(parts[0])
- if (parts.size != 4 || component == null) {
- Log.e(TAG, "Cannot parse ControlInfo from $string")
- return null
- }
- val type = try {
- parts[3].toInt()
- } catch (e: Exception) {
- Log.e(TAG, "Cannot parse deviceType from ${parts[3]}")
- return null
- }
- return ControlInfo(
- component,
- parts[1],
- parts[2],
- if (DeviceTypes.validDeviceType(type)) type else DeviceTypes.TYPE_UNKNOWN)
- }
}
/**
@@ -77,16 +45,14 @@ data class ControlInfo(
* @return a [String] representation of `this`
*/
override fun toString(): String {
- return component.flattenToString() +
- "$SEPARATOR$controlId$SEPARATOR$controlTitle$SEPARATOR$deviceType"
+ return "$SEPARATOR$controlId$SEPARATOR$controlTitle$SEPARATOR$deviceType"
}
class Builder {
- lateinit var componentName: ComponentName
lateinit var controlId: String
lateinit var controlTitle: CharSequence
var deviceType: Int = DeviceTypes.TYPE_UNKNOWN
- fun build() = ControlInfo(componentName, controlId, controlTitle, deviceType)
+ fun build() = ControlInfo(controlId, controlTitle, deviceType)
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingController.kt
index 7fae6a3249c6..fd6e2566b1b6 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingController.kt
@@ -42,30 +42,27 @@ interface ControlsBindingController : UserAwareController {
fun bindAndLoad(component: ComponentName, callback: LoadCallback)
/**
- * Request to bind to the given services.
+ * Request to bind to the given service.
*
- * @param components a list of [ComponentName] of the services to bind
+ * @param component The [ComponentName] of the service to bind
*/
- fun bindServices(components: List<ComponentName>)
+ fun bindService(component: ComponentName)
/**
* Send a subscribe message to retrieve status of a set of controls.
*
- * The controls passed do not have to belong to a single [ControlsProviderService]. The
- * corresponding service [ComponentName] is associated with each control.
- *
- * @param controls a list of controls with corresponding [ComponentName] to request status
- * update
+ * @param structureInfo structure containing the controls to update
*/
- fun subscribe(controls: List<ControlInfo>)
+ fun subscribe(structureInfo: StructureInfo)
/**
* Send an action performed on a [Control].
*
- * @param controlInfo information about the actioned control, including the [ComponentName]
+ * @param componentName name of the component
+ * @param controlInfo information about the actioned control
* @param action the action performed on the control
*/
- fun action(controlInfo: ControlInfo, action: ControlAction)
+ fun action(componentName: ComponentName, controlInfo: ControlInfo, action: ControlAction)
/**
* Unsubscribe from all services to stop status updates.
@@ -73,6 +70,11 @@ interface ControlsBindingController : UserAwareController {
fun unsubscribe()
/**
+ * Notify this controller that this component has been removed (uninstalled).
+ */
+ fun onComponentRemoved(componentName: ComponentName)
+
+ /**
* Consumer for load calls.
*
* Supports also sending error messages.
@@ -86,4 +88,4 @@ interface ControlsBindingController : UserAwareController {
*/
fun error(message: String)
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
index a67f6bd88ad8..8f02c252beb1 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
@@ -26,9 +26,7 @@ import android.service.controls.IControlsActionCallback
import android.service.controls.IControlsSubscriber
import android.service.controls.IControlsSubscription
import android.service.controls.actions.ControlAction
-import android.util.ArrayMap
import android.util.Log
-import com.android.internal.annotations.GuardedBy
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.util.concurrency.DelayableExecutor
@@ -56,12 +54,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
override val currentUserId: Int
get() = currentUser.identifier
- @GuardedBy("componentMap")
- private val tokenMap: MutableMap<IBinder, ControlsProviderLifecycleManager> =
- ArrayMap<IBinder, ControlsProviderLifecycleManager>()
- @GuardedBy("componentMap")
- private val componentMap: MutableMap<Key, ControlsProviderLifecycleManager> =
- ArrayMap<Key, ControlsProviderLifecycleManager>()
+ private var currentProvider: ControlsProviderLifecycleManager? = null
private val actionCallbackService = object : IControlsActionCallback.Stub() {
override fun accept(
@@ -108,81 +101,71 @@ open class ControlsBindingControllerImpl @Inject constructor(
}
private fun retrieveLifecycleManager(component: ComponentName):
- ControlsProviderLifecycleManager {
- synchronized(componentMap) {
- val provider = componentMap.getOrPut(Key(component, currentUser)) {
- createProviderManager(component)
- }
- tokenMap.putIfAbsent(provider.token, provider)
- return provider
+ ControlsProviderLifecycleManager? {
+ if (currentProvider != null && currentProvider?.componentName != component) {
+ unbind()
+ }
+
+ if (currentProvider == null) {
+ currentProvider = createProviderManager(component)
}
+
+ return currentProvider
}
override fun bindAndLoad(
component: ComponentName,
callback: ControlsBindingController.LoadCallback
) {
- val provider = retrieveLifecycleManager(component)
- provider.maybeBindAndLoad(LoadSubscriber(callback))
+ retrieveLifecycleManager(component)?.maybeBindAndLoad(LoadSubscriber(callback))
}
- override fun subscribe(controls: List<ControlInfo>) {
- val controlsByComponentName = controls.groupBy { it.component }
+ override fun subscribe(structureInfo: StructureInfo) {
if (refreshing.compareAndSet(false, true)) {
- controlsByComponentName.forEach {
- val provider = retrieveLifecycleManager(it.key)
- backgroundExecutor.execute {
- provider.maybeBindAndSubscribe(it.value.map { it.controlId })
- }
- }
- }
- // Unbind unneeded providers
- val providersWithFavorites = controlsByComponentName.keys
- synchronized(componentMap) {
- componentMap.forEach {
- if (it.key.component !in providersWithFavorites) {
- backgroundExecutor.execute { it.value.unbindService() }
- }
- }
+ val provider = retrieveLifecycleManager(structureInfo.componentName)
+ provider?.maybeBindAndSubscribe(structureInfo.controls.map { it.controlId })
}
}
override fun unsubscribe() {
if (refreshing.compareAndSet(true, false)) {
- val providers = synchronized(componentMap) {
- componentMap.values.toList()
- }
- providers.forEach {
- backgroundExecutor.execute { it.unsubscribe() }
- }
+ currentProvider?.unsubscribe()
}
}
- override fun action(controlInfo: ControlInfo, action: ControlAction) {
- val provider = retrieveLifecycleManager(controlInfo.component)
- provider.maybeBindAndSendAction(controlInfo.controlId, action)
+ override fun action(
+ componentName: ComponentName,
+ controlInfo: ControlInfo,
+ action: ControlAction
+ ) {
+ retrieveLifecycleManager(componentName)
+ ?.maybeBindAndSendAction(controlInfo.controlId, action)
}
- override fun bindServices(components: List<ComponentName>) {
- components.forEach {
- val provider = retrieveLifecycleManager(it)
- backgroundExecutor.execute { provider.bindService() }
- }
+ override fun bindService(component: ComponentName) {
+ retrieveLifecycleManager(component)?.bindService()
}
override fun changeUser(newUser: UserHandle) {
if (newUser == currentUser) return
- synchronized(componentMap) {
- unbindAllProvidersLocked() // unbind all providers from the old user
- }
+
+ unbind()
+
refreshing.set(false)
currentUser = newUser
}
- private fun unbindAllProvidersLocked() {
- componentMap.values.forEach {
- if (it.user == currentUser) {
- it.unbindService()
+ private fun unbind() {
+ currentProvider?.unbindService()
+ currentProvider = null
+ }
+
+ override fun onComponentRemoved(componentName: ComponentName) {
+ backgroundExecutor.execute {
+ currentProvider?.let {
+ if (it.componentName == componentName) {
+ unbind()
+ }
}
}
}
@@ -191,44 +174,41 @@ open class ControlsBindingControllerImpl @Inject constructor(
return StringBuilder(" ControlsBindingController:\n").apply {
append(" refreshing=${refreshing.get()}\n")
append(" currentUser=$currentUser\n")
- append(" Providers:\n")
- synchronized(componentMap) {
- componentMap.values.forEach {
- append(" $it\n")
- }
- }
+ append(" Providers=$currentProvider\n")
}.toString()
}
private abstract inner class CallbackRunnable(val token: IBinder) : Runnable {
- protected val provider: ControlsProviderLifecycleManager? =
- synchronized(componentMap) {
- tokenMap.get(token)
- }
- }
+ protected val provider: ControlsProviderLifecycleManager? = currentProvider
- private inner class OnLoadRunnable(
- token: IBinder,
- val list: List<Control>,
- val callback: ControlsBindingController.LoadCallback
- ) : CallbackRunnable(token) {
override fun run() {
if (provider == null) {
- Log.e(TAG, "No provider found for token:$token")
+ Log.e(TAG, "No current provider set")
return
}
if (provider.user != currentUser) {
Log.e(TAG, "User ${provider.user} is not current user")
return
}
- synchronized(componentMap) {
- if (token !in tokenMap.keys) {
- Log.e(TAG, "Provider for token:$token does not exist anymore")
- return
- }
+ if (token != provider.token) {
+ Log.e(TAG, "Provider for token:$token does not exist anymore")
+ return
}
+
+ doRun()
+ }
+
+ abstract fun doRun()
+ }
+
+ private inner class OnLoadRunnable(
+ token: IBinder,
+ val list: List<Control>,
+ val callback: ControlsBindingController.LoadCallback
+ ) : CallbackRunnable(token) {
+ override fun doRun() {
callback.accept(list)
- provider.unbindService()
+ provider?.unbindService()
}
}
@@ -236,14 +216,11 @@ open class ControlsBindingControllerImpl @Inject constructor(
token: IBinder,
val control: Control
) : CallbackRunnable(token) {
- override fun run() {
+ override fun doRun() {
if (!refreshing.get()) {
Log.d(TAG, "onRefresh outside of window from:${provider?.componentName}")
}
- if (provider?.user != currentUser) {
- Log.e(TAG, "User ${provider?.user} is not current user")
- return
- }
+
provider?.let {
lazyController.get().refreshStatus(it.componentName, control)
}
@@ -254,7 +231,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
token: IBinder,
val subscription: IControlsSubscription
) : CallbackRunnable(token) {
- override fun run() {
+ override fun doRun() {
if (!refreshing.get()) {
Log.d(TAG, "onRefresh outside of window from '${provider?.componentName}'")
}
@@ -267,7 +244,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
private inner class OnCompleteRunnable(
token: IBinder
) : CallbackRunnable(token) {
- override fun run() {
+ override fun doRun() {
provider?.let {
Log.i(TAG, "onComplete receive from '${it.componentName}'")
}
@@ -278,7 +255,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
token: IBinder,
val error: String
) : CallbackRunnable(token) {
- override fun run() {
+ override fun doRun() {
provider?.let {
Log.e(TAG, "onError receive from '${it.componentName}': $error")
}
@@ -290,11 +267,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
val controlId: String,
@ControlAction.ResponseResult val response: Int
) : CallbackRunnable(token) {
- override fun run() {
- if (provider?.user != currentUser) {
- Log.e(TAG, "User ${provider?.user} is not current user")
- return
- }
+ override fun doRun() {
provider?.let {
lazyController.get().onActionResponse(it.componentName, controlId, response)
}
@@ -306,7 +279,7 @@ open class ControlsBindingControllerImpl @Inject constructor(
val error: String,
val callback: ControlsBindingController.LoadCallback
) : CallbackRunnable(token) {
- override fun run() {
+ override fun doRun() {
callback.error(error)
provider?.let {
Log.e(TAG, "onError receive from '${it.componentName}': $error")
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
index 4b89fd48972b..f2881d41574c 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
@@ -59,14 +59,15 @@ interface ControlsController : UserAwareController {
)
/**
- * Request to subscribe for all favorite controls.
+ * Request to subscribe for favorited controls per structure
*
+ * @param structureInfo structure to limit the subscription to
* @see [ControlsBindingController.subscribe]
*/
- fun subscribeToFavorites()
+ fun subscribeToFavorites(structureInfo: StructureInfo)
/**
- * Request to unsubscribe to all providers.
+ * Request to unsubscribe to the current provider.
*
* @see [ControlsBindingController.unsubscribe]
*/
@@ -75,11 +76,12 @@ interface ControlsController : UserAwareController {
/**
* Notify a [ControlsProviderService] that an action has been performed on a [Control].
*
+ * @param componentName the name of the service that provides the [Control]
* @param controlInfo information of the [Control] receiving the action
* @param action action performed on the [Control]
* @see [ControlsBindingController.action]
*/
- fun action(controlInfo: ControlInfo, action: ControlAction)
+ fun action(componentName: ComponentName, controlInfo: ControlInfo, action: ControlAction)
/**
* Refresh the status of a [Control] with information provided from the service.
@@ -107,48 +109,29 @@ interface ControlsController : UserAwareController {
// FAVORITE MANAGEMENT
/**
- * Get a list of all favorite controls.
+ * Get all the favorites.
*
- * @return a list of [ControlInfo] with persistent information about the controls, including
- * their corresponding [ComponentName].
+ * @return a list of the structures that have at least one favorited control
*/
- fun getFavoriteControls(): List<ControlInfo>
+ fun getFavorites(): List<StructureInfo>
/**
* Get all the favorites for a given component.
*
- * @param componentName the name of the component of the [ControlsProviderService] with
- * which to filter the favorites.
- * @return a list of the favorite controls for the given service. All the elements of the list
- * will have the same [ControlInfo.component] matching the one requested.
+ * @param componentName the name of the service that provides the [Control]
+ * @return a list of the structures that have at least one favorited control
*/
- fun getFavoritesForComponent(componentName: ComponentName): List<ControlInfo>
+ fun getFavoritesForComponent(componentName: ComponentName): List<StructureInfo>
/**
- * Replaces the favorites for the given component.
+ * Replaces the favorites for the given structure.
*
* Calling this method will eliminate the previous selection of favorites and replace it with a
* new one.
*
- * @param componentName The name of the component for the [ControlsProviderService]
- * @param favorites a list of [ControlInfo] to replace the previous favorites.
- */
- fun replaceFavoritesForComponent(componentName: ComponentName, favorites: List<ControlInfo>)
-
- /**
- * Change the favorite status of a single [Control].
- *
- * If the control is added to favorites, it will be added to the end of the list for that
- * particular component. Matching for removing the control will be done based on
- * [ControlInfo.component] and [ControlInfo.controlId].
- *
- * Trying to add an already favorite control or trying to remove one that is not a favorite is
- * a no-op.
- *
- * @param controlInfo persistent information about the [Control].
- * @param state `true` to add to favorites and `false` to remove.
+ * @param structureInfo common structure for all of the favorited controls
*/
- fun changeFavoriteStatus(controlInfo: ControlInfo, state: Boolean)
+ fun replaceFavoritesForStructure(structureInfo: StructureInfo)
/**
* Return the number of favorites for a given component.
@@ -161,14 +144,6 @@ interface ControlsController : UserAwareController {
fun countFavoritesForComponent(componentName: ComponentName): Int
/**
- * Clears the list of all favorites.
- *
- * To clear the list of favorites for a given service, call [replaceFavoritesForComponent] with
- * an empty list.
- */
- fun clearFavorites()
-
- /**
* Interface for structure to pass data to [ControlsFavoritingActivity].
*/
interface LoadData {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
index 3b06ebef9443..dedd341a46be 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -31,13 +31,12 @@ import android.os.UserHandle
import android.provider.Settings
import android.service.controls.Control
import android.service.controls.actions.ControlAction
-import android.util.ArrayMap
import android.util.Log
-import com.android.internal.annotations.GuardedBy
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.controls.ControlStatus
+import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.dagger.qualifiers.Background
@@ -71,12 +70,6 @@ class ControlsControllerImpl @Inject constructor (
private const val DEFAULT_ENABLED = 1
}
- // Map of map: ComponentName -> (String -> ControlInfo).
- //
- @GuardedBy("currentFavorites")
- private val currentFavorites = ArrayMap<ComponentName, MutableList<ControlInfo>>()
- .withDefault { mutableListOf() }
-
private var userChanging: Boolean = true
private var currentUser = UserHandle.of(ActivityManager.getCurrentUser())
@@ -108,12 +101,7 @@ class ControlsControllerImpl @Inject constructor (
persistenceWrapper.changeFile(fileName)
available = Settings.Secure.getIntForUser(contentResolver, CONTROLS_AVAILABLE,
DEFAULT_ENABLED, newUser.identifier) != 0
- synchronized(currentFavorites) {
- currentFavorites.clear()
- }
- if (available) {
- loadFavorites()
- }
+ resetFavorites(available)
bindingController.changeUser(newUser)
listingController.changeUser(newUser)
userChanging = false
@@ -123,6 +111,7 @@ class ControlsControllerImpl @Inject constructor (
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_USER_SWITCHED) {
userChanging = true
+ listingController.removeCallback(listingCallback)
val newUser =
UserHandle.of(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, sendingUserId))
if (currentUser == newUser) {
@@ -144,20 +133,43 @@ class ControlsControllerImpl @Inject constructor (
}
available = Settings.Secure.getIntForUser(contentResolver, CONTROLS_AVAILABLE,
DEFAULT_ENABLED, currentUserId) != 0
- synchronized(currentFavorites) {
- currentFavorites.clear()
- }
- if (available) {
- loadFavorites()
+ resetFavorites(available)
+ }
+ }
+
+ // Handling of removed components
+
+ /**
+ * Check if any component has been removed and if so, remove all its favorites.
+ *
+ * If some component has been removed, the new set of favorites will also be saved.
+ */
+ private val listingCallback = object : ControlsListingController.ControlsListingCallback {
+ override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
+ executor.execute {
+ val serviceInfoSet = serviceInfos.map(ControlsServiceInfo::componentName).toSet()
+ val favoriteComponentSet = Favorites.getAllStructures().map {
+ it.componentName
+ }.toSet()
+
+ var changed = false
+ favoriteComponentSet.subtract(serviceInfoSet).forEach {
+ changed = true
+ Favorites.removeStructures(it)
+ bindingController.onComponentRemoved(it)
+ }
+
+ // Check if something has been removed, if so, store the new list
+ if (changed) {
+ persistenceWrapper.storeFavorites(Favorites.getAllStructures())
+ }
}
}
}
init {
dumpManager.registerDumpable(javaClass.name, this)
- if (available) {
- loadFavorites()
- }
+ resetFavorites(available)
userChanging = false
broadcastDispatcher.registerReceiver(
userSwitchReceiver,
@@ -168,6 +180,15 @@ class ControlsControllerImpl @Inject constructor (
contentResolver.registerContentObserver(URI, false, settingObserver, UserHandle.USER_ALL)
}
+ private fun resetFavorites(shouldLoad: Boolean) {
+ Favorites.clear()
+
+ if (shouldLoad) {
+ Favorites.load(persistenceWrapper.readFavorites())
+ listingController.addCallback(listingCallback)
+ }
+ }
+
private fun confirmAvailability(): Boolean {
if (userChanging) {
Log.w(TAG, "Controls not available while user is changing")
@@ -180,15 +201,6 @@ class ControlsControllerImpl @Inject constructor (
return true
}
- private fun loadFavorites() {
- val infos = persistenceWrapper.readFavorites()
- synchronized(currentFavorites) {
- infos.forEach {
- currentFavorites.getOrPut(it.component, { mutableListOf() }).add(it)
- }
- }
- }
-
override fun loadForComponent(
componentName: ComponentName,
dataCallback: Consumer<ControlsController.LoadData>
@@ -211,41 +223,41 @@ class ControlsControllerImpl @Inject constructor (
componentName,
object : ControlsBindingController.LoadCallback {
override fun accept(controls: List<Control>) {
- val loadData = synchronized(currentFavorites) {
- val favoritesForComponentKeys: List<String> =
- currentFavorites.getValue(componentName).map { it.controlId }
- val changed = updateFavoritesLocked(componentName, controls,
- favoritesForComponentKeys)
+ executor.execute {
+ val favoritesForComponentKeys = Favorites
+ .getControlsForComponent(componentName).map { it.controlId }
+
+ val changed = Favorites.updateControls(componentName, controls)
if (changed) {
- persistenceWrapper.storeFavorites(favoritesAsListLocked())
+ persistenceWrapper.storeFavorites(Favorites.getAllStructures())
}
- val removed = findRemovedLocked(favoritesForComponentKeys.toSet(),
- controls)
+ val removed = findRemoved(favoritesForComponentKeys.toSet(), controls)
val controlsWithFavorite = controls.map {
ControlStatus(it, it.controlId in favoritesForComponentKeys)
}
- createLoadDataObject(
- currentFavorites.getValue(componentName)
- .filter { it.controlId in removed }
- .map { createRemovedStatus(it) } +
- controlsWithFavorite,
- favoritesForComponentKeys
+ val loadData = createLoadDataObject(
+ Favorites.getControlsForComponent(componentName)
+ .filter { it.controlId in removed }
+ .map { createRemovedStatus(componentName, it) } +
+ controlsWithFavorite,
+ favoritesForComponentKeys
)
+
+ dataCallback.accept(loadData)
}
- dataCallback.accept(loadData)
}
override fun error(message: String) {
- val loadData = synchronized(currentFavorites) {
- val favoritesForComponent = currentFavorites.getValue(componentName)
- val favoritesForComponentKeys = favoritesForComponent
- .map { it.controlId }
- createLoadDataObject(
- favoritesForComponent.map { createRemovedStatus(it, false) },
- favoritesForComponentKeys,
+ val loadData = Favorites.getControlsForComponent(componentName).let {
+ controls ->
+ val keys = controls.map { it.controlId }
+ createLoadDataObject(
+ controls.map { createRemovedStatus(componentName, it, false) },
+ keys,
true
- )
+ )
}
+
dataCallback.accept(loadData)
}
}
@@ -253,15 +265,16 @@ class ControlsControllerImpl @Inject constructor (
}
private fun createRemovedStatus(
+ componentName: ComponentName,
controlInfo: ControlInfo,
setRemoved: Boolean = true
): ControlStatus {
val intent = Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
- this.`package` = controlInfo.component.packageName
+ this.`package` = componentName.packageName
}
val pendingIntent = PendingIntent.getActivity(context,
- controlInfo.component.hashCode(),
+ componentName.hashCode(),
intent,
0)
val control = Control.StatelessBuilder(controlInfo.controlId, pendingIntent)
@@ -271,50 +284,15 @@ class ControlsControllerImpl @Inject constructor (
return ControlStatus(control, true, setRemoved)
}
- @GuardedBy("currentFavorites")
- private fun findRemovedLocked(favoriteKeys: Set<String>, list: List<Control>): Set<String> {
+ private fun findRemoved(favoriteKeys: Set<String>, list: List<Control>): Set<String> {
val controlsKeys = list.map { it.controlId }
return favoriteKeys.minus(controlsKeys)
}
- @GuardedBy("currentFavorites")
- private fun updateFavoritesLocked(
- componentName: ComponentName,
- list: List<Control>,
- favoriteKeys: List<String>
- ): Boolean {
- val favorites = currentFavorites.get(componentName) ?: mutableListOf()
- if (favoriteKeys.isEmpty()) return false // early return
- var changed = false
- list.forEach { control ->
- if (control.controlId in favoriteKeys) {
- val index = favorites.indexOfFirst { it.controlId == control.controlId }
- val value = favorites[index]
- if (value.controlTitle != control.title ||
- value.deviceType != control.deviceType) {
- favorites[index] = value.copy(
- controlTitle = control.title,
- deviceType = control.deviceType
- )
- changed = true
- }
- }
- }
- return changed
- }
-
- @GuardedBy("currentFavorites")
- private fun favoritesAsListLocked(): List<ControlInfo> {
- return currentFavorites.flatMap { it.value }
- }
-
- override fun subscribeToFavorites() {
+ override fun subscribeToFavorites(structureInfo: StructureInfo) {
if (!confirmAvailability()) return
- // Make a copy of the favorites list
- val favorites = synchronized(currentFavorites) {
- currentFavorites.flatMap { it.value }
- }
- bindingController.subscribe(favorites)
+
+ bindingController.subscribe(structureInfo)
}
override fun unsubscribe() {
@@ -322,44 +300,12 @@ class ControlsControllerImpl @Inject constructor (
bindingController.unsubscribe()
}
- override fun changeFavoriteStatus(controlInfo: ControlInfo, state: Boolean) {
+ override fun replaceFavoritesForStructure(structureInfo: StructureInfo) {
if (!confirmAvailability()) return
- var changed = false
- val listOfControls = synchronized(currentFavorites) {
- if (state) {
- if (controlInfo.component !in currentFavorites) {
- currentFavorites.put(controlInfo.component, mutableListOf())
- changed = true
- }
- val controlsForComponent = currentFavorites.getValue(controlInfo.component)
- if (controlsForComponent.firstOrNull {
- it.controlId == controlInfo.controlId
- } == null) {
- controlsForComponent.add(controlInfo)
- changed = true
- }
- } else {
- changed = currentFavorites.get(controlInfo.component)
- ?.remove(controlInfo) != null
- }
- favoritesAsListLocked()
- }
- if (changed) {
- persistenceWrapper.storeFavorites(listOfControls)
- }
- }
-
- override fun replaceFavoritesForComponent(
- componentName: ComponentName,
- favorites: List<ControlInfo>
- ) {
- if (!confirmAvailability()) return
- val filtered = favorites.filter { it.component == componentName }
- val listOfControls = synchronized(currentFavorites) {
- currentFavorites.put(componentName, filtered.toMutableList())
- favoritesAsListLocked()
+ executor.execute {
+ Favorites.replaceControls(structureInfo)
+ persistenceWrapper.storeFavorites(Favorites.getAllStructures())
}
- persistenceWrapper.storeFavorites(listOfControls)
}
override fun refreshStatus(componentName: ComponentName, control: Control) {
@@ -368,17 +314,12 @@ class ControlsControllerImpl @Inject constructor (
return
}
executor.execute {
- synchronized(currentFavorites) {
- val favoriteKeysForComponent =
- currentFavorites.get(componentName)?.map { it.controlId } ?: emptyList()
- val changed = updateFavoritesLocked(
- componentName,
- listOf(control),
- favoriteKeysForComponent
- )
- if (changed) {
- persistenceWrapper.storeFavorites(favoritesAsListLocked())
- }
+ val changed = Favorites.updateControls(
+ componentName,
+ listOf(control)
+ )
+ if (changed) {
+ persistenceWrapper.storeFavorites(Favorites.getAllStructures())
}
}
uiController.onRefreshState(componentName, listOf(control))
@@ -389,41 +330,22 @@ class ControlsControllerImpl @Inject constructor (
uiController.onActionResponse(componentName, controlId, response)
}
- override fun getFavoriteControls(): List<ControlInfo> {
- if (!confirmAvailability()) return emptyList()
- synchronized(currentFavorites) {
- return favoritesAsListLocked()
- }
- }
-
- override fun action(controlInfo: ControlInfo, action: ControlAction) {
+ override fun action(
+ componentName: ComponentName,
+ controlInfo: ControlInfo,
+ action: ControlAction
+ ) {
if (!confirmAvailability()) return
- bindingController.action(controlInfo, action)
+ bindingController.action(componentName, controlInfo, action)
}
- override fun clearFavorites() {
- if (!confirmAvailability()) return
- val changed = synchronized(currentFavorites) {
- currentFavorites.isNotEmpty().also {
- currentFavorites.clear()
- }
- }
- if (changed) {
- persistenceWrapper.storeFavorites(emptyList())
- }
- }
+ override fun getFavorites(): List<StructureInfo> = Favorites.getAllStructures()
- override fun countFavoritesForComponent(componentName: ComponentName): Int {
- return synchronized(currentFavorites) {
- currentFavorites.get(componentName)?.size ?: 0
- }
- }
+ override fun countFavoritesForComponent(componentName: ComponentName): Int =
+ Favorites.getControlsForComponent(componentName).size
- override fun getFavoritesForComponent(componentName: ComponentName): List<ControlInfo> {
- return synchronized(currentFavorites) {
- currentFavorites.get(componentName) ?: emptyList()
- }
- }
+ override fun getFavoritesForComponent(componentName: ComponentName): List<StructureInfo> =
+ Favorites.getStructuresForComponent(componentName)
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
pw.println("ControlsController state:")
@@ -431,11 +353,114 @@ class ControlsControllerImpl @Inject constructor (
pw.println(" Changing users: $userChanging")
pw.println(" Current user: ${currentUser.identifier}")
pw.println(" Favorites:")
- synchronized(currentFavorites) {
- favoritesAsListLocked().forEach {
- pw.println(" ${ it }")
+ Favorites.getAllStructures().forEach { s ->
+ pw.println(" ${ s }")
+ s.controls.forEach { c ->
+ pw.println(" ${ c }")
}
}
pw.println(bindingController.toString())
}
-} \ No newline at end of file
+}
+
+/**
+ * Relies on immutable data for thread safety. When necessary to update favMap, use reassignment to
+ * replace it, which will not disrupt any ongoing map traversal.
+ *
+ * Update/replace calls should use thread isolation to avoid race conditions.
+ */
+private object Favorites {
+ private var favMap = mapOf<ComponentName, List<StructureInfo>>()
+
+ fun getAllStructures(): List<StructureInfo> = favMap.flatMap { it.value }
+
+ fun getStructuresForComponent(componentName: ComponentName): List<StructureInfo> =
+ favMap.get(componentName) ?: emptyList()
+
+ fun getControlsForStructure(structure: StructureInfo): List<ControlInfo> =
+ getStructuresForComponent(structure.componentName)
+ .firstOrNull { it.structure == structure.structure }
+ ?.controls ?: emptyList()
+
+ fun getControlsForComponent(componentName: ComponentName): List<ControlInfo> =
+ getStructuresForComponent(componentName).flatMap { it.controls }
+
+ fun load(structures: List<StructureInfo>) {
+ favMap = structures.groupBy { it.componentName }
+ }
+
+ fun updateControls(componentName: ComponentName, controls: List<Control>): Boolean {
+ val controlsById = controls.associateBy { it.controlId }
+
+ // utilize a new map to allow for changes to structure names
+ val structureToControls = mutableMapOf<CharSequence, MutableList<ControlInfo>>()
+
+ // Must retain the current control order within each structure
+ var changed = false
+ getStructuresForComponent(componentName).forEach { s ->
+ s.controls.forEach { c ->
+ val (sName, ci) = controlsById.get(c.controlId)?.let { updatedControl ->
+ val controlInfo = if (updatedControl.title != c.controlTitle ||
+ updatedControl.deviceType != c.deviceType) {
+ changed = true
+ c.copy(
+ controlTitle = updatedControl.title,
+ deviceType = updatedControl.deviceType
+ )
+ } else { c }
+
+ val updatedStructure = updatedControl.structure ?: ""
+ if (s.structure != updatedStructure) {
+ changed = true
+ }
+
+ Pair(updatedStructure, controlInfo)
+ } ?: Pair(s.structure, c)
+
+ structureToControls.getOrPut(sName, { mutableListOf() }).add(ci)
+ }
+ }
+ if (!changed) return false
+
+ val structures = structureToControls.map { (s, cs) -> StructureInfo(componentName, s, cs) }
+
+ val newFavMap = favMap.toMutableMap()
+ newFavMap.put(componentName, structures)
+ favMap = newFavMap
+
+ return true
+ }
+
+ fun removeStructures(componentName: ComponentName) {
+ val newFavMap = favMap.toMutableMap()
+ newFavMap.remove(componentName)
+ favMap = newFavMap
+ }
+
+ fun replaceControls(updatedStructure: StructureInfo) {
+ val newFavMap = favMap.toMutableMap()
+ val structures = mutableListOf<StructureInfo>()
+ val componentName = updatedStructure.componentName
+
+ var replaced = false
+ getStructuresForComponent(componentName).forEach { s ->
+ val newStructure = if (s.structure == updatedStructure.structure) {
+ replaced = true
+ updatedStructure
+ } else { s }
+
+ structures.add(newStructure)
+ }
+
+ if (!replaced) {
+ structures.add(updatedStructure)
+ }
+
+ newFavMap.put(componentName, structures.toList())
+ favMap = newFavMap.toMap()
+ }
+
+ fun clear() {
+ favMap = mapOf<ComponentName, List<StructureInfo>>()
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapper.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapper.kt
index 883f8a93d910..4bea6ef3d7b9 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapper.kt
@@ -45,11 +45,17 @@ class ControlsFavoritePersistenceWrapper(
private const val TAG = "ControlsFavoritePersistenceWrapper"
const val FILE_NAME = "controls_favorites.xml"
private const val TAG_CONTROLS = "controls"
+ private const val TAG_STRUCTURES = "structures"
+ private const val TAG_STRUCTURE = "structure"
private const val TAG_CONTROL = "control"
private const val TAG_COMPONENT = "component"
private const val TAG_ID = "id"
private const val TAG_TITLE = "title"
private const val TAG_TYPE = "type"
+ private const val TAG_VERSION = "version"
+
+ // must increment with every change to the XML structure
+ private const val VERSION = 1
}
/**
@@ -66,7 +72,7 @@ class ControlsFavoritePersistenceWrapper(
*
* @param list a list of favorite controls. The list will be stored in the same order.
*/
- fun storeFavorites(list: List<ControlInfo>) {
+ fun storeFavorites(structures: List<StructureInfo>) {
executor.execute {
Log.d(TAG, "Saving data to file: $file")
val atomicFile = AtomicFile(file)
@@ -81,16 +87,28 @@ class ControlsFavoritePersistenceWrapper(
setOutput(writer, "utf-8")
setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
startDocument(null, true)
- startTag(null, TAG_CONTROLS)
- list.forEach {
- startTag(null, TAG_CONTROL)
- attribute(null, TAG_COMPONENT, it.component.flattenToString())
- attribute(null, TAG_ID, it.controlId)
- attribute(null, TAG_TITLE, it.controlTitle.toString())
- attribute(null, TAG_TYPE, it.deviceType.toString())
- endTag(null, TAG_CONTROL)
+ startTag(null, TAG_VERSION)
+ text("$VERSION")
+ endTag(null, TAG_VERSION)
+
+ startTag(null, TAG_STRUCTURES)
+ structures.forEach { s ->
+ startTag(null, TAG_STRUCTURE)
+ attribute(null, TAG_COMPONENT, s.componentName.flattenToString())
+ attribute(null, TAG_STRUCTURE, s.structure.toString())
+
+ startTag(null, TAG_CONTROLS)
+ s.controls.forEach { c ->
+ startTag(null, TAG_CONTROL)
+ attribute(null, TAG_ID, c.controlId)
+ attribute(null, TAG_TITLE, c.controlTitle.toString())
+ attribute(null, TAG_TYPE, c.deviceType.toString())
+ endTag(null, TAG_CONTROL)
+ }
+ endTag(null, TAG_CONTROLS)
+ endTag(null, TAG_STRUCTURE)
}
- endTag(null, TAG_CONTROLS)
+ endTag(null, TAG_STRUCTURES)
endDocument()
atomicFile.finishWrite(writer)
}
@@ -109,7 +127,7 @@ class ControlsFavoritePersistenceWrapper(
* @return a list of stored favorite controls. Return an empty list if the file is not found
* @throws [IllegalStateException] if there is an error while reading the file
*/
- fun readFavorites(): List<ControlInfo> {
+ fun readFavorites(): List<StructureInfo> {
if (!file.exists()) {
Log.d(TAG, "No favorites, returning empty list")
return emptyList()
@@ -134,25 +152,32 @@ class ControlsFavoritePersistenceWrapper(
}
}
- private fun parseXml(parser: XmlPullParser): List<ControlInfo> {
+ private fun parseXml(parser: XmlPullParser): List<StructureInfo> {
var type: Int
- val infos = mutableListOf<ControlInfo>()
+ val infos = mutableListOf<StructureInfo>()
+
+ var lastComponent: ComponentName? = null
+ var lastStructure: CharSequence? = null
+ var controls = mutableListOf<ControlInfo>()
while (parser.next().also { type = it } != XmlPullParser.END_DOCUMENT) {
- if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
- continue
- }
- val tagName = parser.name
- if (tagName == TAG_CONTROL) {
- val component = ComponentName.unflattenFromString(
- parser.getAttributeValue(null, TAG_COMPONENT))
+ val tagName = parser.name ?: ""
+ if (type == XmlPullParser.START_TAG && tagName == TAG_STRUCTURE) {
+ lastComponent = ComponentName.unflattenFromString(
+ parser.getAttributeValue(null, TAG_COMPONENT))
+ lastStructure = parser.getAttributeValue(null, TAG_STRUCTURE) ?: ""
+ } else if (type == XmlPullParser.START_TAG && tagName == TAG_CONTROL) {
val id = parser.getAttributeValue(null, TAG_ID)
val title = parser.getAttributeValue(null, TAG_TITLE)
val deviceType = parser.getAttributeValue(null, TAG_TYPE)?.toInt()
- if (component != null && id != null && title != null && deviceType != null) {
- infos.add(ControlInfo(component, id, title, deviceType))
+ if (id != null && title != null && deviceType != null) {
+ controls.add(ControlInfo(id, title, deviceType))
}
+ } else if (type == XmlPullParser.END_TAG && tagName == TAG_STRUCTURE) {
+ infos.add(StructureInfo(lastComponent!!, lastStructure!!, controls.toList()))
+ controls.clear()
}
}
+
return infos
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt
index a53fcd498236..86e8e834faf1 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt
@@ -96,29 +96,30 @@ class ControlsProviderLifecycleManager(
}
private fun bindService(bind: Boolean) {
- requiresBound = bind
- if (bind) {
- if (bindTryCount == MAX_BIND_RETRIES) {
- return
+ executor.execute {
+ requiresBound = bind
+ if (bind) {
+ if (bindTryCount != MAX_BIND_RETRIES) {
+ if (DEBUG) {
+ Log.d(TAG, "Binding service $intent")
+ }
+ bindTryCount++
+ try {
+ context.bindServiceAsUser(intent, serviceConnection, BIND_FLAGS, user)
+ } catch (e: SecurityException) {
+ Log.e(TAG, "Failed to bind to service", e)
+ }
+ }
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "Unbinding service $intent")
+ }
+ bindTryCount = 0
+ wrapper?.run {
+ context.unbindService(serviceConnection)
+ }
+ wrapper = null
}
- if (DEBUG) {
- Log.d(TAG, "Binding service $intent")
- }
- bindTryCount++
- try {
- context.bindServiceAsUser(intent, serviceConnection, BIND_FLAGS, user)
- } catch (e: SecurityException) {
- Log.e(TAG, "Failed to bind to service", e)
- }
- } else {
- if (DEBUG) {
- Log.d(TAG, "Unbinding service $intent")
- }
- bindTryCount = 0
- wrapper?.run {
- context.unbindService(serviceConnection)
- }
- wrapper = null
}
}
@@ -320,6 +321,9 @@ class ControlsProviderLifecycleManager(
onLoadCanceller?.run()
onLoadCanceller = null
+ // just in case this wasn't called already
+ unsubscribe()
+
bindService(false)
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/StructureInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/StructureInfo.kt
new file mode 100644
index 000000000000..34bfa135f0c8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/StructureInfo.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.controls.controller
+
+import android.content.ComponentName
+
+/**
+ * Stores basic information about a Structure to persist and keep track of favorites.
+ *
+ * Every [component] [structure] pair uniquely identifies the structure.
+ *
+ * @property componentName the name of the component that provides the [Control].
+ * @property structure common structure name of all underlying [controls], or empty string
+ * @property controls all controls in the name structure
+ */
+data class StructureInfo(
+ val componentName: ComponentName,
+ val structure: CharSequence,
+ val controls: List<ControlInfo>
+)
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt
index 25ebc65357ee..8b3454a2bc7c 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt
@@ -26,14 +26,13 @@ import android.widget.TextView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.RecyclerView
-import com.android.settingslib.applications.DefaultAppInfo
-import com.android.settingslib.widget.CandidateInfo
import com.android.systemui.R
+import com.android.systemui.controls.ControlsServiceInfo
import java.text.Collator
import java.util.concurrent.Executor
/**
- * Adapter for binding [CandidateInfo] related to [ControlsProviderService].
+ * Adapter for binding [ControlsServiceInfo] related to [ControlsProviderService].
*
* This class handles subscribing and keeping track of the list of valid applications for
* displaying.
@@ -55,16 +54,16 @@ class AppAdapter(
private val resources: Resources
) : RecyclerView.Adapter<AppAdapter.Holder>() {
- private var listOfServices = emptyList<CandidateInfo>()
+ private var listOfServices = emptyList<ControlsServiceInfo>()
private val callback = object : ControlsListingController.ControlsListingCallback {
- override fun onServicesUpdated(candidates: List<CandidateInfo>) {
+ override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
backgroundExecutor.execute {
val collator = Collator.getInstance(resources.configuration.locales[0])
- val localeComparator = compareBy<CandidateInfo, CharSequence>(collator) {
+ val localeComparator = compareBy<ControlsServiceInfo, CharSequence>(collator) {
it.loadLabel()
}
- listOfServices = candidates.sortedWith(localeComparator)
+ listOfServices = serviceInfos.sortedWith(localeComparator)
uiExecutor.execute(::notifyDataSetChanged)
}
}
@@ -100,11 +99,10 @@ class AppAdapter(
* Bind data to the view
* @param data Information about the [ControlsProviderService] to bind to the data
*/
- fun bindData(data: CandidateInfo) {
+ fun bindData(data: ControlsServiceInfo) {
icon.setImageDrawable(data.loadIcon())
title.text = data.loadLabel()
- favorites.text = favRenderer.renderFavoritesForComponent(
- (data as DefaultAppInfo).componentName)
+ favorites.text = favRenderer.renderFavoritesForComponent(data.componentName)
}
}
}
@@ -122,4 +120,4 @@ class FavoritesRenderer(
return ""
}
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
index 0870a4d179c9..e87cf74401bf 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
@@ -136,7 +136,10 @@ private class ControlHolder(view: View, val favoriteCallback: ModelFavoriteChang
private val title: TextView = itemView.requireViewById(R.id.title)
private val subtitle: TextView = itemView.requireViewById(R.id.subtitle)
private val removed: TextView = itemView.requireViewById(R.id.status)
- private val favorite: CheckBox = itemView.requireViewById<CheckBox>(R.id.favorite).apply {
+ private val favorite: CheckBox = itemView.requireViewById<CheckBox>(R.id.favorite)
+ private val favoriteFrame: ViewGroup = itemView
+ .requireViewById<ViewGroup>(R.id.favorite_container)
+ .apply {
visibility = View.VISIBLE
}
@@ -151,6 +154,7 @@ private class ControlHolder(view: View, val favoriteCallback: ModelFavoriteChang
favorite.setOnClickListener {
favoriteCallback(data.control.controlId, favorite.isChecked)
}
+ favoriteFrame.setOnClickListener { favorite.performClick() }
applyRenderInfo(renderInfo)
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
index 2c014498fdc2..08a1a5000112 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
@@ -29,6 +29,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.systemui.R
import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.controls.controller.StructureInfo
import com.android.systemui.controls.controller.ControlsControllerImpl
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.settings.CurrentUserTracker
@@ -52,6 +53,7 @@ class ControlsFavoritingActivity @Inject constructor(
private lateinit var statusText: TextView
private var model: ControlsModel? = null
private var component: ComponentName? = null
+ private var structureName: CharSequence = ""
private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) {
private val startingUser = controller.currentUserId
@@ -97,11 +99,11 @@ class ControlsFavoritingActivity @Inject constructor(
requireViewById<Button>(R.id.done).setOnClickListener {
if (component == null) return@setOnClickListener
val favoritesForStorage = model?.favorites?.map {
- it.componentName = component!!
it.build()
}
if (favoritesForStorage != null) {
- controller.replaceFavoritesForComponent(component!!, favoritesForStorage)
+ controller.replaceFavoritesForStructure(StructureInfo(component!!, structureName,
+ favoritesForStorage))
finishAffinity()
}
}
@@ -112,6 +114,12 @@ class ControlsFavoritingActivity @Inject constructor(
val allControls = data.allControls
val favoriteKeys = data.favoritesIds
val error = data.errorOnLoad
+ val structures = allControls.fold(hashSetOf<CharSequence>()) {
+ s, c ->
+ s.add(c.control.structure ?: "")
+ s
+ }
+ // TODO add multi structure switching support
executor.execute {
val emptyZoneString = resources.getText(
R.string.controls_favorite_other_zone_header)
@@ -149,4 +157,4 @@ class ControlsFavoritingActivity @Inject constructor(
currentUserTracker.stopTracking()
super.onDestroy()
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingController.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingController.kt
index 8e47f6466955..647daccca8bd 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingController.kt
@@ -17,7 +17,7 @@
package com.android.systemui.controls.management
import android.content.ComponentName
-import com.android.settingslib.widget.CandidateInfo
+import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.UserAwareController
import com.android.systemui.statusbar.policy.CallbackController
@@ -31,7 +31,7 @@ interface ControlsListingController :
/**
* @return the current list of services that satisfies the [ServiceListing].
*/
- fun getCurrentServices(): List<CandidateInfo>
+ fun getCurrentServices(): List<ControlsServiceInfo>
/**
* Get the app label for a given component.
@@ -45,6 +45,6 @@ interface ControlsListingController :
@FunctionalInterface
interface ControlsListingCallback {
- fun onServicesUpdated(candidates: List<CandidateInfo>)
+ fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt
index 53f301939435..9b108cf3e34b 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt
@@ -24,7 +24,6 @@ import android.os.UserHandle
import android.service.controls.ControlsProviderService
import android.util.Log
import com.android.internal.annotations.VisibleForTesting
-import com.android.settingslib.applications.DefaultAppInfo
import com.android.settingslib.applications.ServiceListing
import com.android.settingslib.widget.CandidateInfo
import com.android.systemui.controls.ControlsServiceInfo
@@ -147,7 +146,7 @@ class ControlsListingControllerImpl @VisibleForTesting constructor(
* @return a list of components that satisfy the requirements to be a
* [ControlsProviderService]
*/
- override fun getCurrentServices(): List<CandidateInfo> =
+ override fun getCurrentServices(): List<ControlsServiceInfo> =
availableServices.map { ControlsServiceInfo(context, it) }
/**
@@ -157,7 +156,7 @@ class ControlsListingControllerImpl @VisibleForTesting constructor(
* @return a label as returned by [CandidateInfo.loadLabel] or `null`.
*/
override fun getAppLabel(name: ComponentName): CharSequence? {
- return getCurrentServices().firstOrNull { (it as? DefaultAppInfo)?.componentName == name }
+ return getCurrentServices().firstOrNull { it.componentName == name }
?.loadLabel()
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
index feaea7c0d835..f2c84906c868 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -122,7 +122,7 @@ class ControlViewHolder(
}
fun action(action: ControlAction) {
- controlsController.action(cws.ci, action)
+ controlsController.action(cws.componentName, cws.ci, action)
}
private fun findBehavior(status: Int, template: ControlTemplate): KClass<out Behavior> {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlWithState.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlWithState.kt
index 816f0b2cb1d1..0511555c5cf6 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlWithState.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlWithState.kt
@@ -16,6 +16,7 @@
package com.android.systemui.controls.ui
+import android.content.ComponentName
import android.service.controls.Control
import com.android.systemui.controls.controller.ControlInfo
@@ -23,9 +24,14 @@ import com.android.systemui.controls.controller.ControlInfo
/**
* A container for:
* <ul>
+ * <li>ComponentName - Component responsible for this Control
* <li>ControlInfo - Basic cached info about a Control
* <li>Control - Actual Control parcelable received directly from
* the participating application
* </ul>
*/
-data class ControlWithState(val ci: ControlInfo, val control: Control?)
+data class ControlWithState(
+ val componentName: ComponentName,
+ val ci: ControlInfo,
+ val control: Control?
+)
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index f4fd37557fa4..71fc01717baa 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -22,21 +22,28 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
+import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.os.IBinder
import android.service.controls.Control
import android.service.controls.TokenProvider
import android.util.Log
+import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.view.WindowManager
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.LinearLayout
+import android.widget.ListPopupWindow
import android.widget.Space
-
-import com.android.settingslib.widget.CandidateInfo
-import com.android.systemui.controls.controller.ControlsController
+import android.widget.TextView
+import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.controller.ControlInfo
+import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.controls.controller.StructureInfo
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.management.ControlsProviderSelectorActivity
import com.android.systemui.dagger.qualifiers.Background
@@ -55,8 +62,11 @@ import javax.inject.Singleton
private const val TOKEN = "https://www.googleapis.com/auth/assistant"
private const val SCOPE = "oauth2:" + TOKEN
private var tokenProviderConnection: TokenProviderConnection? = null
-class TokenProviderConnection(val cc: ControlsController, val context: Context)
- : ServiceConnection {
+class TokenProviderConnection(
+ val cc: ControlsController,
+ val context: Context,
+ val structure: StructureInfo?
+) : ServiceConnection {
private var mTokenProvider: TokenProvider? = null
override fun onServiceConnected(cName: ComponentName, binder: IBinder) {
@@ -70,7 +80,9 @@ class TokenProviderConnection(val cc: ControlsController, val context: Context)
Log.e(ControlsUiController.TAG, "NO ACCOUNT IS SET. Open HomeMock app")
} else {
mTokenProvider?.setAuthToken(getAuthToken(mLastAccountName))
- cc.subscribeToFavorites()
+ structure?.let {
+ cc.subscribeToFavorites(it)
+ }
}
}, "TokenProviderThread").start()
}
@@ -116,83 +128,115 @@ class ControlsUiControllerImpl @Inject constructor (
val context: Context,
@Main val uiExecutor: DelayableExecutor,
@Background val bgExecutor: DelayableExecutor,
- val controlsListingController: Lazy<ControlsListingController>
+ val controlsListingController: Lazy<ControlsListingController>,
+ @Main val sharedPreferences: SharedPreferences
) : ControlsUiController {
- private lateinit var controlInfos: List<ControlInfo>
+ companion object {
+ private const val PREF_COMPONENT = "controls_component"
+ private const val PREF_STRUCTURE = "controls_structure"
+
+ private val EMPTY_COMPONENT = ComponentName("", "")
+ private val EMPTY_STRUCTURE = StructureInfo(
+ EMPTY_COMPONENT,
+ "",
+ mutableListOf<ControlInfo>()
+ )
+ }
+
+ private var selectedStructure: StructureInfo = EMPTY_STRUCTURE
+ private lateinit var allStructures: List<StructureInfo>
private val controlsById = mutableMapOf<ControlKey, ControlWithState>()
private val controlViewsById = mutableMapOf<ControlKey, ControlViewHolder>()
private lateinit var parent: ViewGroup
+ private lateinit var lastItems: List<SelectionItem>
+ private var popup: ListPopupWindow? = null
+
+ private val addControlsItem = SelectionItem(
+ context.resources.getString(R.string.controls_providers_title),
+ "",
+ context.getDrawable(R.drawable.ic_add),
+ EMPTY_COMPONENT
+ )
override val available: Boolean
get() = controlsController.get().available
- private val listingCallback = object : ControlsListingController.ControlsListingCallback {
- override fun onServicesUpdated(candidates: List<CandidateInfo>) {
- bgExecutor.execute {
- val collator = Collator.getInstance(context.resources.configuration.locales[0])
- val localeComparator = compareBy<CandidateInfo, CharSequence>(collator) {
- it.loadLabel()
+ private lateinit var listingCallback: ControlsListingController.ControlsListingCallback
+
+ private fun createCallback(
+ onResult: (List<SelectionItem>) -> Unit
+ ): ControlsListingController.ControlsListingCallback {
+ return object : ControlsListingController.ControlsListingCallback {
+ override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
+ bgExecutor.execute {
+ val collator = Collator.getInstance(context.resources.configuration.locales[0])
+ val localeComparator = compareBy<ControlsServiceInfo, CharSequence>(collator) {
+ it.loadLabel()
+ }
+
+ val mList = serviceInfos.toMutableList()
+ mList.sortWith(localeComparator)
+ lastItems = mList.map {
+ SelectionItem(it.loadLabel(), "", it.loadIcon(), it.componentName)
+ }
+ uiExecutor.execute {
+ onResult(lastItems)
+ }
}
-
- val mList = candidates.toMutableList()
- mList.sortWith(localeComparator)
- loadInitialSetupViewIcons(mList.map { it.loadLabel() to it.loadIcon() })
}
}
}
override fun show(parent: ViewGroup) {
Log.d(ControlsUiController.TAG, "show()")
-
this.parent = parent
- controlInfos = controlsController.get().getFavoriteControls()
-
- controlInfos.map {
- ControlWithState(it, null)
- }.associateByTo(controlsById) { ControlKey(it.ci.component, it.ci.controlId) }
+ allStructures = controlsController.get().getFavorites()
+ selectedStructure = loadPreference(allStructures)
- if (controlInfos.isEmpty()) {
- showInitialSetupView()
+ if (selectedStructure.controls.isEmpty() && allStructures.size <= 1) {
+ // only show initial view if there are really no favorites across any structure
+ listingCallback = createCallback(::showInitialSetupView)
} else {
- showControlsView()
+ selectedStructure.controls.map {
+ ControlWithState(selectedStructure.componentName, it, null)
+ }.associateByTo(controlsById) {
+ ControlKey(selectedStructure.componentName, it.ci.controlId)
+ }
+ listingCallback = createCallback(::showControlsView)
}
+ controlsListingController.get().addCallback(listingCallback)
+
// Temp code to pass auth
- tokenProviderConnection = TokenProviderConnection(controlsController.get(), context)
+ tokenProviderConnection = TokenProviderConnection(controlsController.get(), context,
+ selectedStructure)
+
val serviceIntent = Intent()
serviceIntent.setComponent(ComponentName("com.android.systemui.home.mock",
"com.android.systemui.home.mock.AuthService"))
if (!context.bindService(serviceIntent, tokenProviderConnection!!,
Context.BIND_AUTO_CREATE)) {
- controlsController.get().subscribeToFavorites()
+ controlsController.get().subscribeToFavorites(selectedStructure)
}
}
- private fun showInitialSetupView() {
+ private fun showInitialSetupView(items: List<SelectionItem>) {
+ parent.removeAllViews()
+
val inflater = LayoutInflater.from(context)
inflater.inflate(R.layout.controls_no_favorites, parent, true)
val viewGroup = parent.requireViewById(R.id.controls_no_favorites_group) as ViewGroup
viewGroup.setOnClickListener(launchSelectorActivityListener(context))
- controlsListingController.get().addCallback(listingCallback)
- }
-
- private fun loadInitialSetupViewIcons(icons: List<Pair<CharSequence, Drawable>>) {
- uiExecutor.execute {
- val viewGroup = parent.requireViewById(R.id.controls_icon_row) as ViewGroup
- viewGroup.removeAllViews()
-
- val inflater = LayoutInflater.from(context)
- icons.forEach {
- val imageView = inflater.inflate(R.layout.controls_icon, viewGroup, false)
- as ImageView
- imageView.setContentDescription(it.first)
- imageView.setImageDrawable(it.second)
- viewGroup.addView(imageView)
- }
+ val iconRowGroup = parent.requireViewById(R.id.controls_icon_row) as ViewGroup
+ items.forEach {
+ val imageView = inflater.inflate(R.layout.controls_icon, viewGroup, false) as ImageView
+ imageView.setContentDescription(it.getTitle())
+ imageView.setImageDrawable(it.icon)
+ iconRowGroup.addView(imageView)
}
}
@@ -208,14 +252,16 @@ class ControlsUiControllerImpl @Inject constructor (
}
}
- private fun showControlsView() {
+ private fun showControlsView(items: List<SelectionItem>) {
+ parent.removeAllViews()
+ controlViewsById.clear()
+
val inflater = LayoutInflater.from(context)
inflater.inflate(R.layout.controls_with_favorites, parent, true)
val listView = parent.requireViewById(R.id.global_actions_controls_list) as ViewGroup
var lastRow: ViewGroup = createRow(inflater, listView)
- controlInfos.forEach {
- Log.d(ControlsUiController.TAG, "favorited control id: " + it.controlId)
+ selectedStructure.controls.forEach {
if (lastRow.getChildCount() == 2) {
lastRow = createRow(inflater, listView)
}
@@ -223,21 +269,114 @@ class ControlsUiControllerImpl @Inject constructor (
R.layout.controls_base_item, lastRow, false) as ViewGroup
lastRow.addView(item)
val cvh = ControlViewHolder(item, controlsController.get(), uiExecutor, bgExecutor)
- val key = ControlKey(it.component, it.controlId)
+ val key = ControlKey(selectedStructure.componentName, it.controlId)
cvh.bindData(controlsById.getValue(key))
controlViewsById.put(key, cvh)
}
- if ((controlInfos.size % 2) == 1) {
+ // add spacer if necessary to keep control size consistent
+ if ((selectedStructure.controls.size % 2) == 1) {
lastRow.addView(Space(context), LinearLayout.LayoutParams(0, 0, 1f))
}
- val moreImageView = parent.requireViewById(R.id.controls_more) as View
- moreImageView.setOnClickListener(launchSelectorActivityListener(context))
+ val itemsByComponent = items.associateBy { it.componentName }
+ var adapter = ItemAdapter(context, R.layout.controls_spinner_item).apply {
+ val listItems = allStructures.mapNotNull {
+ itemsByComponent.get(it.componentName)?.copy(structure = it.structure)
+ }
+
+ addAll(listItems + addControlsItem)
+ }
+
+ /*
+ * Default spinner widget does not work with the window type required
+ * for this dialog. Use a textView with the ListPopupWindow to achieve
+ * a similar effect
+ */
+ parent.requireViewById<TextView>(R.id.app_or_structure_spinner).apply {
+ setText((adapter.findSelectionItem(selectedStructure) ?: adapter.getItem(0)).getTitle())
+ }
+ val anchor = parent.requireViewById<ViewGroup>(R.id.controls_header)
+ anchor.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(v: View) {
+ popup = ListPopupWindow(
+ ContextThemeWrapper(context, R.style.Control_ListPopupWindow))
+ popup?.apply {
+ setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
+ setAnchorView(anchor)
+ setAdapter(adapter)
+ setModal(true)
+ setOnItemClickListener(object : AdapterView.OnItemClickListener {
+ override fun onItemClick(
+ parent: AdapterView<*>,
+ view: View,
+ pos: Int,
+ id: Long
+ ) {
+ val listItem = parent.getItemAtPosition(pos) as SelectionItem
+ this@ControlsUiControllerImpl.switchAppOrStructure(listItem)
+ dismiss()
+ }
+ })
+ // need to call show() first in order to construct the listView
+ show()
+ getListView()?.apply {
+ setDividerHeight(
+ context.resources.getDimensionPixelSize(R.dimen.control_list_divider))
+ setDivider(
+ context.resources.getDrawable(R.drawable.controls_list_divider))
+ }
+ show()
+ }
+ }
+ })
+
+ parent.requireViewById<ImageView>(R.id.app_icon).apply {
+ setContentDescription("My Home")
+ setImageDrawable(items[0].icon)
+ }
+ }
+
+ private fun loadPreference(structures: List<StructureInfo>): StructureInfo {
+ if (structures.isEmpty()) return EMPTY_STRUCTURE
+
+ val component = sharedPreferences.getString(PREF_COMPONENT, null)?.let {
+ ComponentName.unflattenFromString(it)
+ } ?: EMPTY_COMPONENT
+ val structure = sharedPreferences.getString(PREF_STRUCTURE, "")
+
+ return structures.firstOrNull {
+ component == it.componentName && structure == it.structure
+ } ?: structures.get(0)
+ }
+
+ private fun updatePreferences(si: StructureInfo) {
+ sharedPreferences.edit()
+ .putString(PREF_COMPONENT, si.componentName.flattenToString())
+ .putString(PREF_STRUCTURE, si.structure.toString())
+ .commit()
+ }
+
+ private fun switchAppOrStructure(item: SelectionItem) {
+ if (item == addControlsItem) {
+ launchSelectorActivityListener(context)(parent)
+ } else {
+ val newSelection = allStructures.first {
+ it.structure == item.structure && it.componentName == item.componentName
+ }
+
+ if (newSelection != selectedStructure) {
+ selectedStructure = newSelection
+ updatePreferences(selectedStructure)
+ showControlsView(lastItems)
+ }
+ }
}
override fun hide() {
Log.d(ControlsUiController.TAG, "hide()")
+ popup?.dismiss()
+
controlsController.get().unsubscribe()
context.unbindService(tokenProviderConnection)
tokenProviderConnection = null
@@ -253,7 +392,7 @@ class ControlsUiControllerImpl @Inject constructor (
controls.forEach { c ->
controlsById.get(ControlKey(componentName, c.getControlId()))?.let {
Log.d(ControlsUiController.TAG, "onRefreshState() for id: " + c.getControlId())
- val cws = ControlWithState(it.ci, c)
+ val cws = ControlWithState(componentName, it.ci, c)
val key = ControlKey(componentName, c.getControlId())
controlsById.put(key, cws)
@@ -277,3 +416,46 @@ class ControlsUiControllerImpl @Inject constructor (
return row
}
}
+
+private data class SelectionItem(
+ val appName: CharSequence,
+ val structure: CharSequence,
+ val icon: Drawable,
+ val componentName: ComponentName
+) {
+ fun getTitle() = if (structure.isEmpty()) { appName } else { structure }
+}
+
+private class ItemAdapter(
+ val parentContext: Context,
+ val resource: Int
+) : ArrayAdapter<SelectionItem>(parentContext, resource) {
+
+ val layoutInflater = LayoutInflater.from(context)
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
+ val item = getItem(position)
+ val view = convertView ?: layoutInflater.inflate(resource, parent, false)
+ view.requireViewById<TextView>(R.id.controls_spinner_item).apply {
+ setText(item.getTitle())
+ }
+ view.requireViewById<ImageView>(R.id.app_icon).apply {
+ setContentDescription(item.getTitle())
+ setImageDrawable(item.icon)
+ }
+ return view
+ }
+
+ fun findSelectionItem(si: StructureInfo): SelectionItem? {
+ var i = 0
+ while (i < getCount()) {
+ val item = getItem(i)
+ if (item.componentName == si.componentName &&
+ item.structure == si.structure) {
+ return item
+ }
+ i++
+ }
+ return null
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 375d9bbbd4fe..be9fcbf19f12 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -328,7 +328,8 @@ public class DividerView extends FrameLayout implements OnTouchListener,
// Our window doesn't cover entire display, so we use the display frame to re-calculate
// the insets.
final InsetsState state = getWindowInsetsController().getState();
- insets = state.calculateInsets(state.getDisplayFrame(), insets.isRound(),
+ insets = state.calculateInsets(state.getDisplayFrame(),
+ null /* ignoringVisibilityState */, insets.isRound(),
insets.shouldAlwaysConsumeSystemBars(), insets.getDisplayCutout(),
null /* legacyContentInsets */, null /* legacyStableInsets */,
0 /* legacySystemUiFlags */,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index c9ebc3597baf..d0b553db2100 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -43,8 +43,6 @@ import com.android.systemui.statusbar.notification.init.NotificationsController;
import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
-import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger;
-import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -146,22 +144,13 @@ public interface NotificationsModule {
@UiBackground Executor uiBgExecutor,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
- NotificationLogger.ExpansionStateLogger expansionStateLogger,
- NotificationPanelLogger notificationPanelLogger) {
+ NotificationLogger.ExpansionStateLogger expansionStateLogger) {
return new NotificationLogger(
notificationListener,
uiBgExecutor,
entryManager,
statusBarStateController,
- expansionStateLogger,
- notificationPanelLogger);
- }
-
- /** Provides an instance of {@link NotificationPanelLogger} */
- @Singleton
- @Provides
- static NotificationPanelLogger provideNotificationPanelLogger() {
- return new NotificationPanelLoggerImpl();
+ expansionStateLogger);
}
/** Provides an instance of {@link NotificationBlockingHelperManager} */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
index a088d85b2288..6e161c9686dd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
@@ -70,7 +70,6 @@ public class NotificationLogger implements StateListener {
private final NotificationListenerService mNotificationListener;
private final Executor mUiBgExecutor;
private final NotificationEntryManager mEntryManager;
- private final NotificationPanelLogger mNotificationPanelLogger;
private HeadsUpManager mHeadsUpManager;
private final ExpansionStateLogger mExpansionStateLogger;
@@ -199,15 +198,13 @@ public class NotificationLogger implements StateListener {
@UiBackground Executor uiBgExecutor,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
- ExpansionStateLogger expansionStateLogger,
- NotificationPanelLogger notificationPanelLogger) {
+ ExpansionStateLogger expansionStateLogger) {
mNotificationListener = notificationListener;
mUiBgExecutor = uiBgExecutor;
mEntryManager = entryManager;
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
mExpansionStateLogger = expansionStateLogger;
- mNotificationPanelLogger = notificationPanelLogger;
// Not expected to be destroyed, don't need to unsubscribe
statusBarStateController.addCallback(this);
@@ -267,9 +264,6 @@ public class NotificationLogger implements StateListener {
// (Note that in cases where the scroller does emit events, this
// additional event doesn't break anything.)
mNotificationLocationsChangedListener.onChildLocationsChanged();
- // TODO - determine if this work needs to be put on mUiBgExecutor
- mNotificationPanelLogger.logPanelShown(mListContainer.hasPulsingNotifications(),
- mEntryManager.getVisibleNotifications());
}
private void setDozing(boolean dozing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java
deleted file mode 100644
index 0d0bc981382e..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.notification.logging;
-
-import android.annotation.Nullable;
-import android.service.notification.StatusBarNotification;
-
-import com.android.internal.logging.UiEvent;
-import com.android.internal.logging.UiEventLogger;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-
-import java.util.List;
-
-import nano.Notifications;
-
-/**
- * Statsd logging for notification panel.
- */
-public interface NotificationPanelLogger {
-
- /**
- * Log a NOTIFICATION_PANEL_REPORTED statsd event.
- * @param visibleNotifications as provided by NotificationEntryManager.getVisibleNotifications()
- */
- void logPanelShown(boolean isLockscreen,
- @Nullable List<NotificationEntry> visibleNotifications);
-
- enum NotificationPanelEvent implements UiEventLogger.UiEventEnum {
- @UiEvent(doc = "Notification panel shown from status bar.")
- NOTIFICATION_PANEL_OPEN_STATUS_BAR(200),
- @UiEvent(doc = "Notification panel shown from lockscreen.")
- NOTIFICATION_PANEL_OPEN_LOCKSCREEN(201);
-
- private final int mId;
- NotificationPanelEvent(int id) {
- mId = id;
- }
- @Override public int getId() {
- return mId;
- }
-
- public static NotificationPanelEvent fromLockscreen(boolean isLockscreen) {
- return isLockscreen ? NOTIFICATION_PANEL_OPEN_LOCKSCREEN :
- NOTIFICATION_PANEL_OPEN_STATUS_BAR;
- }
- }
-
- /**
- * Composes a NotificationsList proto from the list of visible notifications.
- * @param visibleNotifications as provided by NotificationEntryManager.getVisibleNotifications()
- * @return NotificationList proto suitable for SysUiStatsLog.write(NOTIFICATION_PANEL_REPORTED)
- */
- static Notifications.NotificationList toNotificationProto(
- @Nullable List<NotificationEntry> visibleNotifications) {
- Notifications.NotificationList notificationList = new Notifications.NotificationList();
- if (visibleNotifications == null) {
- return notificationList;
- }
- final Notifications.Notification[] nn =
- new Notifications.Notification[visibleNotifications.size()];
- int i = 0;
- for (NotificationEntry ne : visibleNotifications) {
- StatusBarNotification n = ne.getSbn();
- Notifications.Notification np = new Notifications.Notification();
- np.uid = n.getUid();
- np.packageName = n.getPackageName();
- np.instanceId = n.getInstanceId().getId();
- // TODO set np.groupInstanceId
- np.isGroupSummary = n.getNotification().isGroupSummary();
- np.section = 1 + ne.getBucket(); // We want 0 to mean not set / unknown
- nn[i] = np;
- ++i;
- }
- notificationList.notifications = nn;
- return notificationList;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerImpl.java
deleted file mode 100644
index 0df426a4aafe..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.notification.logging;
-
-import com.android.systemui.shared.system.SysUiStatsLog;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-
-import com.google.protobuf.nano.MessageNano;
-
-import java.util.List;
-
-import nano.Notifications;
-
-/**
- * Normal implementation of NotificationPanelLogger.
- */
-public class NotificationPanelLoggerImpl implements NotificationPanelLogger {
- @Override
- public void logPanelShown(boolean isLockscreen,
- List<NotificationEntry> visibleNotifications) {
- final Notifications.NotificationList proto = NotificationPanelLogger.toNotificationProto(
- visibleNotifications);
- SysUiStatsLog.write(SysUiStatsLog.NOTIFICATION_PANEL_REPORTED,
- /* int event_id */ NotificationPanelEvent.fromLockscreen(isLockscreen).getId(),
- /* int num_notifications*/ proto.notifications.length,
- /* byte[] notifications*/ MessageNano.toByteArray(proto));
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/Notifications.proto b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/Notifications.proto
deleted file mode 100644
index 94a7fcb47670..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/Notifications.proto
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * NotificationList proto from atoms.proto, duplicated here so that it's accessible in the build.
- * Must be kept in sync with the version in atoms.proto.
- */
-
-message Notification {
- // The notifying app's uid and package.
- optional int32 uid = 1;
- optional string package_name = 2;
- // A small system-assigned identifier for the notification.
- optional int32 instance_id = 3;
-
- // Grouping information.
- optional int32 group_instance_id = 4;
- optional bool is_group_summary = 5;
-
- // The section of the shade that the notification is in.
- // See NotificationSectionsManager.PriorityBucket.
- enum NotificationSection {
- SECTION_UNKNOWN = 0;
- SECTION_PEOPLE = 1;
- SECTION_ALERTING = 2;
- SECTION_SILENT = 3;
- }
- optional NotificationSection section = 6;
-}
-
-message NotificationList {
- repeated Notification notifications = 1; // An ordered sequence of notifications.
-} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
index 112ae6f3758a..73532632c875 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
@@ -147,7 +147,12 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
public VolumeDialogControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher,
Optional<Lazy<StatusBar>> statusBarOptionalLazy) {
mContext = context.getApplicationContext();
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ // TODO(b/150663459): remove this TV workaround once StatusBar is "unbound" on TVs
+ if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
+ mStatusBarOptionalLazy = Optional.empty();
+ } else {
+ mStatusBarOptionalLazy = statusBarOptionalLazy;
+ }
mNotificationManager = (NotificationManager) mContext.getSystemService(
Context.NOTIFICATION_SERVICE);
Events.writeEvent(Events.EVENT_COLLECTION_STARTED);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 6d614af95bac..eead1204aa11 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -67,6 +67,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -157,6 +158,11 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(context);
}
+ @After
+ public void tearDown() {
+ mKeyguardUpdateMonitor.destroy();
+ }
+
@Test
public void testReceiversRegistered() {
verify(mBroadcastDispatcher, atLeastOnce()).registerReceiverWithHandler(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsBindingControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsBindingControllerImplTest.kt
index 02bfc19e07d4..eceb1ddaaf06 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsBindingControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsBindingControllerImplTest.kt
@@ -39,7 +39,7 @@ import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
-import org.mockito.Mockito.reset
+import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
@@ -67,6 +67,7 @@ class ControlsBindingControllerImplTest : SysuiTestCase() {
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
+ providers.clear()
controller = TestableControlsBindingControllerImpl(
mContext, executor, Lazy { mockControlsController })
@@ -76,7 +77,6 @@ class ControlsBindingControllerImplTest : SysuiTestCase() {
fun tearDown() {
executor.advanceClockToLast()
executor.runAllReady()
- providers.clear()
}
@Test
@@ -93,71 +93,56 @@ class ControlsBindingControllerImplTest : SysuiTestCase() {
}
controller.bindAndLoad(TEST_COMPONENT_NAME_1, callback)
- assertEquals(1, providers.size)
- val provider = providers.first()
- verify(provider).maybeBindAndLoad(any())
+ verify(providers[0]).maybeBindAndLoad(any())
}
@Test
- fun testBindServices() {
- controller.bindServices(listOf(TEST_COMPONENT_NAME_1, TEST_COMPONENT_NAME_2))
+ fun testBindService() {
+ controller.bindService(TEST_COMPONENT_NAME_1)
executor.runAllReady()
- assertEquals(2, providers.size)
- assertEquals(setOf(TEST_COMPONENT_NAME_1, TEST_COMPONENT_NAME_2),
- providers.map { it.componentName }.toSet())
- providers.forEach {
- verify(it).bindService()
- }
+ verify(providers[0]).bindService()
}
@Test
fun testSubscribe() {
- val controlInfo1 = ControlInfo(TEST_COMPONENT_NAME_1, "id_1", "", DeviceTypes.TYPE_UNKNOWN)
- val controlInfo2 = ControlInfo(TEST_COMPONENT_NAME_2, "id_2", "", DeviceTypes.TYPE_UNKNOWN)
- controller.bindServices(listOf(TEST_COMPONENT_NAME_3))
+ val controlInfo1 = ControlInfo("id_1", "", DeviceTypes.TYPE_UNKNOWN)
+ val controlInfo2 = ControlInfo("id_2", "", DeviceTypes.TYPE_UNKNOWN)
+ val structure =
+ StructureInfo(TEST_COMPONENT_NAME_1, "Home", listOf(controlInfo1, controlInfo2))
- controller.subscribe(listOf(controlInfo1, controlInfo2))
+ controller.subscribe(structure)
executor.runAllReady()
- assertEquals(3, providers.size)
- val provider1 = providers.first { it.componentName == TEST_COMPONENT_NAME_1 }
- val provider2 = providers.first { it.componentName == TEST_COMPONENT_NAME_2 }
- val provider3 = providers.first { it.componentName == TEST_COMPONENT_NAME_3 }
-
- verify(provider1).maybeBindAndSubscribe(listOf(controlInfo1.controlId))
- verify(provider2).maybeBindAndSubscribe(listOf(controlInfo2.controlId))
- verify(provider3, never()).maybeBindAndSubscribe(any())
- verify(provider3).unbindService() // Not needed services will be unbound
+ verify(providers[0]).maybeBindAndSubscribe(
+ listOf(controlInfo1.controlId, controlInfo2.controlId))
}
@Test
fun testUnsubscribe_notRefreshing() {
- controller.bindServices(listOf(TEST_COMPONENT_NAME_1, TEST_COMPONENT_NAME_2))
+ controller.bindService(TEST_COMPONENT_NAME_2)
controller.unsubscribe()
executor.runAllReady()
- providers.forEach {
- verify(it, never()).unsubscribe()
- }
+ verify(providers[0], never()).unsubscribe()
}
@Test
fun testUnsubscribe_refreshing() {
- val controlInfo1 = ControlInfo(TEST_COMPONENT_NAME_1, "id_1", "", DeviceTypes.TYPE_UNKNOWN)
- val controlInfo2 = ControlInfo(TEST_COMPONENT_NAME_2, "id_2", "", DeviceTypes.TYPE_UNKNOWN)
+ val controlInfo1 = ControlInfo("id_1", "", DeviceTypes.TYPE_UNKNOWN)
+ val controlInfo2 = ControlInfo("id_2", "", DeviceTypes.TYPE_UNKNOWN)
+ val structure =
+ StructureInfo(TEST_COMPONENT_NAME_1, "Home", listOf(controlInfo1, controlInfo2))
- controller.subscribe(listOf(controlInfo1, controlInfo2))
+ controller.subscribe(structure)
controller.unsubscribe()
executor.runAllReady()
- providers.forEach {
- verify(it).unsubscribe()
- }
+ verify(providers[0]).unsubscribe()
}
@Test
@@ -168,31 +153,37 @@ class ControlsBindingControllerImplTest : SysuiTestCase() {
@Test
fun testChangeUsers_providersHaveCorrectUser() {
- controller.bindServices(listOf(TEST_COMPONENT_NAME_1))
+ controller.bindService(TEST_COMPONENT_NAME_1)
+ assertEquals(user, providers[0].user)
+
controller.changeUser(otherUser)
- controller.bindServices(listOf(TEST_COMPONENT_NAME_2))
- val provider1 = providers.first { it.componentName == TEST_COMPONENT_NAME_1 }
- assertEquals(user, provider1.user)
- val provider2 = providers.first { it.componentName == TEST_COMPONENT_NAME_2 }
- assertEquals(otherUser, provider2.user)
+ controller.bindService(TEST_COMPONENT_NAME_2)
+ assertEquals(otherUser, providers[0].user)
}
@Test
fun testChangeUsers_providersUnbound() {
- controller.bindServices(listOf(TEST_COMPONENT_NAME_1))
+ controller.bindService(TEST_COMPONENT_NAME_1)
controller.changeUser(otherUser)
- val provider1 = providers.first { it.componentName == TEST_COMPONENT_NAME_1 }
- verify(provider1).unbindService()
+ verify(providers[0]).unbindService()
- controller.bindServices(listOf(TEST_COMPONENT_NAME_2))
+ controller.bindService(TEST_COMPONENT_NAME_2)
controller.changeUser(user)
- reset(provider1)
- val provider2 = providers.first { it.componentName == TEST_COMPONENT_NAME_2 }
- verify(provider2).unbindService()
- verify(provider1, never()).unbindService()
+ verify(providers[0]).unbindService()
+ }
+
+ @Test
+ fun testComponentRemoved_existingIsUnbound() {
+ controller.bindService(TEST_COMPONENT_NAME_1)
+
+ controller.onComponentRemoved(TEST_COMPONENT_NAME_1)
+
+ executor.runAllReady()
+
+ verify(providers[0], times(1)).unbindService()
}
}
@@ -203,7 +194,7 @@ class TestableControlsBindingControllerImpl(
) : ControlsBindingControllerImpl(context, executor, lazyController) {
companion object {
- val providers = mutableSetOf<ControlsProviderLifecycleManager>()
+ val providers = mutableListOf<ControlsProviderLifecycleManager>()
}
// Replaces the real provider with a mock and puts the mock in a visible set.
@@ -216,7 +207,10 @@ class TestableControlsBindingControllerImpl(
`when`(provider.componentName).thenReturn(realProvider.componentName)
`when`(provider.token).thenReturn(token)
`when`(provider.user).thenReturn(realProvider.user)
+
+ providers.clear()
providers.add(provider)
+
return provider
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
index 488e418f6152..45ea3c96b819 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
@@ -22,6 +22,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
+import android.content.pm.ServiceInfo
import android.os.UserHandle
import android.provider.Settings
import android.service.controls.Control
@@ -32,6 +33,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.controls.ControlStatus
+import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.dump.DumpManager
@@ -50,6 +52,7 @@ import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
+import org.mockito.Mockito.inOrder
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
@@ -76,12 +79,15 @@ class ControlsControllerImplTest : SysuiTestCase() {
private lateinit var listingController: ControlsListingController
@Captor
- private lateinit var controlInfoListCaptor: ArgumentCaptor<List<ControlInfo>>
+ private lateinit var structureInfoCaptor: ArgumentCaptor<StructureInfo>
@Captor
private lateinit var controlLoadCallbackCaptor:
ArgumentCaptor<ControlsBindingController.LoadCallback>
@Captor
private lateinit var broadcastReceiverCaptor: ArgumentCaptor<BroadcastReceiver>
+ @Captor
+ private lateinit var listingCallbackCaptor:
+ ArgumentCaptor<ControlsListingController.ControlsListingCallback>
private lateinit var delayableExecutor: FakeExecutor
private lateinit var controller: ControlsControllerImpl
@@ -95,15 +101,21 @@ class ControlsControllerImplTest : SysuiTestCase() {
private const val TEST_CONTROL_ID = "control1"
private const val TEST_CONTROL_TITLE = "Test"
private const val TEST_DEVICE_TYPE = DeviceTypes.TYPE_AC_HEATER
- private val TEST_CONTROL_INFO = ControlInfo(
- TEST_COMPONENT, TEST_CONTROL_ID, TEST_CONTROL_TITLE, TEST_DEVICE_TYPE)
+ private const val TEST_STRUCTURE = ""
+ private val TEST_CONTROL_INFO = ControlInfo(TEST_CONTROL_ID,
+ TEST_CONTROL_TITLE, TEST_DEVICE_TYPE)
+ private val TEST_STRUCTURE_INFO = StructureInfo(TEST_COMPONENT,
+ TEST_STRUCTURE, listOf(TEST_CONTROL_INFO))
private val TEST_COMPONENT_2 = ComponentName("test.pkg", "test.class.2")
private const val TEST_CONTROL_ID_2 = "control2"
private const val TEST_CONTROL_TITLE_2 = "Test 2"
private const val TEST_DEVICE_TYPE_2 = DeviceTypes.TYPE_CAMERA
- private val TEST_CONTROL_INFO_2 = ControlInfo(
- TEST_COMPONENT_2, TEST_CONTROL_ID_2, TEST_CONTROL_TITLE_2, TEST_DEVICE_TYPE_2)
+ private const val TEST_STRUCTURE_2 = "My House"
+ private val TEST_CONTROL_INFO_2 = ControlInfo(TEST_CONTROL_ID_2,
+ TEST_CONTROL_TITLE_2, TEST_DEVICE_TYPE_2)
+ private val TEST_STRUCTURE_INFO_2 = StructureInfo(TEST_COMPONENT_2,
+ TEST_STRUCTURE_2, listOf(TEST_CONTROL_INFO_2))
}
private val user = mContext.userId
@@ -139,6 +151,8 @@ class ControlsControllerImplTest : SysuiTestCase() {
assertTrue(controller.available)
verify(broadcastDispatcher).registerReceiver(
capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL))
+
+ verify(listingController).addCallback(capture(listingCallbackCaptor))
}
private fun builderFromInfo(controlInfo: ControlInfo): Control.StatelessBuilder {
@@ -153,12 +167,12 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testStartWithoutFavorites() {
- assertTrue(controller.getFavoriteControls().isEmpty())
+ assertTrue(controller.getFavorites().isEmpty())
}
@Test
fun testStartWithSavedFavorites() {
- `when`(persistenceWrapper.readFavorites()).thenReturn(listOf(TEST_CONTROL_INFO))
+ `when`(persistenceWrapper.readFavorites()).thenReturn(listOf(TEST_STRUCTURE_INFO))
val controller_other = ControlsControllerImpl(
mContext,
delayableExecutor,
@@ -169,88 +183,7 @@ class ControlsControllerImplTest : SysuiTestCase() {
Optional.of(persistenceWrapper),
mock(DumpManager::class.java)
)
- assertEquals(listOf(TEST_CONTROL_INFO), controller_other.getFavoriteControls())
- }
-
- @Test
- fun testAddFavorite() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
-
- val favorites = controller.getFavoriteControls()
- assertTrue(TEST_CONTROL_INFO in favorites)
- assertEquals(1, favorites.size)
- }
-
- @Test
- fun testAddMultipleFavorites() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO_2, true)
-
- val favorites = controller.getFavoriteControls()
- assertTrue(TEST_CONTROL_INFO in favorites)
- assertTrue(TEST_CONTROL_INFO_2 in favorites)
- assertEquals(2, favorites.size)
- }
-
- @Test
- fun testAddAndRemoveFavorite() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO_2, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, false)
-
- val favorites = controller.getFavoriteControls()
- assertTrue(TEST_CONTROL_INFO !in favorites)
- assertTrue(TEST_CONTROL_INFO_2 in favorites)
- assertEquals(1, favorites.size)
- }
-
- @Test
- fun testFavoritesSavedOnAdd() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
-
- verify(persistenceWrapper).storeFavorites(listOf(TEST_CONTROL_INFO))
- }
-
- @Test
- fun testFavoritesSavedOnRemove() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- reset(persistenceWrapper)
-
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, false)
- verify(persistenceWrapper).storeFavorites(emptyList())
- }
-
- @Test
- fun testFavoritesSavedOnChange() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- val newControlInfo = TEST_CONTROL_INFO.copy(controlTitle = TEST_CONTROL_TITLE_2)
- val control = builderFromInfo(newControlInfo).build()
-
- controller.loadForComponent(TEST_COMPONENT, Consumer {})
-
- reset(persistenceWrapper)
- verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
- capture(controlLoadCallbackCaptor))
-
- controlLoadCallbackCaptor.value.accept(listOf(control))
-
- verify(persistenceWrapper).storeFavorites(listOf(newControlInfo))
- }
-
- @Test
- fun testFavoritesNotSavedOnRedundantAdd() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
-
- reset(persistenceWrapper)
-
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- verify(persistenceWrapper, never()).storeFavorites(ArgumentMatchers.anyList())
- }
-
- @Test
- fun testFavoritesNotSavedOnNotRemove() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, false)
- verify(persistenceWrapper, never()).storeFavorites(ArgumentMatchers.anyList())
+ assertEquals(listOf(TEST_STRUCTURE_INFO), controller_other.getFavorites())
}
@Test
@@ -278,15 +211,16 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testSubscribeFavorites() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO_2, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
- controller.subscribeToFavorites()
+ controller.subscribeToFavorites(TEST_STRUCTURE_INFO)
- verify(bindingController).subscribe(capture(controlInfoListCaptor))
+ verify(bindingController).subscribe(capture(structureInfoCaptor))
- assertTrue(TEST_CONTROL_INFO in controlInfoListCaptor.value)
- assertTrue(TEST_CONTROL_INFO_2 in controlInfoListCaptor.value)
+ assertTrue(TEST_CONTROL_INFO in structureInfoCaptor.value.controls)
+ assertFalse(TEST_CONTROL_INFO_2 in structureInfoCaptor.value.controls)
}
@Test
@@ -311,6 +245,8 @@ class ControlsControllerImplTest : SysuiTestCase() {
controlLoadCallbackCaptor.value.accept(listOf(control))
+ delayableExecutor.runAllReady()
+
assertTrue(loaded)
}
@@ -319,7 +255,9 @@ class ControlsControllerImplTest : SysuiTestCase() {
var loaded = false
val control = builderFromInfo(TEST_CONTROL_INFO).build()
val control2 = builderFromInfo(TEST_CONTROL_INFO_2).build()
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
controller.loadForComponent(TEST_COMPONENT, Consumer { data ->
val controls = data.allControls
@@ -341,6 +279,7 @@ class ControlsControllerImplTest : SysuiTestCase() {
capture(controlLoadCallbackCaptor))
controlLoadCallbackCaptor.value.accept(listOf(control, control2))
+ delayableExecutor.runAllReady()
assertTrue(loaded)
}
@@ -348,7 +287,8 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testLoadForComponent_removed() {
var loaded = false
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
controller.loadForComponent(TEST_COMPONENT, Consumer { data ->
val controls = data.allControls
@@ -369,6 +309,7 @@ class ControlsControllerImplTest : SysuiTestCase() {
capture(controlLoadCallbackCaptor))
controlLoadCallbackCaptor.value.accept(emptyList())
+ delayableExecutor.runAllReady()
assertTrue(loaded)
}
@@ -376,7 +317,8 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testErrorOnLoad_notRemoved() {
var loaded = false
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
controller.loadForComponent(TEST_COMPONENT, Consumer { data ->
val controls = data.allControls
@@ -403,7 +345,9 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testFavoriteInformationModifiedOnLoad() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
+
val newControlInfo = TEST_CONTROL_INFO.copy(controlTitle = TEST_CONTROL_TITLE_2)
val control = builderFromInfo(newControlInfo).build()
@@ -413,15 +357,17 @@ class ControlsControllerImplTest : SysuiTestCase() {
capture(controlLoadCallbackCaptor))
controlLoadCallbackCaptor.value.accept(listOf(control))
+ delayableExecutor.runAllReady()
- val favorites = controller.getFavoriteControls()
+ val favorites = controller.getFavorites().flatMap { it.controls }
assertEquals(1, favorites.size)
assertEquals(newControlInfo, favorites[0])
}
@Test
fun testFavoriteInformationModifiedOnRefresh() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+
val newControlInfo = TEST_CONTROL_INFO.copy(controlTitle = TEST_CONTROL_TITLE_2)
val control = builderFromInfo(newControlInfo).build()
@@ -429,23 +375,15 @@ class ControlsControllerImplTest : SysuiTestCase() {
delayableExecutor.runAllReady()
- val favorites = controller.getFavoriteControls()
+ val favorites = controller.getFavorites().flatMap { it.controls }
assertEquals(1, favorites.size)
assertEquals(newControlInfo, favorites[0])
}
@Test
- fun testClearFavorites() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- assertEquals(1, controller.getFavoriteControls().size)
-
- controller.clearFavorites()
- assertTrue(controller.getFavoriteControls().isEmpty())
- }
-
- @Test
fun testSwitchUsers() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
reset(persistenceWrapper)
val intent = Intent(Intent.ACTION_USER_SWITCHED).apply {
@@ -461,7 +399,7 @@ class ControlsControllerImplTest : SysuiTestCase() {
verify(persistenceWrapper).readFavorites()
verify(bindingController).changeUser(UserHandle.of(otherUser))
verify(listingController).changeUser(UserHandle.of(otherUser))
- assertTrue(controller.getFavoriteControls().isEmpty())
+ assertTrue(controller.getFavorites().isEmpty())
assertEquals(otherUser, controller.currentUserId)
assertTrue(controller.available)
}
@@ -476,24 +414,28 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testDisableFeature_clearFavorites() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- assertFalse(controller.getFavoriteControls().isEmpty())
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
+
+ assertFalse(controller.getFavorites().isEmpty())
Settings.Secure.putIntForUser(mContext.contentResolver,
ControlsControllerImpl.CONTROLS_AVAILABLE, 0, user)
controller.settingObserver.onChange(false, ControlsControllerImpl.URI, user)
- assertTrue(controller.getFavoriteControls().isEmpty())
+ assertTrue(controller.getFavorites().isEmpty())
}
@Test
fun testDisableFeature_noChangeForNotCurrentUser() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
+
Settings.Secure.putIntForUser(mContext.contentResolver,
ControlsControllerImpl.CONTROLS_AVAILABLE, 0, otherUser)
controller.settingObserver.onChange(false, ControlsControllerImpl.URI, otherUser)
assertTrue(controller.available)
- assertFalse(controller.getFavoriteControls().isEmpty())
+ assertFalse(controller.getFavorites().isEmpty())
}
@Test
@@ -515,7 +457,8 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testCountFavoritesForComponent_singleComponent() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT))
assertEquals(0, controller.countFavoritesForComponent(TEST_COMPONENT_2))
@@ -523,8 +466,9 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testCountFavoritesForComponent_multipleComponents() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO_2, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT))
assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT_2))
@@ -532,78 +476,180 @@ class ControlsControllerImplTest : SysuiTestCase() {
@Test
fun testGetFavoritesForComponent() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- assertEquals(listOf(TEST_CONTROL_INFO), controller.getFavoritesForComponent(TEST_COMPONENT))
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
+
+ assertEquals(listOf(TEST_STRUCTURE_INFO),
+ controller.getFavoritesForComponent(TEST_COMPONENT))
}
@Test
fun testGetFavoritesForComponent_otherComponent() {
- controller.changeFavoriteStatus(TEST_CONTROL_INFO_2, true)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
+
assertTrue(controller.getFavoritesForComponent(TEST_COMPONENT).isEmpty())
}
@Test
fun testGetFavoritesForComponent_multipleInOrder() {
- val controlInfo = ControlInfo(TEST_COMPONENT, "id", "title", 0)
-
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
- controller.changeFavoriteStatus(controlInfo, true)
+ val controlInfo = ControlInfo("id", "title", 0)
+
+ controller.replaceFavoritesForStructure(
+ StructureInfo(
+ TEST_COMPONENT,
+ "Home",
+ listOf(TEST_CONTROL_INFO, controlInfo)
+ ))
+ delayableExecutor.runAllReady()
assertEquals(listOf(TEST_CONTROL_INFO, controlInfo),
- controller.getFavoritesForComponent(TEST_COMPONENT))
-
- controller.clearFavorites()
-
- controller.changeFavoriteStatus(controlInfo, true)
- controller.changeFavoriteStatus(TEST_CONTROL_INFO, true)
+ controller.getFavoritesForComponent(TEST_COMPONENT).flatMap { it.controls })
+
+ controller.replaceFavoritesForStructure(
+ StructureInfo(
+ TEST_COMPONENT,
+ "Home",
+ listOf(controlInfo, TEST_CONTROL_INFO)
+ ))
+ delayableExecutor.runAllReady()
assertEquals(listOf(controlInfo, TEST_CONTROL_INFO),
- controller.getFavoritesForComponent(TEST_COMPONENT))
+ controller.getFavoritesForComponent(TEST_COMPONENT).flatMap { it.controls })
}
@Test
- fun testReplaceFavoritesForComponent_noFavorites() {
- controller.replaceFavoritesForComponent(TEST_COMPONENT, listOf(TEST_CONTROL_INFO))
+ fun testReplaceFavoritesForStructure_noFavorites() {
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT))
- assertEquals(listOf(TEST_CONTROL_INFO), controller.getFavoritesForComponent(TEST_COMPONENT))
+ assertEquals(listOf(TEST_STRUCTURE_INFO),
+ controller.getFavoritesForComponent(TEST_COMPONENT))
}
@Test
- fun testReplaceFavoritesForComponent_differentComponentsAreFilteredOut() {
- controller.replaceFavoritesForComponent(TEST_COMPONENT,
- listOf(TEST_CONTROL_INFO, TEST_CONTROL_INFO_2))
+ fun testReplaceFavoritesForStructure_differentComponentsAreFilteredOut() {
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT))
- assertEquals(listOf(TEST_CONTROL_INFO), controller.getFavoritesForComponent(TEST_COMPONENT))
+ assertEquals(listOf(TEST_CONTROL_INFO),
+ controller.getFavoritesForComponent(TEST_COMPONENT).flatMap { it.controls })
}
@Test
- fun testReplaceFavoritesForComponent_oldFavoritesRemoved() {
- val controlInfo = ControlInfo(TEST_COMPONENT, "id", "title", 0)
+ fun testReplaceFavoritesForStructure_oldFavoritesRemoved() {
+ val controlInfo = ControlInfo("id", "title", 0)
assertNotEquals(TEST_CONTROL_INFO, controlInfo)
- controller.changeFavoriteStatus(controlInfo, true)
- controller.replaceFavoritesForComponent(TEST_COMPONENT, listOf(TEST_CONTROL_INFO))
+ val newComponent = ComponentName("test.pkg", "test.class.3")
+
+ controller.replaceFavoritesForStructure(
+ StructureInfo(
+ newComponent,
+ "Home",
+ listOf(controlInfo)
+ ))
+ controller.replaceFavoritesForStructure(
+ StructureInfo(
+ newComponent,
+ "Home",
+ listOf(TEST_CONTROL_INFO)
+ ))
+ delayableExecutor.runAllReady()
- assertEquals(1, controller.countFavoritesForComponent(TEST_COMPONENT))
- assertEquals(listOf(TEST_CONTROL_INFO), controller.getFavoritesForComponent(TEST_COMPONENT))
+ assertEquals(1, controller.countFavoritesForComponent(newComponent))
+ assertEquals(listOf(TEST_CONTROL_INFO), controller
+ .getFavoritesForComponent(newComponent).flatMap { it.controls })
}
@Test
- fun testReplaceFavoritesForComponent_favoritesInOrder() {
- val controlInfo = ControlInfo(TEST_COMPONENT, "id", "title", 0)
+ fun testReplaceFavoritesForStructure_favoritesInOrder() {
+ val controlInfo = ControlInfo("id", "title", 0)
val listOrder1 = listOf(TEST_CONTROL_INFO, controlInfo)
- controller.replaceFavoritesForComponent(TEST_COMPONENT, listOrder1)
+ val structure1 = StructureInfo(TEST_COMPONENT, "Home", listOrder1)
+ controller.replaceFavoritesForStructure(structure1)
+ delayableExecutor.runAllReady()
assertEquals(2, controller.countFavoritesForComponent(TEST_COMPONENT))
- assertEquals(listOrder1, controller.getFavoritesForComponent(TEST_COMPONENT))
+ assertEquals(listOrder1, controller.getFavoritesForComponent(TEST_COMPONENT)
+ .flatMap { it.controls })
val listOrder2 = listOf(controlInfo, TEST_CONTROL_INFO)
- controller.replaceFavoritesForComponent(TEST_COMPONENT, listOrder2)
+ val structure2 = StructureInfo(TEST_COMPONENT, "Home", listOrder2)
+
+ controller.replaceFavoritesForStructure(structure2)
+ delayableExecutor.runAllReady()
assertEquals(2, controller.countFavoritesForComponent(TEST_COMPONENT))
- assertEquals(listOrder2, controller.getFavoritesForComponent(TEST_COMPONENT))
+ assertEquals(listOrder2, controller.getFavoritesForComponent(TEST_COMPONENT)
+ .flatMap { it.controls })
+ }
+
+ @Test
+ fun testPackageRemoved_noFavorites_noRemovals() {
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ delayableExecutor.runAllReady()
+
+ val serviceInfo = mock(ServiceInfo::class.java)
+ `when`(serviceInfo.componentName).thenReturn(TEST_COMPONENT)
+ val info = ControlsServiceInfo(mContext, serviceInfo)
+
+ // Don't want to check what happens before this call
+ reset(persistenceWrapper)
+ listingCallbackCaptor.value.onServicesUpdated(listOf(info))
+ delayableExecutor.runAllReady()
+
+ verify(bindingController, never()).onComponentRemoved(any())
+
+ assertEquals(1, controller.getFavorites().size)
+ assertEquals(TEST_STRUCTURE_INFO, controller.getFavorites()[0])
+
+ verify(persistenceWrapper, never()).storeFavorites(ArgumentMatchers.anyList())
+ }
+
+ @Test
+ fun testPackageRemoved_hasFavorites() {
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
+ controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO_2)
+ delayableExecutor.runAllReady()
+
+ val serviceInfo = mock(ServiceInfo::class.java)
+ `when`(serviceInfo.componentName).thenReturn(TEST_COMPONENT)
+ val info = ControlsServiceInfo(mContext, serviceInfo)
+
+ // Don't want to check what happens before this call
+ reset(persistenceWrapper)
+
+ listingCallbackCaptor.value.onServicesUpdated(listOf(info))
+ delayableExecutor.runAllReady()
+
+ verify(bindingController).onComponentRemoved(TEST_COMPONENT_2)
+
+ assertEquals(1, controller.getFavorites().size)
+ assertEquals(TEST_STRUCTURE_INFO, controller.getFavorites()[0])
+
+ verify(persistenceWrapper).storeFavorites(ArgumentMatchers.anyList())
+ }
+
+ @Test
+ fun testListingCallbackNotListeningWhileReadingFavorites() {
+ val intent = Intent(Intent.ACTION_USER_SWITCHED).apply {
+ putExtra(Intent.EXTRA_USER_HANDLE, otherUser)
+ }
+ val pendingResult = mock(BroadcastReceiver.PendingResult::class.java)
+ `when`(pendingResult.sendingUserId).thenReturn(otherUser)
+ broadcastReceiverCaptor.value.pendingResult = pendingResult
+
+ broadcastReceiverCaptor.value.onReceive(mContext, intent)
+
+ val inOrder = inOrder(persistenceWrapper, listingController)
+
+ inOrder.verify(listingController).removeCallback(listingCallbackCaptor.value)
+ inOrder.verify(persistenceWrapper).readFavorites()
+ inOrder.verify(listingController).addCallback(listingCallbackCaptor.value)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapperTest.kt
index c145c1f4ee30..a47edf0602c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapperTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsFavoritePersistenceWrapperTest.kt
@@ -55,18 +55,27 @@ class ControlsFavoritePersistenceWrapperTest : SysuiTestCase() {
@Test
fun testSaveAndRestore() {
- val controlInfo1 = ControlInfo(
- ComponentName.unflattenFromString("TEST_PKG/.TEST_CLS_1")!!,
- "id1", "name_1", DeviceTypes.TYPE_UNKNOWN)
- val controlInfo2 = ControlInfo(
- ComponentName.unflattenFromString("TEST_PKG/.TEST_CLS_2")!!,
- "id2", "name_2", DeviceTypes.TYPE_GENERIC_ON_OFF)
- val list = listOf(controlInfo1, controlInfo2)
+ val structureInfo1 = StructureInfo(
+ ComponentName.unflattenFromString("TEST_PKG/.TEST_CLS_1")!!,
+ "",
+ listOf(
+ ControlInfo("id1", "name_1", DeviceTypes.TYPE_UNKNOWN)
+ )
+ )
+ val structureInfo2 = StructureInfo(
+ ComponentName.unflattenFromString("TEST_PKG/.TEST_CLS_2")!!,
+ "structure1",
+ listOf(
+ ControlInfo("id2", "name_2", DeviceTypes.TYPE_GENERIC_ON_OFF),
+ ControlInfo("id3", "name_3", DeviceTypes.TYPE_GENERIC_ON_OFF)
+ )
+ )
+ val list = listOf(structureInfo1, structureInfo2)
wrapper.storeFavorites(list)
executor.runAllReady()
assertEquals(list, wrapper.readFavorites())
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SbnBuilder.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SbnBuilder.java
index 742dfee9460a..62f406ff835a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SbnBuilder.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SbnBuilder.java
@@ -22,8 +22,6 @@ import android.content.Context;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import com.android.internal.logging.InstanceId;
-
/**
* Convenience builder for {@link StatusBarNotification} since its constructor is terrifying.
*
@@ -42,7 +40,6 @@ public class SbnBuilder {
private UserHandle mUser = UserHandle.of(0);
private String mOverrideGroupKey;
private long mPostTime;
- private InstanceId mInstanceId;
public SbnBuilder() {
}
@@ -58,7 +55,6 @@ public class SbnBuilder {
mUser = source.getUser();
mOverrideGroupKey = source.getOverrideGroupKey();
mPostTime = source.getPostTime();
- mInstanceId = source.getInstanceId();
}
public StatusBarNotification build() {
@@ -75,7 +71,7 @@ public class SbnBuilder {
notification.setBubbleMetadata(mBubbleMetadata);
}
- StatusBarNotification result = new StatusBarNotification(
+ return new StatusBarNotification(
mPkg,
mOpPkg,
mId,
@@ -86,12 +82,6 @@ public class SbnBuilder {
mUser,
mOverrideGroupKey,
mPostTime);
- if (mInstanceId != null) {
- result.setInstanceId(mInstanceId);
- } else {
- result.setInstanceId(InstanceId.fakeInstanceId(1));
- }
- return result;
}
public SbnBuilder setPkg(String pkg) {
@@ -185,9 +175,4 @@ public class SbnBuilder {
mBubbleMetadata = data;
return this;
}
-
- public SbnBuilder setInstanceId(InstanceId instanceId) {
- mInstanceId = instanceId;
- return this;
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
index 79ba13681521..d826ce1bbdd8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
@@ -16,10 +16,7 @@
package com.android.systemui.statusbar.notification.logging;
-import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING;
-
import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
@@ -65,8 +62,6 @@ import org.mockito.MockitoAnnotations;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;
-import nano.Notifications;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -86,10 +81,9 @@ public class NotificationLoggerTest extends SysuiTestCase {
private NotificationEntry mEntry;
private TestableNotificationLogger mLogger;
+ private NotificationEntryListener mNotificationEntryListener;
private ConcurrentLinkedQueue<AssertionError> mErrorQueue = new ConcurrentLinkedQueue<>();
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
- private NotificationPanelLoggerFake mNotificationPanelLoggerFake =
- new NotificationPanelLoggerFake();
@Before
public void setUp() {
@@ -111,6 +105,7 @@ public class NotificationLoggerTest extends SysuiTestCase {
mExpansionStateLogger);
mLogger.setUpWithContainer(mListContainer);
verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture());
+ mNotificationEntryListener = mEntryListenerCaptor.getValue();
}
@Test
@@ -169,21 +164,6 @@ public class NotificationLoggerTest extends SysuiTestCase {
verify(mBarService, times(1)).onNotificationVisibilityChanged(any(), any());
}
- @Test
- public void testLogPanelShownOnLoggingStart() {
- when(mEntryManager.getVisibleNotifications()).thenReturn(Lists.newArrayList(mEntry));
- mLogger.startNotificationLogging();
- assertEquals(1, mNotificationPanelLoggerFake.getCalls().size());
- assertEquals(false, mNotificationPanelLoggerFake.get(0).isDozing);
- assertEquals(1, mNotificationPanelLoggerFake.get(0).list.notifications.length);
- Notifications.Notification n = mNotificationPanelLoggerFake.get(0).list.notifications[0];
- assertEquals(TEST_PACKAGE_NAME, n.packageName);
- assertEquals(TEST_UID, n.uid);
- assertEquals(1, n.instanceId);
- assertEquals(false, n.isGroupSummary);
- assertEquals(1 + BUCKET_ALERTING, n.section);
- }
-
private class TestableNotificationLogger extends NotificationLogger {
TestableNotificationLogger(NotificationListener notificationListener,
@@ -193,7 +173,7 @@ public class NotificationLoggerTest extends SysuiTestCase {
IStatusBarService barService,
ExpansionStateLogger expansionStateLogger) {
super(notificationListener, uiBgExecutor, entryManager, statusBarStateController,
- expansionStateLogger, mNotificationPanelLoggerFake);
+ expansionStateLogger);
mBarService = barService;
// Make this on the current thread so we can wait for it during tests.
mHandler = Handler.createAsync(Looper.myLooper());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 0035b98c9a8d..5253e2ca9e42 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -122,7 +122,6 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.init.NotificationsController;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
-import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerFake;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
@@ -274,7 +273,7 @@ public class StatusBarTest extends SysuiTestCase {
mMetricsLogger = new FakeMetricsLogger();
NotificationLogger notificationLogger = new NotificationLogger(mNotificationListener,
mUiBgExecutor, mock(NotificationEntryManager.class), mStatusBarStateController,
- mExpansionStateLogger, new NotificationPanelLoggerFake());
+ mExpansionStateLogger);
notificationLogger.setVisibilityReporter(mock(Runnable.class));
when(mCommandQueue.asBinder()).thenReturn(new Binder());
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 0a527d420c15..4052942626cb 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -27,6 +27,7 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK;
import android.accessibilityservice.AccessibilityGestureEvent;
+import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.accessibilityservice.IAccessibilityServiceConnection;
@@ -177,6 +178,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final SparseArray<IBinder> mOverlayWindowTokens = new SparseArray();
+ /** The timestamp of requesting to take screenshot in milliseconds */
+ private long mRequestTakeScreenshotTimestampMs;
public interface SystemSupport {
/**
@@ -974,44 +977,39 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
}
@Override
- public void takeScreenshot(int displayId, RemoteCallback callback) {
+ public boolean takeScreenshot(int displayId, RemoteCallback callback) {
+ final long currentTimestamp = SystemClock.uptimeMillis();
+ if (mRequestTakeScreenshotTimestampMs != 0
+ && (currentTimestamp - mRequestTakeScreenshotTimestampMs)
+ <= AccessibilityService.ACCESSIBILITY_TAKE_SCREENSHOT_REQUEST_INTERVAL_TIMES_MS) {
+ return false;
+ }
+ mRequestTakeScreenshotTimestampMs = currentTimestamp;
+
synchronized (mLock) {
if (!hasRightsToCurrentUserLocked()) {
- sendScreenshotResult(true, null, callback);
- return;
+ return false;
}
if (!mSecurityPolicy.canTakeScreenshotLocked(this)) {
- sendScreenshotResult(true, null, callback);
throw new SecurityException("Services don't have the capability of taking"
+ " the screenshot.");
}
}
if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
- sendScreenshotResult(true, null, callback);
- return;
+ return false;
}
final Display display = DisplayManagerGlobal.getInstance()
.getRealDisplay(displayId);
if (display == null) {
- sendScreenshotResult(true, null, callback);
- return;
+ return false;
}
- sendScreenshotResult(false, display, callback);
- }
-
- private void sendScreenshotResult(boolean noResult, Display display, RemoteCallback callback) {
- final boolean noScreenshot = noResult;
final long identity = Binder.clearCallingIdentity();
try {
mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> {
- if (noScreenshot) {
- callback.sendResult(null);
- return;
- }
final Point displaySize = new Point();
// TODO (b/145893483): calling new API with the display as a parameter
// when surface control supported.
@@ -1025,22 +1023,27 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
displaySize.x, displaySize.y, false,
rotation);
final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer();
- final HardwareBuffer hardwareBuffer =
- HardwareBuffer.createFromGraphicBuffer(graphicBuffer);
- final ParcelableColorSpace colorSpace =
- new ParcelableColorSpace(screenshotBuffer.getColorSpace());
-
- // Send back the result.
- final Bundle payload = new Bundle();
- payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER,
- hardwareBuffer);
- payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace);
- payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, SystemClock.uptimeMillis());
- callback.sendResult(payload);
+ try (HardwareBuffer hardwareBuffer =
+ HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) {
+ final ParcelableColorSpace colorSpace =
+ new ParcelableColorSpace(screenshotBuffer.getColorSpace());
+
+ // Send back the result.
+ final Bundle payload = new Bundle();
+ payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER,
+ hardwareBuffer);
+ payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace);
+ payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP,
+ SystemClock.uptimeMillis());
+ callback.sendResult(payload);
+ hardwareBuffer.close();
+ }
}, null).recycleOnUse());
} finally {
Binder.restoreCallingIdentity(identity);
}
+
+ return true;
}
@Override
diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
index d1c3a02c6761..4f5b9ed00ee2 100644
--- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
@@ -328,6 +328,8 @@ class UiAutomationManager {
public void onFingerprintGesture(int gesture) {}
@Override
- public void takeScreenshot(int displayId, RemoteCallback callback) {}
+ public boolean takeScreenshot(int displayId, RemoteCallback callback) {
+ return false;
+ }
}
}
diff --git a/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java b/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
index 941244994dab..7fe086df0729 100644
--- a/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
+++ b/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
@@ -18,6 +18,7 @@ package com.android.server.autofill;
import static com.android.server.autofill.Helper.sDebug;
+import android.annotation.BinderThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -50,14 +51,24 @@ import java.util.concurrent.TimeoutException;
* The same session may be reused for multiple input fields involved in the same autofill
* {@link Session}. Therefore, one {@link InlineSuggestionsRequest} and one
* {@link IInlineSuggestionsResponseCallback} may be used to generate and callback with inline
- * suggestions for different input fields.
+ * suggestions for different input fields.
+ *
+ * <p>
+ * This class is the sole place in Autofill responsible for directly communicating with the IME. It
+ * receives the IME input view start/finish events, with the associated IME field Id. It uses the
+ * information to decide when to send the {@link InlineSuggestionsResponse} to IME. As a result,
+ * some of the response will be cached locally and only be sent when the IME is ready to show them.
+ *
+ * <p>
+ * See {@link android.inputmethodservice.InlineSuggestionSession} comments for InputMethodService
+ * side flow.
*
* <p>
* This class is thread safe.
*/
final class InlineSuggestionSession {
- private static final String TAG = "InlineSuggestionSession";
+ private static final String TAG = "AfInlineSuggestionSession";
private static final int INLINE_REQUEST_TIMEOUT_MS = 1000;
@NonNull
@@ -67,33 +78,83 @@ final class InlineSuggestionSession {
private final ComponentName mComponentName;
@NonNull
private final Object mLock;
+ @NonNull
+ private final ImeStatusListener mImeStatusListener;
+ /**
+ * To avoid the race condition, one should not access {@code mPendingImeResponse} without
+ * holding the {@code mLock}. For consuming the existing value, tt's recommended to use
+ * {@link #getPendingImeResponse()} to get a copy of the reference to avoid blocking call.
+ */
@GuardedBy("mLock")
@Nullable
private CompletableFuture<ImeResponse> mPendingImeResponse;
@GuardedBy("mLock")
+ @Nullable
+ private AutofillResponse mPendingAutofillResponse;
+
+ @GuardedBy("mLock")
private boolean mIsLastResponseNonEmpty = false;
+ @Nullable
+ @GuardedBy("mLock")
+ private AutofillId mImeFieldId = null;
+
+ @GuardedBy("mLock")
+ private boolean mImeInputViewStarted = false;
+
InlineSuggestionSession(InputMethodManagerInternal inputMethodManagerInternal,
int userId, ComponentName componentName) {
mInputMethodManagerInternal = inputMethodManagerInternal;
mUserId = userId;
mComponentName = componentName;
mLock = new Object();
+ mImeStatusListener = new ImeStatusListener() {
+ @Override
+ public void onInputMethodStartInputView(AutofillId imeFieldId) {
+ synchronized (mLock) {
+ mImeFieldId = imeFieldId;
+ mImeInputViewStarted = true;
+ AutofillResponse pendingAutofillResponse = mPendingAutofillResponse;
+ if (pendingAutofillResponse != null
+ && pendingAutofillResponse.mAutofillId.equalsIgnoreSession(
+ mImeFieldId)) {
+ mPendingAutofillResponse = null;
+ onInlineSuggestionsResponseLocked(pendingAutofillResponse.mAutofillId,
+ pendingAutofillResponse.mResponse);
+ }
+ }
+ }
+
+ @Override
+ public void onInputMethodFinishInputView(AutofillId imeFieldId) {
+ synchronized (mLock) {
+ mImeFieldId = imeFieldId;
+ mImeInputViewStarted = false;
+ }
+ }
+ };
}
public void onCreateInlineSuggestionsRequest(@NonNull AutofillId autofillId) {
if (sDebug) Log.d(TAG, "onCreateInlineSuggestionsRequest called for " + autofillId);
synchronized (mLock) {
- cancelCurrentRequest();
+ // Clean up all the state about the previous request.
+ hideInlineSuggestionsUi(autofillId);
+ mImeFieldId = null;
+ mImeInputViewStarted = false;
+ if (mPendingImeResponse != null && !mPendingImeResponse.isDone()) {
+ mPendingImeResponse.complete(null);
+ }
mPendingImeResponse = new CompletableFuture<>();
// TODO(b/146454892): pipe the uiExtras from the ExtServices.
mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(
mUserId,
new InlineSuggestionsRequestInfo(mComponentName, autofillId, new Bundle()),
- new InlineSuggestionsRequestCallbackImpl(mPendingImeResponse));
+ new InlineSuggestionsRequestCallbackImpl(mPendingImeResponse,
+ mImeStatusListener));
}
}
@@ -116,10 +177,8 @@ final class InlineSuggestionSession {
}
public boolean hideInlineSuggestionsUi(@NonNull AutofillId autofillId) {
- if (sDebug) Log.d(TAG, "Called hideInlineSuggestionsUi for " + autofillId);
synchronized (mLock) {
if (mIsLastResponseNonEmpty) {
- if (sDebug) Log.d(TAG, "Send empty suggestion to IME");
return onInlineSuggestionsResponseLocked(autofillId,
new InlineSuggestionsResponse(Collections.EMPTY_LIST));
}
@@ -138,14 +197,32 @@ final class InlineSuggestionSession {
@NonNull InlineSuggestionsResponse inlineSuggestionsResponse) {
final CompletableFuture<ImeResponse> completedImsResponse = getPendingImeResponse();
if (completedImsResponse == null || !completedImsResponse.isDone()) {
+ if (sDebug) Log.d(TAG, "onInlineSuggestionsResponseLocked without IMS request");
return false;
}
// There is no need to wait on the CompletableFuture since it should have been completed
// when {@link #waitAndGetInlineSuggestionsRequest()} was called.
ImeResponse imeResponse = completedImsResponse.getNow(null);
if (imeResponse == null) {
+ if (sDebug) Log.d(TAG, "onInlineSuggestionsResponseLocked with pending IMS response");
return false;
}
+
+ if (!mImeInputViewStarted || !autofillId.equalsIgnoreSession(mImeFieldId)) {
+ if (sDebug) {
+ Log.d(TAG,
+ "onInlineSuggestionsResponseLocked not sent because input view is not "
+ + "started for " + autofillId);
+ }
+ mPendingAutofillResponse = new AutofillResponse(autofillId, inlineSuggestionsResponse);
+ // TODO(b/149442582): Although we are not sending the response to IME right away, we
+ // still return true to indicate that the response may be sent eventually, such that
+ // the dropdown UI will not be shown. This may not be the desired behavior in the
+ // auto-focus case where IME isn't shown after switching back to an activity. We may
+ // revisit this.
+ return true;
+ }
+
try {
imeResponse.mCallback.onInlineSuggestionsResponse(autofillId,
inlineSuggestionsResponse);
@@ -161,13 +238,6 @@ final class InlineSuggestionSession {
}
}
- private void cancelCurrentRequest() {
- CompletableFuture<ImeResponse> pendingImeResponse = getPendingImeResponse();
- if (pendingImeResponse != null && !pendingImeResponse.isDone()) {
- pendingImeResponse.complete(null);
- }
- }
-
@Nullable
@GuardedBy("mLock")
private CompletableFuture<ImeResponse> getPendingImeResponse() {
@@ -180,31 +250,84 @@ final class InlineSuggestionSession {
extends IInlineSuggestionsRequestCallback.Stub {
private final CompletableFuture<ImeResponse> mResponse;
+ private final ImeStatusListener mImeStatusListener;
- private InlineSuggestionsRequestCallbackImpl(CompletableFuture<ImeResponse> response) {
+ private InlineSuggestionsRequestCallbackImpl(CompletableFuture<ImeResponse> response,
+ ImeStatusListener imeStatusListener) {
mResponse = response;
+ mImeStatusListener = imeStatusListener;
}
+ @BinderThread
@Override
public void onInlineSuggestionsUnsupported() throws RemoteException {
if (sDebug) Log.d(TAG, "onInlineSuggestionsUnsupported() called.");
mResponse.complete(null);
}
+ @BinderThread
@Override
public void onInlineSuggestionsRequest(InlineSuggestionsRequest request,
- IInlineSuggestionsResponseCallback callback) {
- if (sDebug) Log.d(TAG, "onInlineSuggestionsRequest() received: " + request);
+ IInlineSuggestionsResponseCallback callback, AutofillId imeFieldId,
+ boolean inputViewStarted) {
+ if (sDebug) {
+ Log.d(TAG,
+ "onInlineSuggestionsRequest() received: " + request + ", inputViewStarted="
+ + inputViewStarted + ", imeFieldId=" + imeFieldId);
+ }
+ if (inputViewStarted) {
+ mImeStatusListener.onInputMethodStartInputView(imeFieldId);
+ } else {
+ mImeStatusListener.onInputMethodFinishInputView(imeFieldId);
+ }
if (request != null && callback != null) {
mResponse.complete(new ImeResponse(request, callback));
} else {
mResponse.complete(null);
}
}
+
+ @BinderThread
+ @Override
+ public void onInputMethodStartInputView(AutofillId imeFieldId) {
+ if (sDebug) Log.d(TAG, "onInputMethodStartInputView() received on " + imeFieldId);
+ mImeStatusListener.onInputMethodStartInputView(imeFieldId);
+ }
+
+ @BinderThread
+ @Override
+ public void onInputMethodFinishInputView(AutofillId imeFieldId) {
+ if (sDebug) Log.d(TAG, "onInputMethodFinishInputView() received on " + imeFieldId);
+ mImeStatusListener.onInputMethodFinishInputView(imeFieldId);
+ }
+ }
+
+ private interface ImeStatusListener {
+ void onInputMethodStartInputView(AutofillId imeFieldId);
+
+ void onInputMethodFinishInputView(AutofillId imeFieldId);
+ }
+
+ /**
+ * A data class wrapping Autofill responses for the inline suggestion request.
+ */
+ private static class AutofillResponse {
+ @NonNull
+ final AutofillId mAutofillId;
+
+ @NonNull
+ final InlineSuggestionsResponse mResponse;
+
+ AutofillResponse(@NonNull AutofillId autofillId,
+ @NonNull InlineSuggestionsResponse response) {
+ mAutofillId = autofillId;
+ mResponse = response;
+ }
+
}
/**
- * A data class wrapping IME responses for the inline suggestion request.
+ * A data class wrapping IME responses for the create inline suggestions request.
*/
private static class ImeResponse {
@NonNull
diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
index 9bf369089e50..4cf4463feaad 100644
--- a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
+++ b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
@@ -30,7 +30,7 @@ import android.service.autofill.IInlineSuggestionUiCallback;
import android.service.autofill.InlinePresentation;
import android.text.TextUtils;
import android.util.Slog;
-import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
@@ -328,7 +328,7 @@ public final class InlineSuggestionFactory {
}
@Override
- public void onContent(SurfaceControl surface)
+ public void onContent(SurfaceControlViewHost.SurfacePackage surface)
throws RemoteException {
callback.onContent(surface);
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index f84d35fb7776..16dd3ada12c7 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -5779,6 +5779,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
return nri.request.requestId == mDefaultRequest.requestId;
}
+ // TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent
+ // changes that would conflict throughout the automerger graph. Having this method temporarily
+ // helps with the process of going through with all these dependent changes across the entire
+ // tree.
+ /**
+ * Register a new agent. {@see #registerNetworkAgent} below.
+ */
+ public Network registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
+ LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
+ int currentScore, NetworkAgentConfig networkAgentConfig) {
+ return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities,
+ currentScore, networkAgentConfig, NetworkProvider.ID_NONE);
+ }
+
/**
* Register a new agent with ConnectivityService to handle a network.
*
@@ -5797,7 +5811,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
public Network registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
- NetworkScore currentScore, NetworkAgentConfig networkAgentConfig, int providerId) {
+ int currentScore, NetworkAgentConfig networkAgentConfig, int providerId) {
enforceNetworkFactoryPermission();
LinkProperties lp = new LinkProperties(linkProperties);
@@ -5805,10 +5819,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
// TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network
// satisfies mDefaultRequest.
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
+ final NetworkScore ns = new NetworkScore();
+ ns.putIntExtension(NetworkScore.LEGACY_SCORE, currentScore);
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc,
- currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig),
- this, mNetd, mDnsResolver, mNMS, providerId);
+ ns, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig), this,
+ mNetd, mDnsResolver, mNMS, providerId);
// Make sure the network capabilities reflect what the agent info says.
nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc));
final String extraInfo = networkInfo.getExtraInfo();
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index f85fc284330c..14154339ac4a 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1538,17 +1538,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
synchronized (mRecords) {
if (validatePhoneId(phoneId)) {
- if (mDisplayInfos[phoneId] != null) {
- mDisplayInfos[phoneId] = displayInfo;
- for (Record r : mRecords) {
- if (r.matchPhoneStateListenerEvent(
- PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
- && idMatch(r.subId, subId, phoneId)) {
- try {
- r.callback.onDisplayInfoChanged(displayInfo);
- } catch (RemoteException ex) {
- mRemoveList.add(r.binder);
- }
+ mDisplayInfos[phoneId] = displayInfo;
+ for (Record r : mRecords) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
+ && idMatch(r.subId, subId, phoneId)) {
+ try {
+ r.callback.onDisplayInfoChanged(displayInfo);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
}
}
}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index c15360b00d51..f1bc6822aa4d 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -1445,6 +1445,7 @@ public class AppOpsService extends IAppOpsService.Stub {
ArrayMap<String, String> dstFeatureIds = new ArrayMap<>();
ArraySet<String> featureIds = new ArraySet<>();
+ featureIds.add(null);
if (pkg.getFeatures() != null) {
int numFeatures = pkg.getFeatures().size();
for (int featureNum = 0; featureNum < numFeatures; featureNum++) {
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 4612cfd0f7cb..58b5cba477da 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -491,7 +491,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
return ConnectivityConstants.EXPLICITLY_SELECTED_NETWORK_SCORE;
}
- int score = mNetworkScore.getLegacyScore();
+ int score = mNetworkScore.getIntExtension(NetworkScore.LEGACY_SCORE);
if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty() && !isVPN()) {
score -= ConnectivityConstants.UNVALIDATED_SCORE_PENALTY;
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index eab339374d56..571f582ced33 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -109,6 +109,7 @@ import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
+import android.view.autofill.AutofillId;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InlineSuggestionsRequest;
import android.view.inputmethod.InputBinding;
@@ -2006,7 +2007,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public void onInlineSuggestionsRequest(InlineSuggestionsRequest request,
- IInlineSuggestionsResponseCallback callback) throws RemoteException {
+ IInlineSuggestionsResponseCallback callback, AutofillId imeFieldId,
+ boolean inputViewStarted)
+ throws RemoteException {
if (!mImePackageName.equals(request.getHostPackageName())) {
throw new SecurityException(
"Host package name in the provide request=[" + request.getHostPackageName()
@@ -2014,7 +2017,17 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
+ "].");
}
request.setHostDisplayId(mImeDisplayId);
- mCallback.onInlineSuggestionsRequest(request, callback);
+ mCallback.onInlineSuggestionsRequest(request, callback, imeFieldId, inputViewStarted);
+ }
+
+ @Override
+ public void onInputMethodStartInputView(AutofillId imeFieldId) throws RemoteException {
+ mCallback.onInputMethodStartInputView(imeFieldId);
+ }
+
+ @Override
+ public void onInputMethodFinishInputView(AutofillId imeFieldId) throws RemoteException {
+ mCallback.onInputMethodFinishInputView(imeFieldId);
}
}
diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
index b4ec359f0466..54dd69d70685 100644
--- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
+++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
@@ -239,23 +239,23 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
Slog.i(TAG, "Received integrity verification intent " + intent.toString());
Slog.i(TAG, "Extras " + intent.getExtras());
- String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
+ String installerPackageName = getInstallerPackageName(intent);
- PackageInfo packageInfo = getPackageArchiveInfo(intent.getData());
- if (packageInfo == null) {
- Slog.w(TAG, "Cannot parse package " + packageName);
- // We can't parse the package.
+ // Skip integrity verification if the verifier is doing the install.
+ if (!integrityCheckIncludesRuleProvider()
+ && isRuleProvider(installerPackageName)) {
+ Slog.i(TAG, "Verifier doing the install. Skipping integrity check.");
mPackageManagerInternal.setIntegrityVerificationResult(
verificationId, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW);
return;
}
- String installerPackageName = getInstallerPackageName(intent);
+ String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
- // Skip integrity verification if the verifier is doing the install.
- if (!integrityCheckIncludesRuleProvider()
- && isRuleProvider(installerPackageName)) {
- Slog.i(TAG, "Verifier doing the install. Skipping integrity check.");
+ PackageInfo packageInfo = getPackageArchiveInfo(intent.getData());
+ if (packageInfo == null) {
+ Slog.w(TAG, "Cannot parse package " + packageName);
+ // We can't parse the package.
mPackageManagerInternal.setIntegrityVerificationResult(
verificationId, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW);
return;
@@ -508,7 +508,8 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
return PackageInfoUtils.generate(pkg, null, flags, 0, 0, null, new PackageUserState(),
UserHandle.getCallingUserId(), null);
} catch (Exception e) {
- throw new IllegalArgumentException("Exception reading " + dataUri, e);
+ Slog.w(TAG, "Exception reading " + dataUri, e);
+ return null;
}
}
@@ -530,12 +531,18 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
// If we didn't find a base.apk, then try to parse each apk until we find the one
// that succeeds.
- basePackageInfo =
- mContext.getPackageManager()
- .getPackageArchiveInfo(
- apkFile.getAbsolutePath(),
- PackageManager.GET_SIGNING_CERTIFICATES
- | PackageManager.GET_META_DATA);
+ try {
+ basePackageInfo =
+ mContext.getPackageManager()
+ .getPackageArchiveInfo(
+ apkFile.getAbsolutePath(),
+ PackageManager.GET_SIGNING_CERTIFICATES
+ | PackageManager.GET_META_DATA);
+ } catch (Exception e) {
+ // Some of the splits may not contain a valid android manifest. It is an
+ // expected exception. We still log it nonetheless but we should keep looking.
+ Slog.w(TAG, "Exception reading " + apkFile, e);
+ }
if (basePackageInfo != null) {
Slog.i(TAG, "Found package info from " + apkFile);
break;
diff --git a/services/core/java/com/android/server/notification/NotificationChannelLogger.java b/services/core/java/com/android/server/notification/NotificationChannelLogger.java
new file mode 100644
index 000000000000..83f4ebb41827
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationChannelLogger.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import android.annotation.NonNull;
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
+
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.util.FrameworkStatsLog;
+
+/**
+ * Interface for logging NotificationChannelModified statsd atoms. Provided as an interface to
+ * enable unit-testing - use standard implementation NotificationChannelLoggerImpl in production.
+ */
+public interface NotificationChannelLogger {
+ // The logging interface. Not anticipating a need to override these high-level methods, which by
+ // default forward to a lower-level interface.
+
+ /**
+ * Log the creation of a notification channel.
+ * @param channel The channel.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ */
+ default void logNotificationChannelCreated(@NonNull NotificationChannel channel, int uid,
+ String pkg) {
+ logNotificationChannel(
+ NotificationChannelEvent.getCreated(channel),
+ channel, uid, pkg, 0, 0);
+ }
+
+ /**
+ * Log the deletion of a notification channel.
+ * @param channel The channel.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ */
+ default void logNotificationChannelDeleted(@NonNull NotificationChannel channel, int uid,
+ String pkg) {
+ logNotificationChannel(
+ NotificationChannelEvent.getDeleted(channel),
+ channel, uid, pkg, 0, 0);
+ }
+
+ /**
+ * Log the modification of a notification channel.
+ * @param channel The channel.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ * @param oldImportance Previous importance level of the channel.
+ * @param byUser True if the modification was user-specified.
+ */
+ default void logNotificationChannelModified(@NonNull NotificationChannel channel, int uid,
+ String pkg, int oldImportance, boolean byUser) {
+ logNotificationChannel(NotificationChannelEvent.getUpdated(byUser),
+ channel, uid, pkg, oldImportance, channel.getImportance());
+ }
+
+ /**
+ * Log the creation or modification of a notification channel group.
+ * @param channelGroup The notification channel group.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ * @param isNew True if this is a creation of a new group.
+ * @param wasBlocked
+ */
+ default void logNotificationChannelGroup(@NonNull NotificationChannelGroup channelGroup,
+ int uid, String pkg, boolean isNew, boolean wasBlocked) {
+ logNotificationChannelGroup(NotificationChannelEvent.getGroupUpdated(isNew),
+ channelGroup, uid, pkg, wasBlocked);
+ }
+
+ /**
+ * Log the deletion of a notification channel group.
+ * @param channelGroup The notification channel group.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ */
+ default void logNotificationChannelGroupDeleted(@NonNull NotificationChannelGroup channelGroup,
+ int uid, String pkg) {
+ logNotificationChannelGroup(NotificationChannelEvent.NOTIFICATION_CHANNEL_GROUP_DELETED,
+ channelGroup, uid, pkg, false);
+ }
+
+ /**
+ * Low-level interface for logging events, to be implemented.
+ * @param event Event to log.
+ * @param channel Notification channel.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ * @param oldImportance Old importance of the channel, if applicable (0 otherwise).
+ * @param newImportance New importance of the channel, if applicable (0 otherwise).
+ */
+ void logNotificationChannel(@NonNull NotificationChannelEvent event,
+ @NonNull NotificationChannel channel, int uid, String pkg,
+ int oldImportance, int newImportance);
+
+ /**
+ * Low-level interface for logging channel group events, to be implemented.
+ * @param event Event to log.
+ * @param channelGroup Notification channel group.
+ * @param uid UID of app that owns the channel.
+ * @param pkg Package of app that owns the channel.
+ * @param wasBlocked True if the channel is being modified and was previously blocked.
+ */
+ void logNotificationChannelGroup(@NonNull NotificationChannelEvent event,
+ @NonNull NotificationChannelGroup channelGroup, int uid, String pkg,
+ boolean wasBlocked);
+
+ /**
+ * The UiEvent enums that this class can log.
+ */
+ enum NotificationChannelEvent implements UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "App created a new notification channel")
+ NOTIFICATION_CHANNEL_CREATED(219),
+ @UiEvent(doc = "App modified an existing notification channel")
+ NOTIFICATION_CHANNEL_UPDATED(220),
+ @UiEvent(doc = "User modified a new notification channel")
+ NOTIFICATION_CHANNEL_UPDATED_BY_USER(221),
+ @UiEvent(doc = "App deleted an existing notification channel")
+ NOTIFICATION_CHANNEL_DELETED(222),
+ @UiEvent(doc = "App created a new notification channel group")
+ NOTIFICATION_CHANNEL_GROUP_CREATED(223),
+ @UiEvent(doc = "App modified an existing notification channel group")
+ NOTIFICATION_CHANNEL_GROUP_UPDATED(224),
+ @UiEvent(doc = "App deleted an existing notification channel group")
+ NOTIFICATION_CHANNEL_GROUP_DELETED(226),
+ @UiEvent(doc = "System created a new conversation (sub-channel in a notification channel)")
+ NOTIFICATION_CHANNEL_CONVERSATION_CREATED(272),
+ @UiEvent(doc = "System deleted a new conversation (sub-channel in a notification channel)")
+ NOTIFICATION_CHANNEL_CONVERSATION_DELETED(274);
+
+
+ private final int mId;
+ NotificationChannelEvent(int id) {
+ mId = id;
+ }
+ @Override public int getId() {
+ return mId;
+ }
+
+ public static NotificationChannelEvent getUpdated(boolean byUser) {
+ return byUser
+ ? NotificationChannelEvent.NOTIFICATION_CHANNEL_UPDATED_BY_USER
+ : NotificationChannelEvent.NOTIFICATION_CHANNEL_UPDATED;
+ }
+
+ public static NotificationChannelEvent getCreated(@NonNull NotificationChannel channel) {
+ return channel.getConversationId() != null
+ ? NotificationChannelEvent.NOTIFICATION_CHANNEL_CONVERSATION_CREATED
+ : NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED;
+ }
+
+ public static NotificationChannelEvent getDeleted(@NonNull NotificationChannel channel) {
+ return channel.getConversationId() != null
+ ? NotificationChannelEvent.NOTIFICATION_CHANNEL_CONVERSATION_DELETED
+ : NotificationChannelEvent.NOTIFICATION_CHANNEL_DELETED;
+ }
+
+ public static NotificationChannelEvent getGroupUpdated(boolean isNew) {
+ return isNew
+ ? NotificationChannelEvent.NOTIFICATION_CHANNEL_GROUP_CREATED
+ : NotificationChannelEvent.NOTIFICATION_CHANNEL_GROUP_DELETED;
+ }
+ }
+
+ /**
+ * @return Small hash of the channel ID, if present, or 0 otherwise.
+ */
+ static int getIdHash(@NonNull NotificationChannel channel) {
+ return NotificationRecordLogger.smallHash(channel.getId());
+ }
+
+ /**
+ * @return Small hash of the channel ID, if present, or 0 otherwise.
+ */
+ static int getIdHash(@NonNull NotificationChannelGroup group) {
+ return NotificationRecordLogger.smallHash(group.getId());
+ }
+
+ /**
+ * @return "Importance" for a channel group
+ */
+ static int getImportance(@NonNull NotificationChannelGroup channelGroup) {
+ return getImportance(channelGroup.isBlocked());
+ }
+
+ /**
+ * @return "Importance" for a channel group, from its blocked status
+ */
+ static int getImportance(boolean isBlocked) {
+ return isBlocked
+ ? FrameworkStatsLog.NOTIFICATION_CHANNEL_MODIFIED__IMPORTANCE__IMPORTANCE_NONE
+ : FrameworkStatsLog.NOTIFICATION_CHANNEL_MODIFIED__IMPORTANCE__IMPORTANCE_DEFAULT;
+ }
+
+}
diff --git a/services/core/java/com/android/server/notification/NotificationChannelLoggerImpl.java b/services/core/java/com/android/server/notification/NotificationChannelLoggerImpl.java
new file mode 100644
index 000000000000..2f7772eec2d2
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationChannelLoggerImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
+
+import com.android.internal.util.FrameworkStatsLog;
+
+/**
+ * Standard implementation of NotificationChannelLogger, which passes data through to StatsLog.
+ * This layer is as skinny as possible, to maximize code coverage of unit tests. Nontrivial code
+ * should live in the interface so it can be tested.
+ */
+public class NotificationChannelLoggerImpl implements NotificationChannelLogger {
+ @Override
+ public void logNotificationChannel(NotificationChannelEvent event,
+ NotificationChannel channel, int uid, String pkg,
+ int oldImportance, int newImportance) {
+ FrameworkStatsLog.write(FrameworkStatsLog.NOTIFICATION_CHANNEL_MODIFIED,
+ /* int event_id*/ event.getId(),
+ /* int uid*/ uid,
+ /* String package_name */ pkg,
+ /* int32 channel_id_hash */ NotificationChannelLogger.getIdHash(channel),
+ /* int old_importance*/ oldImportance,
+ /* int importance*/ newImportance);
+ }
+
+ @Override
+ public void logNotificationChannelGroup(NotificationChannelEvent event,
+ NotificationChannelGroup channelGroup, int uid, String pkg, boolean wasBlocked) {
+ FrameworkStatsLog.write(FrameworkStatsLog.NOTIFICATION_CHANNEL_MODIFIED,
+ /* int event_id*/ event.getId(),
+ /* int uid*/ uid,
+ /* String package_name */ pkg,
+ /* int32 channel_id_hash */ NotificationChannelLogger.getIdHash(channelGroup),
+ /* int old_importance*/ NotificationChannelLogger.getImportance(wasBlocked),
+ /* int importance*/ NotificationChannelLogger.getImportance(channelGroup));
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index 377e731fbeeb..2e8b76ee75fa 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -266,13 +266,17 @@ public class NotificationHistoryDatabase {
mHistoryFiles.removeLast();
} else {
// all remaining files are newer than the cut off; schedule jobs to delete
- final long deletionTime = creationTime + (retentionDays * HISTORY_RETENTION_MS);
- scheduleDeletion(currentOldestFile.getBaseFile(), deletionTime);
+ scheduleDeletion(currentOldestFile.getBaseFile(), creationTime, retentionDays);
}
}
}
}
+ private void scheduleDeletion(File file, long creationTime, int retentionDays) {
+ final long deletionTime = creationTime + (retentionDays * HISTORY_RETENTION_MS);
+ scheduleDeletion(file, deletionTime);
+ }
+
private void scheduleDeletion(File file, long deletionTime) {
if (DEBUG) {
Slog.d(TAG, "Scheduling deletion for " + file.getName() + " at " + deletionTime);
@@ -330,17 +334,28 @@ public class NotificationHistoryDatabase {
}
};
- private final class WriteBufferRunnable implements Runnable {
+ final class WriteBufferRunnable implements Runnable {
+ long currentTime = 0;
+ AtomicFile latestNotificationsFile;
+
@Override
public void run() {
if (DEBUG) Slog.d(TAG, "WriteBufferRunnable");
synchronized (mLock) {
- final AtomicFile latestNotificationsFiles = new AtomicFile(
- new File(mHistoryDir, String.valueOf(System.currentTimeMillis())));
+ if (currentTime == 0) {
+ currentTime = System.currentTimeMillis();
+ }
+ if (latestNotificationsFile == null) {
+ latestNotificationsFile = new AtomicFile(
+ new File(mHistoryDir, String.valueOf(currentTime)));
+ }
try {
- writeLocked(latestNotificationsFiles, mBuffer);
- mHistoryFiles.addFirst(latestNotificationsFiles);
+ writeLocked(latestNotificationsFile, mBuffer);
+ mHistoryFiles.addFirst(latestNotificationsFile);
mBuffer = new NotificationHistory();
+
+ scheduleDeletion(latestNotificationsFile.getBaseFile(), currentTime,
+ HISTORY_RETENTION_DAYS);
} catch (IOException e) {
Slog.e(TAG, "Failed to write buffer to disk. not flushing buffer", e);
}
@@ -440,7 +455,7 @@ public class NotificationHistoryDatabase {
@Override
public void run() {
- if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable");
+ if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable " + mPkg + " " + mConversationId);
synchronized (mLock) {
// Remove from pending history
mBuffer.removeConversationFromWrite(mPkg, mConversationId);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index c40f1b65573d..d139cd119df8 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1979,7 +1979,8 @@ public class NotificationManagerService extends SystemService {
mPreferencesHelper = new PreferencesHelper(getContext(),
mPackageManagerClient,
mRankingHandler,
- mZenModeHelper);
+ mZenModeHelper,
+ new NotificationChannelLoggerImpl());
mRankingHelper = new RankingHelper(getContext(),
mRankingHandler,
mPreferencesHelper,
diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
index eaca066f026f..f4ee4616df27 100644
--- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java
+++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
@@ -27,7 +27,6 @@ import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
@@ -307,27 +306,36 @@ public interface NotificationRecordLogger {
* @return Small hash of the channel ID, if present, or 0 otherwise.
*/
int getChannelIdHash() {
- return smallHash(Objects.hashCode(r.getSbn().getNotification().getChannelId()));
+ return smallHash(r.getSbn().getNotification().getChannelId());
}
/**
* @return Small hash of the group ID, respecting group override if present. 0 otherwise.
*/
int getGroupIdHash() {
- return smallHash(Objects.hashCode(r.getSbn().getGroup()));
+ return smallHash(r.getSbn().getGroup());
}
- // "Small" hashes will be in the range [0, MAX_HASH).
- static final int MAX_HASH = (1 << 13);
+ }
- /**
- * Maps in to the range [0, MAX_HASH), keeping similar values distinct.
- * @param in An arbitrary integer.
- * @return in mod MAX_HASH, signs chosen to stay in the range [0, MAX_HASH).
- */
- @VisibleForTesting
- static int smallHash(int in) {
- return Math.floorMod(in, MAX_HASH);
- }
+ // "Small" hashes will be in the range [0, MAX_HASH).
+ int MAX_HASH = (1 << 13);
+
+ /**
+ * Maps in to the range [0, MAX_HASH), keeping similar values distinct.
+ * @param in An arbitrary integer.
+ * @return in mod MAX_HASH, signs chosen to stay in the range [0, MAX_HASH).
+ */
+ static int smallHash(int in) {
+ return Math.floorMod(in, MAX_HASH);
}
+
+ /**
+ * @return Small hash of the string, if non-null, or 0 otherwise.
+ */
+ static int smallHash(@Nullable String in) {
+ return smallHash(Objects.hashCode(in));
+ }
+
+
}
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index b8186ed814fe..6fd09bb2fa8c 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -145,6 +145,7 @@ public class PreferencesHelper implements RankingConfig {
private final PackageManager mPm;
private final RankingHandler mRankingHandler;
private final ZenModeHelper mZenModeHelper;
+ private final NotificationChannelLogger mNotificationChannelLogger;
private SparseBooleanArray mBadgingEnabled;
private boolean mBubblesEnabled = DEFAULT_ALLOW_BUBBLE;
@@ -161,11 +162,12 @@ public class PreferencesHelper implements RankingConfig {
}
public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
- ZenModeHelper zenHelper) {
+ ZenModeHelper zenHelper, NotificationChannelLogger notificationChannelLogger) {
mContext = context;
mZenModeHelper = zenHelper;
mRankingHandler = rankingHandler;
mPm = pm;
+ mNotificationChannelLogger = notificationChannelLogger;
// STOPSHIP (b/142218092) this should be removed before ship
if (!wasBadgingForcedTrue(context)) {
@@ -654,10 +656,6 @@ public class PreferencesHelper implements RankingConfig {
throw new IllegalArgumentException("Invalid package");
}
final NotificationChannelGroup oldGroup = r.groups.get(group.getId());
- if (!group.equals(oldGroup)) {
- // will log for new entries as well as name/description changes
- MetricsLogger.action(getChannelGroupLog(group.getId(), pkg));
- }
if (oldGroup != null) {
group.setChannels(oldGroup.getChannels());
@@ -674,6 +672,13 @@ public class PreferencesHelper implements RankingConfig {
}
}
}
+ if (!group.equals(oldGroup)) {
+ // will log for new entries as well as name/description changes
+ MetricsLogger.action(getChannelGroupLog(group.getId(), pkg));
+ mNotificationChannelLogger.logNotificationChannelGroup(group, uid, pkg,
+ oldGroup == null,
+ (oldGroup != null) && oldGroup.isBlocked());
+ }
r.groups.put(group.getId(), group);
}
}
@@ -685,7 +690,7 @@ public class PreferencesHelper implements RankingConfig {
Objects.requireNonNull(channel);
Objects.requireNonNull(channel.getId());
Preconditions.checkArgument(!TextUtils.isEmpty(channel.getName()));
- boolean needsPolicyFileChange = false;
+ boolean needsPolicyFileChange = false, wasUndeleted = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
if (r == null) {
@@ -698,15 +703,18 @@ public class PreferencesHelper implements RankingConfig {
throw new IllegalArgumentException("Reserved id");
}
NotificationChannel existing = r.channels.get(channel.getId());
- // Keep most of the existing settings
if (existing != null && fromTargetApp) {
+ // Actually modifying an existing channel - keep most of the existing settings
if (existing.isDeleted()) {
+ // The existing channel was deleted - undelete it.
existing.setDeleted(false);
needsPolicyFileChange = true;
+ wasUndeleted = true;
// log a resurrected channel as if it's new again
MetricsLogger.action(getChannelLog(channel, pkg).setType(
com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
+ mNotificationChannelLogger.logNotificationChannelCreated(channel, uid, pkg);
}
if (!Objects.equals(channel.getName().toString(), existing.getName().toString())) {
@@ -756,6 +764,10 @@ public class PreferencesHelper implements RankingConfig {
}
updateConfig();
+ if (needsPolicyFileChange && !wasUndeleted) {
+ mNotificationChannelLogger.logNotificationChannelModified(existing, uid, pkg,
+ previousExistingImportance, false);
+ }
return needsPolicyFileChange;
}
@@ -806,6 +818,7 @@ public class PreferencesHelper implements RankingConfig {
}
MetricsLogger.action(getChannelLog(channel, pkg).setType(
com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
+ mNotificationChannelLogger.logNotificationChannelCreated(channel, uid, pkg);
}
return needsPolicyFileChange;
@@ -867,6 +880,8 @@ public class PreferencesHelper implements RankingConfig {
// only log if there are real changes
MetricsLogger.action(getChannelLog(updatedChannel, pkg)
.setSubtype(fromUser ? 1 : 0));
+ mNotificationChannelLogger.logNotificationChannelModified(updatedChannel, uid, pkg,
+ channel.getImportance(), fromUser);
}
if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd
@@ -954,14 +969,21 @@ public class PreferencesHelper implements RankingConfig {
}
NotificationChannel channel = r.channels.get(channelId);
if (channel != null) {
- channel.setDeleted(true);
- LogMaker lm = getChannelLog(channel, pkg);
- lm.setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_CLOSE);
- MetricsLogger.action(lm);
+ deleteNotificationChannelLocked(channel, pkg, uid);
+ }
+ }
+ }
- if (mAreChannelsBypassingDnd && channel.canBypassDnd()) {
- updateChannelsBypassingDnd(mContext.getUserId());
- }
+ private void deleteNotificationChannelLocked(NotificationChannel channel, String pkg, int uid) {
+ if (!channel.isDeleted()) {
+ channel.setDeleted(true);
+ LogMaker lm = getChannelLog(channel, pkg);
+ lm.setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_CLOSE);
+ MetricsLogger.action(lm);
+ mNotificationChannelLogger.logNotificationChannelDeleted(channel, uid, pkg);
+
+ if (mAreChannelsBypassingDnd && channel.canBypassDnd()) {
+ updateChannelsBypassingDnd(mContext.getUserId());
}
}
}
@@ -1158,13 +1180,17 @@ public class PreferencesHelper implements RankingConfig {
return deletedChannels;
}
- r.groups.remove(groupId);
+ NotificationChannelGroup channelGroup = r.groups.remove(groupId);
+ if (channelGroup != null) {
+ mNotificationChannelLogger.logNotificationChannelGroupDeleted(channelGroup, uid,
+ pkg);
+ }
int N = r.channels.size();
for (int i = 0; i < N; i++) {
final NotificationChannel nc = r.channels.valueAt(i);
if (groupId.equals(nc.getGroup())) {
- nc.setDeleted(true);
+ deleteNotificationChannelLocked(nc, pkg, uid);
deletedChannels.add(nc);
}
}
@@ -1279,6 +1305,7 @@ public class PreferencesHelper implements RankingConfig {
lm.setType(
com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_CLOSE);
MetricsLogger.action(lm);
+ mNotificationChannelLogger.logNotificationChannelDeleted(nc, uid, pkg);
deletedChannelIds.add(nc.getId());
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index 5734271ecb83..d108e76e37df 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -101,10 +101,6 @@ final class OverlayManagerServiceImpl {
return true;
}
- if (getPackageConfiguredPriority(theTruth.packageName) != oldSettings.priority) {
- return true;
- }
-
// If an immutable overlay changes its configured enabled state, reinitialize the overlay.
if (!isMutable && isPackageConfiguredEnabled(theTruth.packageName)
!= oldSettings.isEnabled()) {
@@ -160,6 +156,7 @@ final class OverlayManagerServiceImpl {
final PackageInfo overlayPackage = overlayPackages.get(i);
final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName);
+ int priority = getPackageConfiguredPriority(overlayPackage.packageName);
if (mustReinitializeOverlay(overlayPackage, oi)) {
// if targetPackageName has changed the package that *used* to
// be the target must also update its assets
@@ -173,8 +170,10 @@ final class OverlayManagerServiceImpl {
overlayPackage.applicationInfo.getBaseCodePath(),
isPackageConfiguredMutable(overlayPackage.packageName),
isPackageConfiguredEnabled(overlayPackage.packageName),
- getPackageConfiguredPriority(overlayPackage.packageName),
- overlayPackage.overlayCategory);
+ priority, overlayPackage.overlayCategory);
+ } else if (priority != oi.priority) {
+ mSettings.setPriority(overlayPackage.packageName, newUserId, priority);
+ packagesToUpdateAssets.add(oi.targetPackageName);
}
storedOverlayInfos.remove(overlayPackage.packageName);
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index 6bccdfcf5bb2..bdbaf78439a8 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -71,24 +71,9 @@ final class OverlayManagerSettings {
@NonNull final String baseCodePath, boolean isMutable, boolean isEnabled, int priority,
@Nullable String overlayCategory) {
remove(packageName, userId);
- final SettingsItem item =
- new SettingsItem(packageName, userId, targetPackageName, targetOverlayableName,
- baseCodePath, OverlayInfo.STATE_UNKNOWN, isEnabled, isMutable, priority,
- overlayCategory);
-
- int i;
- for (i = mItems.size() - 1; i >= 0; i--) {
- SettingsItem parentItem = mItems.get(i);
- if (parentItem.mPriority <= priority) {
- break;
- }
- }
- int pos = i + 1;
- if (pos == mItems.size()) {
- mItems.add(item);
- } else {
- mItems.add(pos, item);
- }
+ insert(new SettingsItem(packageName, userId, targetPackageName, targetOverlayableName,
+ baseCodePath, OverlayInfo.STATE_UNKNOWN, isEnabled, isMutable, priority,
+ overlayCategory));
}
/**
@@ -220,6 +205,21 @@ final class OverlayManagerSettings {
}
/**
+ * Reassigns the priority of an overlay maintaining the values of the overlays other settings.
+ */
+ void setPriority(@NonNull final String packageName, final int userId, final int priority) {
+ final int moveIdx = select(packageName, userId);
+ if (moveIdx < 0) {
+ throw new BadKeyException(packageName, userId);
+ }
+
+ final SettingsItem itemToMove = mItems.get(moveIdx);
+ mItems.remove(moveIdx);
+ itemToMove.setPriority(priority);
+ insert(itemToMove);
+ }
+
+ /**
* Returns true if the settings were modified, false if they remain the same.
*/
boolean setPriority(@NonNull final String packageName,
@@ -284,6 +284,21 @@ final class OverlayManagerSettings {
return true;
}
+ /**
+ * Inserts the item into the list of settings items.
+ */
+ private void insert(@NonNull SettingsItem item) {
+ int i;
+ for (i = mItems.size() - 1; i >= 0; i--) {
+ SettingsItem parentItem = mItems.get(i);
+ if (parentItem.mPriority <= item.getPriority()) {
+ break;
+ }
+ }
+
+ mItems.add(i + 1, item);
+ }
+
void dump(@NonNull final PrintWriter p, @NonNull DumpState dumpState) {
// select items to display
Stream<SettingsItem> items = mItems.stream();
@@ -583,6 +598,11 @@ final class OverlayManagerSettings {
return mCache;
}
+ private void setPriority(int priority) {
+ mPriority = priority;
+ invalidateCache();
+ }
+
private void invalidateCache() {
mCache = null;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c34e45e1e84a..68733789df33 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -13117,7 +13117,7 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized (mLock) {
allPackages = mPackages.keySet().toArray(new String[mPackages.size()]);
}
- PackageManagerService.this.removeDistractingPackageRestrictions(allPackages, userId);
+ removeDistractingPackageRestrictions(allPackages, userId);
}
/**
@@ -20161,13 +20161,13 @@ public class PackageManagerService extends IPackageManager.Stub
}
synchronized (mLock) {
pkgSetting.setEnabled(newState, userId, callingPackage);
- if (newState == COMPONENT_ENABLED_STATE_DISABLED_USER
- || newState == COMPONENT_ENABLED_STATE_DISABLED
+ if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER
+ || newState == COMPONENT_ENABLED_STATE_DISABLED)
&& pkgSetting.getPermissionsState().hasPermission(
Manifest.permission.SUSPEND_APPS, userId)) {
// This app should not generally be allowed to get disabled by the UI, but if it
// ever does, we don't want to end up with some of the user's apps permanently
- // blocked
+ // suspended.
unsuspendForSuspendingPackage(packageName, userId);
removeAllDistractingPackageRestrictions(userId);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index f1e403b1bc63..0f06c186b9ff 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -97,6 +97,7 @@ import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.PrintWriterPrinter;
+import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.content.PackageHelper;
@@ -139,6 +140,7 @@ class PackageManagerShellCommand extends ShellCommand {
/** Path where ART profiles snapshots are dumped for the shell user */
private final static String ART_PROFILE_SNAPSHOT_DEBUG_LOCATION = "/data/misc/profman/";
private static final int DEFAULT_WAIT_MS = 60 * 1000;
+ private static final String TAG = "PackageManagerShellCommand";
final IPackageManager mInterface;
final IPermissionManager mPermissionManager;
@@ -2998,83 +3000,101 @@ class PackageManagerShellCommand extends ShellCommand {
for (String arg : args) {
final int delimLocation = arg.indexOf(':');
- // 2. File with specified size read from stdin.
if (delimLocation != -1) {
- final String[] fileDesc = arg.split(":");
- String name = null;
- long sizeBytes = -1;
- String metadata;
- byte[] signature = null;
-
- try {
- if (fileDesc.length > 0) {
- name = fileDesc[0];
- }
- if (fileDesc.length > 1) {
- sizeBytes = Long.parseUnsignedLong(fileDesc[1]);
- }
- if (fileDesc.length > 2 && !TextUtils.isEmpty(fileDesc[2])) {
- metadata = fileDesc[2];
- } else {
- metadata = name;
- }
- if (fileDesc.length > 3) {
- signature = Base64.getDecoder().decode(fileDesc[3]);
- }
- } catch (IllegalArgumentException e) {
- getErrPrintWriter().println(
- "Unable to parse file parameters: " + arg + ", reason: " + e);
+ // 2. File with specified size read from stdin.
+ if (processArgForStdin(arg, session) != 0) {
return 1;
}
+ } else {
+ // 3. Local file.
+ processArgForLocalFile(arg, session);
+ }
+ }
+ return 0;
+ } finally {
+ IoUtils.closeQuietly(session);
+ }
+ }
- if (TextUtils.isEmpty(name)) {
- getErrPrintWriter().println("Empty file name in: " + arg);
- return 1;
- }
+ private int processArgForStdin(String arg, PackageInstaller.Session session) {
+ final String[] fileDesc = arg.split(":");
+ String name, metadata;
+ long sizeBytes;
+ byte[] signature = null;
- if (signature != null) {
- // Streaming/adb mode.
- metadata = "+" + metadata;
- } else {
- // Singleshot read from stdin.
- metadata = "-" + metadata;
- }
+ try {
+ if (fileDesc.length < 2) {
+ getErrPrintWriter().println("Must specify file name and size");
+ return 1;
+ }
+ name = fileDesc[0];
+ sizeBytes = Long.parseUnsignedLong(fileDesc[1]);
+ metadata = name;
- try {
- if (V4Signature.readFrom(signature) == null) {
- getErrPrintWriter().println("V4 signature is invalid in: " + arg);
- return 1;
- }
- } catch (Exception e) {
- getErrPrintWriter().println("V4 signature is invalid: " + e + " in " + arg);
- return 1;
- }
+ if (fileDesc.length > 2 && !TextUtils.isEmpty(fileDesc[2])) {
+ metadata = fileDesc[2];
+ }
+ if (fileDesc.length > 3) {
+ signature = Base64.getDecoder().decode(fileDesc[3]);
+ }
+ } catch (IllegalArgumentException e) {
+ getErrPrintWriter().println(
+ "Unable to parse file parameters: " + arg + ", reason: " + e);
+ return 1;
+ }
- session.addFile(LOCATION_DATA_APP, name, sizeBytes,
- metadata.getBytes(StandardCharsets.UTF_8), signature);
- continue;
+ if (TextUtils.isEmpty(name)) {
+ getErrPrintWriter().println("Empty file name in: " + arg);
+ return 1;
+ }
+
+ if (signature != null) {
+ // Streaming/adb mode.
+ metadata = "+" + metadata;
+ try {
+ if (V4Signature.readFrom(signature) == null) {
+ getErrPrintWriter().println("V4 signature is invalid in: " + arg);
+ return 1;
}
+ } catch (Exception e) {
+ getErrPrintWriter().println(
+ "V4 signature is invalid: " + e + " in " + arg);
+ return 1;
+ }
+ } else {
+ // Single-shot read from stdin.
+ metadata = "-" + metadata;
+ }
- // 3. Local file.
- final String inPath = arg;
+ session.addFile(LOCATION_DATA_APP, name, sizeBytes,
+ metadata.getBytes(StandardCharsets.UTF_8), signature);
+ return 0;
+ }
- final File file = new File(inPath);
- final String name = file.getName();
- final long size = file.length();
- final byte[] metadata = inPath.getBytes(StandardCharsets.UTF_8);
+ private void processArgForLocalFile(String arg, PackageInstaller.Session session) {
+ final String inPath = arg;
- // Try to load a v4 signature for the APK.
- final V4Signature v4signature = V4Signature.readFrom(
- new File(inPath + V4Signature.EXT));
- final byte[] v4signatureBytes =
- (v4signature != null) ? v4signature.toByteArray() : null;
+ final File file = new File(inPath);
+ final String name = file.getName();
+ final long size = file.length();
+ final byte[] metadata = inPath.getBytes(StandardCharsets.UTF_8);
- session.addFile(LOCATION_DATA_APP, name, size, metadata, v4signatureBytes);
+ byte[] v4signatureBytes = null;
+ // Try to load the v4 signature file for the APK; it might not exist.
+ final String v4SignaturePath = inPath + V4Signature.EXT;
+ final ParcelFileDescriptor pfd = openFileForSystem(v4SignaturePath, "r");
+ if (pfd != null) {
+ try {
+ final V4Signature v4signature = V4Signature.readFrom(pfd);
+ v4signatureBytes = v4signature.toByteArray();
+ } catch (IOException ex) {
+ Slog.e(TAG, "V4 signature file exists but failed to be parsed.", ex);
+ } finally {
+ IoUtils.closeQuietly(pfd);
}
- return 0;
- } finally {
- IoUtils.closeQuietly(session);
}
+
+ session.addFile(LOCATION_DATA_APP, name, size, metadata, v4signatureBytes);
}
private int doWriteSplits(int sessionId, ArrayList<String> splitPaths, long sessionSizeBytes,
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index fa1da27e7531..1dc705b4add9 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4837,6 +4837,8 @@ public final class Settings {
pw.print(ps.getHidden(user.id));
pw.print(" suspended=");
pw.print(ps.getSuspended(user.id));
+ pw.print(" distractionFlags=");
+ pw.print(ps.getDistractionFlags(user.id));
pw.print(" stopped=");
pw.print(ps.getStopped(user.id));
pw.print(" notLaunched=");
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index 97f9548bb52b..764eec18cd96 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -10,7 +10,7 @@
"name": "CtsCompilationTestCases"
},
{
- "name": "AppEnumerationTests"
+ "name": "CtsAppEnumerationTestCases"
},
{
"name": "CtsMatchFlagTestCases"
@@ -34,6 +34,9 @@
"options": [
{
"include-filter": "android.content.pm.cts.PackageManagerShellCommandTest"
+ },
+ {
+ "include-filter": "android.content.pm.cts.PackageManagerShellCommandIncrementalTest"
}
]
},
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
index 2b508ea3d134..fee154f65e86 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
@@ -21,31 +21,23 @@ import android.annotation.Nullable;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
-import android.content.pm.SharedLibraryInfo;
import android.content.pm.parsing.ParsingPackage;
import android.content.pm.parsing.ParsingPackageImpl;
import android.content.pm.parsing.component.ParsedActivity;
-import android.content.pm.parsing.component.ParsedMainComponent;
import android.content.pm.parsing.component.ParsedProvider;
import android.content.pm.parsing.component.ParsedService;
import android.content.res.TypedArray;
-import android.os.Environment;
import android.os.Parcel;
-import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
import com.android.server.pm.parsing.PackageInfoUtils;
-import java.util.Comparator;
-import java.util.List;
import java.util.UUID;
/**
@@ -486,16 +478,16 @@ public final class PackageImpl extends ParsingPackageImpl implements ParsedPacka
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.manifestPackageName, dest, flags);
+ sForInternedString.parcel(this.manifestPackageName, dest, flags);
dest.writeBoolean(this.stub);
- sForString.parcel(this.nativeLibraryDir, dest, flags);
- sForString.parcel(this.nativeLibraryRootDir, dest, flags);
+ dest.writeString(this.nativeLibraryDir);
+ dest.writeString(this.nativeLibraryRootDir);
dest.writeBoolean(this.nativeLibraryRootRequiresIsa);
- sForString.parcel(this.primaryCpuAbi, dest, flags);
- sForString.parcel(this.secondaryCpuAbi, dest, flags);
- sForString.parcel(this.secondaryNativeLibraryDir, dest, flags);
- sForString.parcel(this.seInfo, dest, flags);
- sForString.parcel(this.seInfoUser, dest, flags);
+ sForInternedString.parcel(this.primaryCpuAbi, dest, flags);
+ sForInternedString.parcel(this.secondaryCpuAbi, dest, flags);
+ dest.writeString(this.secondaryNativeLibraryDir);
+ dest.writeString(this.seInfo);
+ dest.writeString(this.seInfoUser);
dest.writeInt(this.uid);
dest.writeBoolean(this.coreApp);
dest.writeBoolean(this.system);
@@ -511,16 +503,16 @@ public final class PackageImpl extends ParsingPackageImpl implements ParsedPacka
public PackageImpl(Parcel in) {
super(in);
- this.manifestPackageName = sForString.unparcel(in);
+ this.manifestPackageName = sForInternedString.unparcel(in);
this.stub = in.readBoolean();
- this.nativeLibraryDir = sForString.unparcel(in);
- this.nativeLibraryRootDir = sForString.unparcel(in);
+ this.nativeLibraryDir = in.readString();
+ this.nativeLibraryRootDir = in.readString();
this.nativeLibraryRootRequiresIsa = in.readBoolean();
- this.primaryCpuAbi = sForString.unparcel(in);
- this.secondaryCpuAbi = sForString.unparcel(in);
- this.secondaryNativeLibraryDir = sForString.unparcel(in);
- this.seInfo = sForString.unparcel(in);
- this.seInfoUser = sForString.unparcel(in);
+ this.primaryCpuAbi = sForInternedString.unparcel(in);
+ this.secondaryCpuAbi = sForInternedString.unparcel(in);
+ this.secondaryNativeLibraryDir = in.readString();
+ this.seInfo = in.readString();
+ this.seInfoUser = in.readString();
this.uid = in.readInt();
this.coreApp = in.readBoolean();
this.system = in.readBoolean();
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index e426574fb9b7..612989f76cd3 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -17,7 +17,7 @@
package com.android.server.stats.pull;
import static android.app.AppOpsManager.OP_FLAG_SELF;
-import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXIED;
+import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXY;
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
import static android.os.Debug.getIonHeapsSizeKb;
@@ -187,7 +187,7 @@ public class StatsPullAtomService extends SystemService {
private static final int MAX_BATTERY_STATS_HELPER_FREQUENCY_MS = 1000;
private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
- private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXIED;
+ private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXY;
private static final String COMMON_PERMISSION_PREFIX = "android.permission.";
private final Object mNetworkStatsLock = new Object();
@@ -1468,6 +1468,9 @@ public class StatsPullAtomService extends SystemService {
}
private void registerIonHeapSize() {
+ if (!new File("/sys/kernel/ion/total_heaps_kb").exists()) {
+ return;
+ }
int tagId = FrameworkStatsLog.ION_HEAP_SIZE;
mStatsManager.registerPullAtomCallback(
tagId,
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 54cea938b57b..5cd016922e68 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -804,11 +804,11 @@ public class RecentsAnimationController implements DeathRecipient {
*
* This avoids any screen rotation animation when animating to the Recents view.
*/
- void applyFixedRotationTransformIfNeeded(@NonNull WindowToken wallpaper) {
+ void linkFixedRotationTransformIfNeeded(@NonNull WindowToken wallpaper) {
if (mTargetActivityRecord == null) {
return;
}
- wallpaper.applyFixedRotationTransform(mTargetActivityRecord);
+ wallpaper.linkFixedRotationTransform(mTargetActivityRecord);
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 1e22141f232a..294dd040e2a5 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -134,14 +134,12 @@ class WallpaperWindowToken extends WindowToken {
// If the Recents animation is running, and the wallpaper target is the animating
// task we want the wallpaper to be rotated in the same orientation as the
// RecentsAnimation's target (e.g the launcher)
- recentsAnimationController.applyFixedRotationTransformIfNeeded(this);
+ recentsAnimationController.linkFixedRotationTransformIfNeeded(this);
} else if (wallpaperTarget != null
&& wallpaperTarget.mToken.hasFixedRotationTransform()) {
// If the wallpaper target has a fixed rotation, we want the wallpaper to follow its
// rotation
- applyFixedRotationTransform(wallpaperTarget.mToken);
- } else if (hasFixedRotationTransform()) {
- clearFixedRotationTransform();
+ linkFixedRotationTransform(wallpaperTarget.mToken);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 76a03150c8df..3b7b7c65a114 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -106,17 +106,24 @@ class WindowToken extends WindowContainer<WindowState> {
* rotated by the given rotated display info, frames and insets.
*/
private static class FixedRotationTransformState {
+ final WindowToken mOwner;
final DisplayInfo mDisplayInfo;
final DisplayFrames mDisplayFrames;
final InsetsState mInsetsState;
final Configuration mRotatedOverrideConfiguration;
final SeamlessRotator mRotator;
- final ArrayList<WindowContainer<?>> mRotatedContainers = new ArrayList<>();
+ /**
+ * The tokens that share the same transform. Their end time of transform are the same as
+ * {@link #mOwner}.
+ */
+ final ArrayList<WindowToken> mAssociatedTokens = new ArrayList<>(1);
+ final ArrayList<WindowContainer<?>> mRotatedContainers = new ArrayList<>(3);
boolean mIsTransforming = true;
- FixedRotationTransformState(DisplayInfo rotatedDisplayInfo,
+ FixedRotationTransformState(WindowToken owner, DisplayInfo rotatedDisplayInfo,
DisplayFrames rotatedDisplayFrames, InsetsState rotatedInsetsState,
Configuration rotatedConfig, int currentRotation) {
+ mOwner = owner;
mDisplayInfo = rotatedDisplayInfo;
mDisplayFrames = rotatedDisplayFrames;
mInsetsState = rotatedInsetsState;
@@ -428,34 +435,43 @@ class WindowToken extends WindowContainer<WindowState> {
final InsetsState insetsState = new InsetsState();
mDisplayContent.getDisplayPolicy().simulateLayoutDisplay(displayFrames, insetsState,
mDisplayContent.getConfiguration().uiMode);
- mFixedRotationTransformState = new FixedRotationTransformState(info, displayFrames,
+ mFixedRotationTransformState = new FixedRotationTransformState(this, info, displayFrames,
insetsState, new Configuration(config), mDisplayContent.getRotation());
onConfigurationChanged(getParent().getConfiguration());
}
/**
- * Copies the {@link FixedRotationTransformState} (if any) from the other WindowToken to this
- * one.
+ * Reuses the {@link FixedRotationTransformState} (if any) from the other WindowToken to this
+ * one. This takes the same effect as {@link #applyFixedRotationTransform}, but the linked state
+ * can only be cleared by the state owner.
*/
- void applyFixedRotationTransform(WindowToken other) {
+ void linkFixedRotationTransform(WindowToken other) {
+ if (mFixedRotationTransformState != null) {
+ return;
+ }
final FixedRotationTransformState fixedRotationState = other.mFixedRotationTransformState;
- if (fixedRotationState != null) {
- applyFixedRotationTransform(fixedRotationState.mDisplayInfo,
- fixedRotationState.mDisplayFrames,
- fixedRotationState.mRotatedOverrideConfiguration);
+ if (fixedRotationState == null) {
+ return;
}
+ mFixedRotationTransformState = fixedRotationState;
+ fixedRotationState.mAssociatedTokens.add(this);
+ onConfigurationChanged(getParent().getConfiguration());
}
- /** Clears the transformation and continue updating the orientation change of display. */
+ /**
+ * Clears the transformation and continue updating the orientation change of display. Only the
+ * state owner can clear the transform state.
+ */
void clearFixedRotationTransform() {
- if (mFixedRotationTransformState == null) {
+ final FixedRotationTransformState state = mFixedRotationTransformState;
+ if (state == null || state.mOwner != this) {
return;
}
- mFixedRotationTransformState.resetTransform();
+ state.resetTransform();
// Clear the flag so if the display will be updated to the same orientation, the transform
// won't take effect. The state is cleared at the end, because it is used to indicate that
// other windows can use seamless rotation when applying rotation to display.
- mFixedRotationTransformState.mIsTransforming = false;
+ state.mIsTransforming = false;
final boolean changed =
mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp(this);
// If it is not the launching app or the display is not rotated, make sure the merged
@@ -463,6 +479,9 @@ class WindowToken extends WindowContainer<WindowState> {
if (!changed) {
onMergedOverrideConfigurationChanged();
}
+ for (int i = state.mAssociatedTokens.size() - 1; i >= 0; i--) {
+ state.mAssociatedTokens.get(i).mFixedRotationTransformState = null;
+ }
mFixedRotationTransformState = null;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 36c0659c9768..eed3d9d51e56 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -6551,13 +6551,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
// Or ensure calling process is delegatePackage itself.
} else {
- int uid = 0;
- try {
- uid = mInjector.getPackageManager()
- .getPackageUidAsUser(delegatePackage, userId);
- } catch(NameNotFoundException e) {
- }
- if (uid != callingUid) {
+ if (!isCallingFromPackage(delegatePackage, callingUid)) {
throw new SecurityException("Caller with uid " + callingUid + " is not "
+ delegatePackage);
}
@@ -6677,15 +6671,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
final List<String> scopes = policy.mDelegationMap.get(callerPackage);
// Check callingUid only if callerPackage has the required scope delegation.
if (scopes != null && scopes.contains(scope)) {
- try {
- // Retrieve the expected UID for callerPackage.
- final int uid = mInjector.getPackageManager()
- .getPackageUidAsUser(callerPackage, userId);
- // Return true if the caller is actually callerPackage.
- return uid == callerUid;
- } catch (NameNotFoundException e) {
- // Ignore.
- }
+ // Return true if the caller is actually callerPackage.
+ return isCallingFromPackage(callerPackage, callerUid);
}
return false;
}
@@ -8577,14 +8564,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public void clearDeviceOwner(String packageName) {
Objects.requireNonNull(packageName, "packageName is null");
final int callingUid = mInjector.binderGetCallingUid();
- try {
- int uid = mInjector.getPackageManager().getPackageUidAsUser(packageName,
- UserHandle.getUserId(callingUid));
- if (uid != callingUid) {
- throw new SecurityException("Invalid packageName");
- }
- } catch (NameNotFoundException e) {
- throw new SecurityException(e);
+ if (!isCallingFromPackage(packageName, callingUid)) {
+ throw new SecurityException("Invalid packageName");
}
synchronized (getLockObject()) {
final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
@@ -11833,12 +11814,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
private boolean isSetSecureSettingLocationModeCheckEnabled(String packageName, int userId) {
+ long ident = mInjector.binderClearCallingIdentity();
try {
return mIPlatformCompat.isChangeEnabledByPackageName(USE_SET_LOCATION_ENABLED,
packageName, userId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Failed to get a response from PLATFORM_COMPAT_SERVICE", e);
return getTargetSdk(packageName, userId) > Build.VERSION_CODES.Q;
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
}
}
@@ -12299,14 +12283,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (ownerPackage == null) {
ownerPackage = mOwners.getDeviceOwnerPackageName();
}
+ final String packageName = ownerPackage;
PackageManager pm = mInjector.getPackageManager();
- PackageInfo packageInfo;
- try {
- packageInfo = pm.getPackageInfo(ownerPackage, 0);
- } catch (NameNotFoundException e) {
- Log.e(LOG_TAG, "getPackageInfo error", e);
- return null;
- }
+ PackageInfo packageInfo = mInjector.binderWithCleanCallingIdentity(() -> {
+ try {
+ return pm.getPackageInfo(packageName, 0);
+ } catch (NameNotFoundException e) {
+ Log.e(LOG_TAG, "getPackageInfo error", e);
+ return null;
+ }
+ });
if (packageInfo == null) {
Log.e(LOG_TAG, "packageInfo is inexplicably null");
return null;
@@ -12871,13 +12857,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
boolean isPackageInstalledForUser(String packageName, int userHandle) {
- try {
- PackageInfo pi = mInjector.getIPackageManager().getPackageInfo(packageName, 0,
- userHandle);
- return (pi != null) && (pi.applicationInfo.flags != 0);
- } catch (RemoteException re) {
- throw new RuntimeException("Package manager has died", re);
- }
+ return mInjector.binderWithCleanCallingIdentity(() -> {
+ try {
+ PackageInfo pi = mInjector.getIPackageManager().getPackageInfo(packageName, 0,
+ userHandle);
+ return (pi != null) && (pi.applicationInfo.flags != 0);
+ } catch (RemoteException re) {
+ throw new RuntimeException("Package manager has died", re);
+ }
+ });
}
public boolean isRuntimePermission(String permissionName) throws NameNotFoundException {
@@ -13942,13 +13930,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
mPackagesToRemove.remove(packageUserPair);
}
- try {
- if (mInjector.getIPackageManager().getPackageInfo(packageName, 0, userId) == null) {
- // Package does not exist. Nothing to do.
- return;
- }
- } catch (RemoteException re) {
- Log.e(LOG_TAG, "Failure talking to PackageManager while getting package info");
+ if (!isPackageInstalledForUser(packageName, userId)) {
+ // Package does not exist. Nothing to do.
+ return;
}
try { // force stop the package before uninstalling
@@ -15536,14 +15520,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
private boolean isCallingFromPackage(String packageName, int callingUid) {
- try {
- final int packageUid = mInjector.getPackageManager().getPackageUidAsUser(
- packageName, UserHandle.getUserId(callingUid));
- return packageUid == callingUid;
- } catch (NameNotFoundException e) {
- Log.d(LOG_TAG, "Calling package not found", e);
- return false;
- }
+ return mInjector.binderWithCleanCallingIdentity(() -> {
+ try {
+ final int packageUid = mInjector.getPackageManager().getPackageUidAsUser(
+ packageName, UserHandle.getUserId(callingUid));
+ return packageUid == callingUid;
+ } catch (NameNotFoundException e) {
+ Log.d(LOG_TAG, "Calling package not found", e);
+ return false;
+ }
+ });
}
private DevicePolicyConstants loadConstants() {
diff --git a/services/people/java/com/android/server/people/data/AggregateEventHistoryImpl.java b/services/people/java/com/android/server/people/data/AggregateEventHistoryImpl.java
index 4ac346b51b22..6abf6d256caf 100644
--- a/services/people/java/com/android/server/people/data/AggregateEventHistoryImpl.java
+++ b/services/people/java/com/android/server/people/data/AggregateEventHistoryImpl.java
@@ -42,14 +42,16 @@ class AggregateEventHistoryImpl implements EventHistory {
@NonNull
@Override
public EventIndex getEventIndex(Set<Integer> eventTypes) {
- EventIndex merged = new EventIndex();
+ EventIndex merged = null;
for (EventHistory eventHistory : mEventHistoryList) {
EventIndex eventIndex = eventHistory.getEventIndex(eventTypes);
- if (!eventIndex.isEmpty()) {
+ if (merged == null) {
+ merged = eventIndex;
+ } else if (!eventIndex.isEmpty()) {
merged = EventIndex.combine(merged, eventIndex);
}
}
- return merged;
+ return merged != null ? merged : EventIndex.EMPTY;
}
@NonNull
diff --git a/services/people/java/com/android/server/people/data/ConversationStore.java b/services/people/java/com/android/server/people/data/ConversationStore.java
index 2f2a95cb0a6c..8481e5b916a6 100644
--- a/services/people/java/com/android/server/people/data/ConversationStore.java
+++ b/services/people/java/com/android/server/people/data/ConversationStore.java
@@ -198,7 +198,10 @@ class ConversationStore {
mLocusIdToShortcutIdMap.clear();
mNotifChannelIdToShortcutIdMap.clear();
mPhoneNumberToShortcutIdMap.clear();
- mConversationInfosProtoDiskReadWriter.deleteConversationsFile();
+ ConversationInfosProtoDiskReadWriter writer = getConversationInfosProtoDiskReadWriter();
+ if (writer != null) {
+ writer.deleteConversationsFile();
+ }
}
@Nullable
diff --git a/services/people/java/com/android/server/people/data/EventHistoryImpl.java b/services/people/java/com/android/server/people/data/EventHistoryImpl.java
index 85661c622fc2..8b92537a9789 100644
--- a/services/people/java/com/android/server/people/data/EventHistoryImpl.java
+++ b/services/people/java/com/android/server/people/data/EventHistoryImpl.java
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
import android.net.Uri;
+import android.os.FileUtils;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.Slog;
@@ -55,6 +56,7 @@ class EventHistoryImpl implements EventHistory {
private final ScheduledExecutorService mScheduledExecutorService;
private final EventsProtoDiskReadWriter mEventsProtoDiskReadWriter;
private final EventIndexesProtoDiskReadWriter mEventIndexesProtoDiskReadWriter;
+ private final File mRootDir;
// Event Type -> Event Index
@GuardedBy("this")
@@ -77,10 +79,11 @@ class EventHistoryImpl implements EventHistory {
mScheduledExecutorService = scheduledExecutorService;
mLastPruneTime = injector.currentTimeMillis();
- File eventsDir = new File(rootDir, EVENTS_DIR);
+ mRootDir = rootDir;
+ File eventsDir = new File(mRootDir, EVENTS_DIR);
mEventsProtoDiskReadWriter = new EventsProtoDiskReadWriter(eventsDir,
mScheduledExecutorService);
- File indexesDir = new File(rootDir, INDEXES_DIR);
+ File indexesDir = new File(mRootDir, INDEXES_DIR);
mEventIndexesProtoDiskReadWriter = new EventIndexesProtoDiskReadWriter(indexesDir,
scheduledExecutorService);
}
@@ -188,6 +191,7 @@ class EventHistoryImpl implements EventHistory {
mRecentEvents.clear();
mEventsProtoDiskReadWriter.deleteRecentEventsFile();
mEventIndexesProtoDiskReadWriter.deleteIndexesFile();
+ FileUtils.deleteContentsAndDir(mRootDir);
}
/** Deletes the events data that exceeds the retention period. */
diff --git a/services/people/java/com/android/server/people/data/EventIndex.java b/services/people/java/com/android/server/people/data/EventIndex.java
index 47b620773180..6a13b0e6dd6e 100644
--- a/services/people/java/com/android/server/people/data/EventIndex.java
+++ b/services/people/java/com/android/server/people/data/EventIndex.java
@@ -129,8 +129,7 @@ public class EventIndex {
}
EventIndex(@NonNull EventIndex from) {
- this(from.mInjector, Arrays.copyOf(from.mEventBitmaps, TIME_SLOT_TYPES_COUNT),
- from.mLastUpdatedTime);
+ this(from.mInjector, from.mEventBitmaps, from.mLastUpdatedTime);
}
@VisibleForTesting
@@ -140,7 +139,7 @@ public class EventIndex {
private EventIndex(@NonNull Injector injector, long[] eventBitmaps, long lastUpdatedTime) {
mInjector = injector;
- mEventBitmaps = eventBitmaps;
+ mEventBitmaps = Arrays.copyOf(eventBitmaps, TIME_SLOT_TYPES_COUNT);
mLastUpdatedTime = lastUpdatedTime;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java
index e5450a9ca5f2..6e0df3ecfabf 100644
--- a/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java
@@ -343,5 +343,10 @@ public class BlobStoreManagerServiceTest {
public Handler initializeMessageHandler() {
return mHandler;
}
+
+ @Override
+ public Handler getBackgroundHandler() {
+ return mHandler;
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
index c4fea77cf1ba..f35eecf05f32 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
@@ -30,6 +30,7 @@ import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.List;
+import java.util.function.BiConsumer;
@RunWith(AndroidJUnit4.class)
public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceImplTestsBase {
@@ -132,57 +133,115 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
}
@Test
- public void testMutabilityChange() {
+ public void testMutableEnabledToImmutableEnabled() {
final OverlayManagerServiceImpl impl = getImpl();
installTargetPackage(TARGET, USER);
- addOverlayPackage(OVERLAY, TARGET, USER, false, true, 0);
+ final BiConsumer<Boolean, Boolean> setOverlay = (mutable, enabled) -> {
+ addOverlayPackage(OVERLAY, TARGET, USER, mutable, enabled, 0);
+ impl.updateOverlaysForUser(USER);
+ final OverlayInfo o1 = impl.getOverlayInfo(OVERLAY, USER);
+ assertNotNull(o1);
+ assertEquals(enabled, o1.isEnabled());
+ assertEquals(mutable, o1.isMutable);
+ };
+
+ // Immutable/enabled -> mutable/enabled
+ setOverlay.accept(false /* mutable */, true /* enabled */);
+ setOverlay.accept(true /* mutable */, true /* enabled */);
+
+ // Mutable/enabled -> immutable/enabled
+ setOverlay.accept(false /* mutable */, true /* enabled */);
+
+ // Immutable/enabled -> mutable/disabled
+ setOverlay.accept(true /* mutable */, false /* enabled */);
+
+ // Mutable/disabled -> immutable/enabled
+ setOverlay.accept(false /* mutable */, true /* enabled */);
+
+ // Immutable/enabled -> immutable/disabled
+ setOverlay.accept(false /* mutable */, false /* enabled */);
+
+ // Immutable/disabled -> mutable/enabled
+ setOverlay.accept(true /* mutable */, true /* enabled */);
+
+ // Mutable/enabled -> immutable/disabled
+ setOverlay.accept(false /* mutable */, false /* enabled */);
+
+ // Immutable/disabled -> mutable/disabled
+ setOverlay.accept(true /* mutable */, false /* enabled */);
+
+ // Mutable/disabled -> immutable/disabled
+ setOverlay.accept(false /* mutable */, false /* enabled */);
+ }
+
+ @Test
+ public void testMutablePriorityChange() {
+ final OverlayManagerServiceImpl impl = getImpl();
+ installTargetPackage(TARGET, USER);
+ addOverlayPackage(OVERLAY, TARGET, USER, true, true, 0);
+ addOverlayPackage(OVERLAY2, TARGET, USER, true, true, 1);
impl.updateOverlaysForUser(USER);
+
final OverlayInfo o1 = impl.getOverlayInfo(OVERLAY, USER);
assertNotNull(o1);
- assertTrue(o1.isEnabled());
- assertFalse(o1.isMutable);
+ assertEquals(0, o1.priority);
- addOverlayPackage(OVERLAY, TARGET, USER, true, false, 0);
- impl.updateOverlaysForUser(USER);
- final OverlayInfo o2 = impl.getOverlayInfo(OVERLAY, USER);
+ final OverlayInfo o2 = impl.getOverlayInfo(OVERLAY2, USER);
assertNotNull(o2);
- assertFalse(o2.isEnabled());
- assertTrue(o2.isMutable);
+ assertEquals(1, o2.priority);
- addOverlayPackage(OVERLAY, TARGET, USER, false, false, 0);
+ // Overlay priority changing between reboots should not affect enable state of mutable
+ // overlays
+ impl.setEnabled(OVERLAY, true, USER);
+
+ // Reorder the overlays
+ addOverlayPackage(OVERLAY, TARGET, USER, true, true, 1);
+ addOverlayPackage(OVERLAY2, TARGET, USER, true, true, 0);
impl.updateOverlaysForUser(USER);
+
final OverlayInfo o3 = impl.getOverlayInfo(OVERLAY, USER);
assertNotNull(o3);
- assertFalse(o3.isEnabled());
- assertFalse(o3.isMutable);
+ assertEquals(1, o3.priority);
+
+ final OverlayInfo o4 = impl.getOverlayInfo(OVERLAY2, USER);
+ assertNotNull(o4);
+ assertEquals(0, o4.priority);
+ assertTrue(o1.isEnabled());
}
@Test
- public void testPriorityChange() {
+ public void testImmutablePriorityChange() {
final OverlayManagerServiceImpl impl = getImpl();
installTargetPackage(TARGET, USER);
-
addOverlayPackage(OVERLAY, TARGET, USER, false, true, 0);
addOverlayPackage(OVERLAY2, TARGET, USER, false, true, 1);
impl.updateOverlaysForUser(USER);
final OverlayInfo o1 = impl.getOverlayInfo(OVERLAY, USER);
- final OverlayInfo o2 = impl.getOverlayInfo(OVERLAY2, USER);
assertNotNull(o1);
- assertNotNull(o2);
assertEquals(0, o1.priority);
+
+ final OverlayInfo o2 = impl.getOverlayInfo(OVERLAY2, USER);
+ assertNotNull(o2);
assertEquals(1, o2.priority);
+ // Overlay priority changing between reboots should not affect enable state of mutable
+ // overlays
+ impl.setEnabled(OVERLAY, true, USER);
+
+ // Reorder the overlays
addOverlayPackage(OVERLAY, TARGET, USER, false, true, 1);
addOverlayPackage(OVERLAY2, TARGET, USER, false, true, 0);
impl.updateOverlaysForUser(USER);
final OverlayInfo o3 = impl.getOverlayInfo(OVERLAY, USER);
- final OverlayInfo o4 = impl.getOverlayInfo(OVERLAY2, USER);
assertNotNull(o3);
- assertNotNull(o4);
assertEquals(1, o3.priority);
+
+ final OverlayInfo o4 = impl.getOverlayInfo(OVERLAY2, USER);
+ assertNotNull(o4);
assertEquals(0, o4.priority);
+ assertTrue(o1.isEnabled());
}
}
diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
index e57df24d67cb..624b67ccda85 100644
--- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
@@ -335,9 +335,9 @@ public final class DataManagerTest {
throws IntentFilter.MalformedMimeTypeException {
mDataManager.onUserUnlocked(USER_ID_PRIMARY);
AppTarget appTarget = new AppTarget.Builder(
- new AppTargetId(TEST_SHORTCUT_ID),
- TEST_PKG_NAME,
- UserHandle.of(USER_ID_PRIMARY))
+ new AppTargetId(TEST_SHORTCUT_ID),
+ TEST_PKG_NAME,
+ UserHandle.of(USER_ID_PRIMARY))
.setClassName(TEST_CLASS_NAME)
.build();
AppTargetEvent appTargetEvent =
@@ -347,8 +347,7 @@ public final class DataManagerTest {
mDataManager.reportShareTargetEvent(appTargetEvent, intentFilter);
- List<Range<Long>> activeShareTimeSlots = getActiveSlotsForTestShortcut(
- Event.SHARE_EVENT_TYPES);
+ List<Range<Long>> activeShareTimeSlots = getActiveSlotsForAppShares();
assertEquals(1, activeShareTimeSlots.size());
}
@@ -692,8 +691,7 @@ public final class DataManagerTest {
return conversations;
}
- private List<Range<Long>> getActiveSlotsForTestShortcut(
- Set<Integer> eventTypes) {
+ private List<Range<Long>> getActiveSlotsForTestShortcut(Set<Integer> eventTypes) {
List<Range<Long>> activeSlots = new ArrayList<>();
mDataManager.forPackagesInProfile(USER_ID_PRIMARY, packageData ->
activeSlots.addAll(
@@ -703,6 +701,16 @@ public final class DataManagerTest {
return activeSlots;
}
+ private List<Range<Long>> getActiveSlotsForAppShares() {
+ List<Range<Long>> activeSlots = new ArrayList<>();
+ mDataManager.forPackagesInProfile(USER_ID_PRIMARY, packageData ->
+ activeSlots.addAll(
+ packageData.getClassLevelEventHistory(TEST_CLASS_NAME)
+ .getEventIndex(Event.SHARE_EVENT_TYPES)
+ .getActiveTimeSlots()));
+ return activeSlots;
+ }
+
private ShortcutInfo buildShortcutInfo(String packageName, int userId, String id,
@Nullable Person person) {
Context mockContext = mock(Context.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerFake.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelLoggerFake.java
index 551f3977e968..b6ea063ccc14 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLoggerFake.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelLoggerFake.java
@@ -14,16 +14,22 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.notification.logging;
+package com.android.server.notification;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
import java.util.ArrayList;
import java.util.List;
-import nano.Notifications;
+public class NotificationChannelLoggerFake implements NotificationChannelLogger {
+ static class CallRecord {
+ public NotificationChannelEvent event;
+ CallRecord(NotificationChannelEvent event) {
+ this.event = event;
+ }
+ }
-public class NotificationPanelLoggerFake implements NotificationPanelLogger {
private List<CallRecord> mCalls = new ArrayList<>();
List<CallRecord> getCalls() {
@@ -35,18 +41,14 @@ public class NotificationPanelLoggerFake implements NotificationPanelLogger {
}
@Override
- public void logPanelShown(boolean isLockscreen,
- List<NotificationEntry> visibleNotifications) {
- mCalls.add(new CallRecord(isLockscreen,
- NotificationPanelLogger.toNotificationProto(visibleNotifications)));
+ public void logNotificationChannel(NotificationChannelEvent event, NotificationChannel channel,
+ int uid, String pkg, int oldImportance, int newImportance) {
+ mCalls.add(new CallRecord(event));
}
- public static class CallRecord {
- public boolean isDozing;
- public Notifications.NotificationList list;
- CallRecord(boolean isDozing, Notifications.NotificationList list) {
- this.isDozing = isDozing;
- this.list = list;
- }
+ @Override
+ public void logNotificationChannelGroup(NotificationChannelEvent event,
+ NotificationChannelGroup channelGroup, int uid, String pkg, boolean wasBlocked) {
+ mCalls.add(new CallRecord(event));
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
index b7bcbfb05531..7e5469090d82 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
@@ -328,4 +328,26 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase {
verify(nh).removeConversationFromWrite("pkg", "convo");
verify(af, never()).startWrite();
}
+
+ @Test
+ public void testWriteBufferRunnable() throws Exception {
+ NotificationHistory nh = mock(NotificationHistory.class);
+ when(nh.getPooledStringsToWrite()).thenReturn(new String[]{});
+ when(nh.getNotificationsToWrite()).thenReturn(new ArrayList<>());
+ NotificationHistoryDatabase.WriteBufferRunnable wbr =
+ mDataBase.new WriteBufferRunnable();
+
+ mDataBase.mBuffer = nh;
+ wbr.currentTime = 5;
+ wbr.latestNotificationsFile = mock(AtomicFile.class);
+ File file = mock(File.class);
+ when(file.getName()).thenReturn("5");
+ when(wbr.latestNotificationsFile.getBaseFile()).thenReturn(file);
+
+ wbr.run();
+
+ assertThat(mDataBase.mHistoryFiles.size()).isEqualTo(1);
+ assertThat(mDataBase.mBuffer).isNotEqualTo(nh);
+ verify(mAlarmManager, times(1)).setExactAndAllowWhileIdle(anyInt(), anyLong(), any());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java
index f051fa4c2290..1e6270d78275 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java
@@ -60,16 +60,16 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase {
@Test
public void testSmallHash() {
- assertEquals(0, NotificationRecordLogger.NotificationRecordPair.smallHash(0));
- final int maxHash = NotificationRecordLogger.NotificationRecordPair.MAX_HASH;
+ assertEquals(0, NotificationRecordLogger.smallHash(0));
+ final int maxHash = NotificationRecordLogger.MAX_HASH;
assertEquals(0,
- NotificationRecordLogger.NotificationRecordPair.smallHash(maxHash));
+ NotificationRecordLogger.smallHash(maxHash));
assertEquals(0,
- NotificationRecordLogger.NotificationRecordPair.smallHash(17 * maxHash));
+ NotificationRecordLogger.smallHash(17 * maxHash));
assertEquals(maxHash - 1,
- NotificationRecordLogger.NotificationRecordPair.smallHash(maxHash - 1));
+ NotificationRecordLogger.smallHash(maxHash - 1));
assertEquals(maxHash - 1,
- NotificationRecordLogger.NotificationRecordPair.smallHash(-1));
+ NotificationRecordLogger.smallHash(-1));
}
@Test
@@ -78,10 +78,10 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase {
getNotificationRecordPair(0, null).getNotificationIdHash());
assertEquals(1,
getNotificationRecordPair(1, null).getNotificationIdHash());
- assertEquals(NotificationRecordLogger.NotificationRecordPair.MAX_HASH - 1,
+ assertEquals(NotificationRecordLogger.MAX_HASH - 1,
getNotificationRecordPair(-1, null).getNotificationIdHash());
final String tag = "someTag";
- final int hash = NotificationRecordLogger.NotificationRecordPair.smallHash(tag.hashCode());
+ final int hash = NotificationRecordLogger.smallHash(tag.hashCode());
assertEquals(hash, getNotificationRecordPair(0, tag).getNotificationIdHash());
// We xor the tag and hashcode together before compressing the range. The order of
// operations doesn't matter if id is small.
@@ -89,19 +89,19 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase {
getNotificationRecordPair(1, tag).getNotificationIdHash());
// But it does matter for an id with more 1 bits than fit in the small hash.
assertEquals(
- NotificationRecordLogger.NotificationRecordPair.smallHash(-1 ^ tag.hashCode()),
+ NotificationRecordLogger.smallHash(-1 ^ tag.hashCode()),
getNotificationRecordPair(-1, tag).getNotificationIdHash());
assertNotEquals(-1 ^ hash,
- NotificationRecordLogger.NotificationRecordPair.smallHash(-1 ^ tag.hashCode()));
+ NotificationRecordLogger.smallHash(-1 ^ tag.hashCode()));
}
@Test
public void testGetChannelIdHash() {
assertEquals(
- NotificationRecordLogger.NotificationRecordPair.smallHash(CHANNEL_ID.hashCode()),
+ NotificationRecordLogger.smallHash(CHANNEL_ID.hashCode()),
getNotificationRecordPair(0, null).getChannelIdHash());
assertNotEquals(
- NotificationRecordLogger.NotificationRecordPair.smallHash(CHANNEL_ID.hashCode()),
+ NotificationRecordLogger.smallHash(CHANNEL_ID.hashCode()),
CHANNEL_ID.hashCode());
}
@@ -113,7 +113,7 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase {
final String group = "someGroup";
p.r.setOverrideGroupKey(group);
assertEquals(
- NotificationRecordLogger.NotificationRecordPair.smallHash(group.hashCode()),
+ NotificationRecordLogger.smallHash(group.hashCode()),
p.getGroupIdHash());
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 58299614efe8..af605112307f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -134,6 +134,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
private PreferencesHelper mHelper;
private AudioAttributes mAudioAttributes;
+ private NotificationChannelLoggerFake mLogger = new NotificationChannelLoggerFake();
@Before
public void setUp() throws Exception {
@@ -183,7 +184,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
resetZenModeHelper();
mAudioAttributes = new AudioAttributes.Builder()
@@ -1107,6 +1108,22 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
+ public void testDoubleDeleteChannel() throws Exception {
+ NotificationChannel channel = getChannel();
+ mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false);
+ mHelper.deleteNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId());
+ mHelper.deleteNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId());
+ assertEquals(2, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED,
+ mLogger.get(0).event);
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_DELETED,
+ mLogger.get(1).event);
+ // No log for the second delete of the same channel.
+ }
+
+ @Test
public void testGetDeletedChannel() throws Exception {
NotificationChannel channel = getChannel();
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
@@ -1444,7 +1461,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
@@ -1455,7 +1472,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// start notification policy off with mAreChannelsBypassingDnd = false
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
resetZenModeHelper();
@@ -1525,6 +1542,11 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// Old settings not overridden
compareChannels(channel,
mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, newChannel.getId(), false));
+
+ assertEquals(1, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED,
+ mLogger.get(0).event);
}
@Test
@@ -1594,6 +1616,16 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(1, mHelper.getNotificationChannelGroups(PKG_N_MR1, UID_N_MR1).size());
verify(mHandler, never()).requestSort();
+
+ assertEquals(7, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_GROUP_DELETED,
+ mLogger.get(5).event); // Next-to-last log is the deletion of the channel group.
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_DELETED,
+ mLogger.get(6).event); // Final log is the deletion of the channel.
}
@Test
@@ -1739,6 +1771,11 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(ncg,
mHelper.getNotificationChannelGroups(PKG_N_MR1, UID_N_MR1).iterator().next());
verify(mHandler, never()).requestSort();
+ assertEquals(1, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_GROUP_CREATED,
+ mLogger.get(0).event);
}
@Test
@@ -1751,6 +1788,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
fail("Created a channel with a bad group");
} catch (IllegalArgumentException e) {
}
+ assertEquals(0, mLogger.getCalls().size());
}
@Test
@@ -1905,6 +1943,17 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
verify(mHandler, times(1)).requestSort();
+ assertEquals(3, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_GROUP_CREATED,
+ mLogger.get(0).event);
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED,
+ mLogger.get(1).event);
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_UPDATED,
+ mLogger.get(2).event);
}
@Test
@@ -2189,7 +2238,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ "</package>\n"
+ "</ranking>\n";
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadByteArrayXml(preQXml.getBytes(), true, UserHandle.USER_SYSTEM);
assertEquals(PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
@@ -2201,7 +2250,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertEquals(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
@@ -2297,7 +2346,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_UNSPECIFIED);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2308,7 +2357,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertEquals("other", mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2320,7 +2369,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.revokeNotificationDelegate(PKG_O, UID_O);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2332,7 +2381,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.toggleNotificationDelegate(PKG_O, UID_O, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
// appears disabled
@@ -2350,7 +2399,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.revokeNotificationDelegate(PKG_O, UID_O);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
// appears disabled
@@ -2368,7 +2417,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
@@ -2383,7 +2432,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.getAppLockedFields(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
loadStreamXml(baos, false, UserHandle.USER_ALL);
assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
@@ -2876,7 +2925,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
public void testPlaceholderConversationId_flagOn() throws Exception {
Settings.Global.putString(
mContext.getContentResolver(), NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "true");
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
final String xml = "<ranking version=\"1\">\n"
+ "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2896,7 +2945,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
public void testPlaceholderConversationId_flagOff() throws Exception {
Settings.Global.putString(
mContext.getContentResolver(), NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "false");
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
final String xml = "<ranking version=\"1\">\n"
+ "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2916,7 +2965,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
public void testNormalConversationId_flagOff() throws Exception {
Settings.Global.putString(
mContext.getContentResolver(), NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "false");
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
final String xml = "<ranking version=\"1\">\n"
+ "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2936,7 +2985,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
public void testNoConversationId_flagOff() throws Exception {
Settings.Global.putString(
mContext.getContentResolver(), NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "false");
- mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
final String xml = "<ranking version=\"1\">\n"
+ "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -3171,5 +3220,33 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(channel, mHelper.getNotificationChannel(PKG_O, UID_O, channel.getId(), true));
assertEquals(channel2,
mHelper.getNotificationChannel(PKG_O, UID_O, channel2.getId(), true));
+
+ assertEquals(7, mLogger.getCalls().size());
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED,
+ mLogger.get(0).event); // Channel messages
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_CREATED,
+ mLogger.get(1).event); // Channel calls
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_CONVERSATION_CREATED,
+ mLogger.get(2).event); // Channel channel - Conversation A person msgs
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_CONVERSATION_CREATED,
+ mLogger.get(3).event); // Channel noMatch - Conversation B person msgs
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_CONVERSATION_CREATED,
+ mLogger.get(4).event); // Channel channel2 - Conversation A person calls
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_CONVERSATION_DELETED,
+ mLogger.get(5).event); // Delete Channel channel - Conversation A person msgs
+ assertEquals(
+ NotificationChannelLogger.NotificationChannelEvent
+ .NOTIFICATION_CHANNEL_CONVERSATION_DELETED,
+ mLogger.get(6).event); // Delete Channel channel2 - Conversation A person calls
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
index 5c36f5c39e0c..406affc27b0a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -28,14 +28,12 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_TOP;
@@ -51,6 +49,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -95,20 +94,24 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Mock RecentsAnimationController.RecentsAnimationCallbacks mAnimationCallbacks;
@Mock TaskSnapshot mMockTaskSnapshot;
private RecentsAnimationController mController;
+ private DisplayContent mDefaultDisplay;
+ private ActivityStack mRootHomeTask;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
doNothing().when(mWm.mRoot).performSurfacePlacement(anyBoolean());
- doReturn(mDisplayContent).when(mWm.mRoot).getDisplayContent(anyInt());
when(mMockRunner.asBinder()).thenReturn(new Binder());
+ mDefaultDisplay = mWm.mRoot.getDefaultDisplay();
mController = spy(new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks,
DEFAULT_DISPLAY));
+ mRootHomeTask = mDefaultDisplay.getRootHomeTask();
+ assertNotNull(mRootHomeTask);
}
@Test
public void testRemovedBeforeStarted_expectCanceled() throws Exception {
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
AnimationAdapter adapter = mController.addAnimation(activity.getTask(),
false /* isRecentTaskInvisible */);
@@ -128,7 +131,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testCancelAfterRemove_expectIgnored() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
AnimationAdapter adapter = mController.addAnimation(activity.getTask(),
false /* isRecentTaskInvisible */);
@@ -149,20 +152,14 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testIncludedApps_expectTargetAndVisible() {
mWm.setRecentsAnimationController(mController);
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeActivity =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord homeActivity = createHomeActivity();
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord hiddenActivity = createActivityRecord(mDisplayContent,
+ final ActivityRecord hiddenActivity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
hiddenActivity.setVisible(false);
- mDisplayContent.getConfiguration().windowConfiguration.setRotation(
- mDisplayContent.getRotation());
+ mDefaultDisplay.getConfiguration().windowConfiguration.setRotation(
+ mDefaultDisplay.getRotation());
mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
// Ensure that we are animating the target activity as well
@@ -174,53 +171,41 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testWallpaperIncluded_expectTarget() throws Exception {
mWm.setRecentsAnimationController(mController);
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeAppWindow =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
- final ActivityRecord appWindow = createActivityRecord(mDisplayContent,
+ final ActivityRecord homeActivity = createHomeActivity();
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, appWindow, "win1");
- appWindow.addWindow(win1);
+ final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
+ activity.addWindow(win1);
final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
- mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
- spyOn(mDisplayContent.mWallpaperController);
- doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
+ mock(IBinder.class), true, mDefaultDisplay, true /* ownerCanManageAppTokens */);
+ spyOn(mDefaultDisplay.mWallpaperController);
+ doReturn(true).when(mDefaultDisplay.mWallpaperController).isWallpaperVisible();
- mDisplayContent.getConfiguration().windowConfiguration.setRotation(
- mDisplayContent.getRotation());
- mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeAppWindow);
+ mDefaultDisplay.getConfiguration().windowConfiguration.setRotation(
+ mDefaultDisplay.getRotation());
+ mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
mController.startAnimation();
// Ensure that we are animating the app and wallpaper target
- assertTrue(mController.isAnimatingTask(appWindow.getTask()));
+ assertTrue(mController.isAnimatingTask(activity.getTask()));
assertTrue(mController.isAnimatingWallpaper(wallpaperWindowToken));
}
@Test
public void testWallpaperAnimatorCanceled_expectAnimationKeepsRunning() throws Exception {
mWm.setRecentsAnimationController(mController);
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeActivity =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord homeActivity = createHomeActivity();
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
- mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
- spyOn(mDisplayContent.mWallpaperController);
- doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
+ mock(IBinder.class), true, mDefaultDisplay, true /* ownerCanManageAppTokens */);
+ spyOn(mDefaultDisplay.mWallpaperController);
+ doReturn(true).when(mDefaultDisplay.mWallpaperController).isWallpaperVisible();
- mDisplayContent.getConfiguration().windowConfiguration.setRotation(
- mDisplayContent.getRotation());
+ mDefaultDisplay.getConfiguration().windowConfiguration.setRotation(
+ mDefaultDisplay.getRotation());
mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
mController.startAnimation();
@@ -234,29 +219,27 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testFinish_expectTargetAndWallpaperAdaptersRemoved() {
mWm.setRecentsAnimationController(mController);
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeActivity =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
+ final ActivityRecord homeActivity = createHomeActivity();
final WindowState hwin1 = createWindow(null, TYPE_BASE_APPLICATION, homeActivity, "hwin1");
homeActivity.addWindow(hwin1);
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
- mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
- spyOn(mDisplayContent.mWallpaperController);
- doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
+ mock(IBinder.class), true, mDefaultDisplay, true /* ownerCanManageAppTokens */);
+ spyOn(mDefaultDisplay.mWallpaperController);
+ doReturn(true).when(mDefaultDisplay.mWallpaperController).isWallpaperVisible();
// Start and finish the animation
mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
mController.startAnimation();
+
+ assertTrue(mController.isAnimatingTask(homeActivity.getTask()));
+ assertTrue(mController.isAnimatingTask(activity.getTask()));
+
// Reset at this point since we may remove adapters that couldn't be created
- reset(mController);
+ clearInvocations(mController);
mController.cleanupAnimation(REORDER_MOVE_TO_TOP);
// Ensure that we remove the task (home & app) and wallpaper adapters
@@ -267,7 +250,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testDeferCancelAnimation() throws Exception {
mWm.setRecentsAnimationController(mController);
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
@@ -290,7 +273,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testDeferCancelAnimationWithScreenShot() throws Exception {
mWm.setRecentsAnimationController(mController);
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
@@ -322,7 +305,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testShouldAnimateWhenNoCancelWithDeferredScreenshot() {
mWm.setRecentsAnimationController(mController);
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
@@ -343,19 +326,10 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
mWm.mIsFixedRotationTransformEnabled = true;
mWm.setRecentsAnimationController(mController);
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeAppWindow =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
- final ActivityRecord appWindow = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final WindowState win0 = createWindow(null, TYPE_BASE_APPLICATION, appWindow, "win1");
- appWindow.addWindow(win0);
+ final ActivityRecord homeActivity = createHomeActivity();
+ homeActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- final ActivityRecord landActivity = createActivityRecord(mDisplayContent,
+ final ActivityRecord landActivity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
landActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, landActivity, "win1");
@@ -367,13 +341,13 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
// Ensure that the display is in Landscape
landActivity.onDescendantOrientationChanged(landActivity.token, landActivity);
assertEquals(Configuration.ORIENTATION_LANDSCAPE,
- mDisplayContent.getConfiguration().orientation);
+ mDefaultDisplay.getConfiguration().orientation);
- mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeAppWindow);
+ mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
// Check that the home app is in portrait
assertEquals(Configuration.ORIENTATION_PORTRAIT,
- homeAppWindow.getConfiguration().orientation);
+ homeActivity.getConfiguration().orientation);
}
@Test
@@ -381,16 +355,8 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
mWm.mIsFixedRotationTransformEnabled = true;
mWm.setRecentsAnimationController(mController);
- // Create a portrait home stack, a wallpaper and a landscape application displayed on top.
-
- // Home stack
- final ActivityStack homeStack = mDisplayContent.getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
- final ActivityRecord homeActivity =
- new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(homeStack)
- .setCreateTask(true)
- .build();
+ // Create a portrait home activity, a wallpaper and a landscape activity displayed on top.
+ final ActivityRecord homeActivity = createHomeActivity();
homeActivity.setOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
final WindowState homeWindow = createWindow(null, TYPE_BASE_APPLICATION, homeActivity,
@@ -399,7 +365,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
homeWindow.getAttrs().flags |= FLAG_SHOW_WALLPAPER;
// Landscape application
- final ActivityRecord activity = createActivityRecord(mDisplayContent,
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
final WindowState applicationWindow = createWindow(null, TYPE_BASE_APPLICATION, activity,
"applicationWindow");
@@ -408,28 +374,26 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
// Wallpaper
final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
- mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
+ mock(IBinder.class), true, mDefaultDisplay, true /* ownerCanManageAppTokens */);
final WindowState wallpaperWindow = createWindow(null, TYPE_WALLPAPER, wallpaperWindowToken,
"wallpaperWindow");
// Make sure the landscape activity is on top and the display is in landscape
activity.moveFocusableActivityToTop("test");
- mDisplayContent.getConfiguration().windowConfiguration.setRotation(
- mDisplayContent.getRotation());
+ mDefaultDisplay.getConfiguration().windowConfiguration.setRotation(
+ mDefaultDisplay.getRotation());
-
- spyOn(mDisplayContent.mWallpaperController);
- doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
+ spyOn(mDefaultDisplay.mWallpaperController);
+ doReturn(true).when(mDefaultDisplay.mWallpaperController).isWallpaperVisible();
// Start the recents animation
- mController
- .initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
+ mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray(), homeActivity);
- mDisplayContent.mWallpaperController.adjustWallpaperWindows();
+ mDefaultDisplay.mWallpaperController.adjustWallpaperWindows();
// Check preconditions
ArrayList<WallpaperWindowToken> wallpapers = new ArrayList<>(1);
- mDisplayContent.forAllWallpaperWindows(wallpapers::add);
+ mDefaultDisplay.forAllWallpaperWindows(wallpapers::add);
Truth.assertThat(wallpapers).hasSize(1);
Truth.assertThat(wallpapers.get(0).getTopChild()).isEqualTo(wallpaperWindow);
@@ -437,6 +401,25 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
// Actual check
assertEquals(Configuration.ORIENTATION_PORTRAIT,
wallpapers.get(0).getConfiguration().orientation);
+
+ // Wallpaper's transform state is controlled by home, so the invocation should be no-op.
+ wallpaperWindowToken.clearFixedRotationTransform();
+ assertTrue(wallpaperWindowToken.hasFixedRotationTransform());
+
+ // Wallpaper's transform state should be cleared with home.
+ homeActivity.clearFixedRotationTransform();
+ assertFalse(wallpaperWindowToken.hasFixedRotationTransform());
+ }
+
+ private ActivityRecord createHomeActivity() {
+ final ActivityRecord homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
+ .setStack(mRootHomeTask)
+ .setCreateTask(true)
+ .build();
+ // Avoid {@link RecentsAnimationController.TaskAnimationAdapter#createRemoteAnimationTarget}
+ // returning null when calling {@link RecentsAnimationController#createAppAnimations}.
+ homeActivity.setVisibility(true);
+ return homeActivity;
}
private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) {
diff --git a/startop/scripts/iorap/analyze_prefetch_file.py b/startop/scripts/iorap/analyze_prefetch_file.py
new file mode 100755
index 000000000000..343cd54b7174
--- /dev/null
+++ b/startop/scripts/iorap/analyze_prefetch_file.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+#
+# Copyright 2020, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import argparse
+import os
+import sys
+from typing import Dict, List, NamedTuple, Tuple
+
+DIR = os.path.abspath(os.path.dirname(__file__))
+sys.path.append(os.path.dirname(DIR)) # framework/base/startop/script
+import lib.print_utils as print_utils
+
+# Include generated protos.
+dir_name = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(dir_name + "/generated")
+
+from TraceFile_pb2 import *
+
+def parse_options(argv: List[str] = None):
+ """Parses command line arguments and returns an argparse Namespace object."""
+ parser = argparse.ArgumentParser(description="Analyze compiled_trace iorap protos.")
+ required_named = parser.add_argument_group('required named arguments')
+
+ required_named.add_argument('-i', dest='input', metavar='FILE',
+ help='Read protobuf file as input')
+
+ optional_named = parser.add_argument_group('optional named arguments')
+
+ optional_named.add_argument('-up', dest='upper_percent', type=float,
+ default=95.0,
+ help='Only show the top-most entries up to this value.')
+
+ optional_named.add_argument('-r', dest='raw', action='store_true',
+ help='Output entire raw file.')
+ optional_named.add_argument('-o', dest='output',
+ help='The results are stored into the output file')
+ optional_named.add_argument('-d', dest='debug', action='store_true'
+ , help='Activity of the app to be compiled')
+
+ return parser.parse_args(argv)
+
+def open_iorap_prefetch_file(file_path: str) -> TraceFile:
+ with open(file_path, "rb") as f:
+ tf = TraceFile()
+ tf.ParseFromString(f.read())
+ return tf
+
+def print_stats_summary(trace_file: TraceFile, upper_percent):
+ tf_dict = convert_to_dict(trace_file)
+ print_utils.debug_print(tf_dict)
+
+ total_length = 0
+ summaries = []
+ for name, entries_list in tf_dict.items():
+ summary = entries_sum(entries_list)
+ summaries.append(summary)
+
+ total_length += summary.length
+
+ # Sort by length
+ summaries.sort(reverse=True, key=lambda s: s.length)
+
+ percent_sum = 0.0
+ skipped_entries = 0
+
+ print("===========================================")
+ print("Total length: {:,} bytes".format(total_length))
+ print("Displayed upper percent: {:0.2f}%".format(upper_percent))
+ print("===========================================")
+ print("")
+ print("name,length,percent_of_total,upper_percent")
+ for sum in summaries:
+ percent_of_total = (sum.length * 1.0) / (total_length * 1.0) * 100.0
+
+ percent_sum += percent_of_total
+
+ if percent_sum > upper_percent:
+ skipped_entries = skipped_entries + 1
+ continue
+
+ #print("%s,%d,%.2f%%" %(sum.name, sum.length, percent_of_total))
+ print("{:s},{:d},{:0.2f}%,{:0.2f}%".format(sum.name, sum.length, percent_of_total, percent_sum))
+
+ if skipped_entries > 0:
+ print("[WARNING] Skipped {:d} entries, use -up=100 to show everything".format(skipped_entries))
+
+ pass
+
+class FileEntry(NamedTuple):
+ id: int
+ name: str
+ offset: int
+ length: int
+
+class FileEntrySummary(NamedTuple):
+ name: str
+ length: int
+
+def entries_sum(entries: List[FileEntry]) -> FileEntrySummary:
+ if not entries:
+ return None
+
+ summary = FileEntrySummary(name=entries[0].name, length=0)
+ for entry in entries:
+ summary = FileEntrySummary(summary.name, summary.length + entry.length)
+
+ return summary
+
+def convert_to_dict(trace_file: TraceFile) -> Dict[str, FileEntry]:
+ trace_file_index = trace_file.index
+
+ # entries.id -> entry.file_name
+ entries_map = {}
+
+ index_entries = trace_file_index.entries
+ for entry in index_entries:
+ entries_map[entry.id] = entry.file_name
+
+ final_map = {}
+
+ file_entries_map = {}
+ file_entries = trace_file.list.entries
+ for entry in file_entries:
+ print_utils.debug_print(entry)
+
+ lst = file_entries_map.get(entry.index_id, [])
+ file_entries_map[entry.index_id] = lst
+
+ file_name = entries_map[entry.index_id]
+ file_entry = \
+ FileEntry(id=entry.index_id, name=file_name, offset=entry.file_offset, length=entry.file_length)
+
+ lst.append(file_entry)
+
+ final_map[file_name] = lst
+
+ return final_map
+
+def main(argv: List[str]) -> int:
+ opts = parse_options(argv[1:])
+ if opts.debug:
+ print_utils.DEBUG = opts.debug
+ print_utils.debug_print(opts)
+
+ prefetch_file = open_iorap_prefetch_file(opts.input)
+
+ if opts.raw:
+ print(prefetch_file)
+
+ print_stats_summary(prefetch_file, opts.upper_percent)
+
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index c5fcf67c9be9..ead90bb4561f 100755
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -2075,6 +2075,17 @@ public final class Call {
/**
* Returns the child {@link Call} in a generic conference that is currently active.
+ *
+ * A "generic conference" is the mechanism used to support two simultaneous calls on a device
+ * in CDMA networks. It is effectively equivalent to having one call active and one call on hold
+ * in GSM or IMS calls. This method returns the currently active call.
+ *
+ * In a generic conference, the network exposes the conference to us as a single call, and we
+ * switch between talking to the two participants using a CDMA flash command. Since the network
+ * exposes no additional information about the call, the only way we know which caller we're
+ * currently talking to is by keeping track of the flash commands that we've sent to the
+ * network.
+ *
* For calls that are not generic conferences, or when the generic conference has more than
* 2 children, returns {@code null}.
* @see Details#PROPERTY_GENERIC_CONFERENCE
diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
index e97cfaf0afa6..d9ae48f6b833 100644
--- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
@@ -22,21 +22,21 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.os.SystemConfigManager;
import android.os.UserHandle;
import android.permission.PermissionManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.util.ArrayUtils;
-import com.android.server.SystemConfig;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Utilities for handling carrier applications.
@@ -53,19 +53,19 @@ public final class CarrierAppUtils {
* Handle preinstalled carrier apps which should be disabled until a matching SIM is inserted.
*
* Evaluates the list of applications in
- * {@link SystemConfig#getDisabledUntilUsedPreinstalledCarrierApps()}. We want to disable each
- * such application which is present on the system image until the user inserts a SIM which
- * causes that application to gain carrier privilege (indicating a "match"), without interfering
- * with the user if they opt to enable/disable the app explicitly.
+ * {@link SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierApps()}. We want to disable
+ * each such application which is present on the system image until the user inserts a SIM
+ * which causes that application to gain carrier privilege (indicating a "match"), without
+ * interfering with the user if they opt to enable/disable the app explicitly.
*
* So, for each such app, we either disable until used IFF the app is not carrier privileged AND
* in the default state (e.g. not explicitly DISABLED/DISABLED_BY_USER/ENABLED), or we enable if
* the app is carrier privileged and in either the default state or DISABLED_UNTIL_USED.
*
* In addition, there is a list of carrier-associated applications in
- * {@link SystemConfig#getDisabledUntilUsedPreinstalledCarrierAssociatedApps}. Each app in this
- * list is associated with a carrier app. When the given carrier app is enabled/disabled per the
- * above, the associated applications are enabled/disabled to match.
+ * {@link SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierAssociatedApps}. Each app
+ * in this list is associated with a carrier app. When the given carrier app is enabled/disabled
+ * per the above, the associated applications are enabled/disabled to match.
*
* When enabling a carrier app we also grant it default permissions.
*
@@ -78,10 +78,10 @@ public final class CarrierAppUtils {
if (DEBUG) {
Log.d(TAG, "disableCarrierAppsUntilPrivileged");
}
- SystemConfig config = SystemConfig.getInstance();
- ArraySet<String> systemCarrierAppsDisabledUntilUsed =
+ SystemConfigManager config = context.getSystemService(SystemConfigManager.class);
+ Set<String> systemCarrierAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierApps();
- ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
+ Map<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
ContentResolver contentResolver = getContentResolverForUser(context, userId);
disableCarrierAppsUntilPrivileged(callingPackage, telephonyManager, contentResolver,
@@ -105,11 +105,11 @@ public final class CarrierAppUtils {
if (DEBUG) {
Log.d(TAG, "disableCarrierAppsUntilPrivileged");
}
- SystemConfig config = SystemConfig.getInstance();
- ArraySet<String> systemCarrierAppsDisabledUntilUsed =
+ SystemConfigManager config = context.getSystemService(SystemConfigManager.class);
+ Set<String> systemCarrierAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierApps();
- ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
+ Map<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
ContentResolver contentResolver = getContentResolverForUser(context, userId);
disableCarrierAppsUntilPrivileged(callingPackage, null /* telephonyManager */,
@@ -139,8 +139,8 @@ public final class CarrierAppUtils {
@VisibleForTesting
public static void disableCarrierAppsUntilPrivileged(String callingPackage,
@Nullable TelephonyManager telephonyManager, ContentResolver contentResolver,
- int userId, ArraySet<String> systemCarrierAppsDisabledUntilUsed,
- ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed,
+ int userId, Set<String> systemCarrierAppsDisabledUntilUsed,
+ Map<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed,
Context context) {
PackageManager packageManager = context.getPackageManager();
PermissionManager permissionManager =
@@ -340,26 +340,22 @@ public final class CarrierAppUtils {
*/
public static List<ApplicationInfo> getDefaultCarrierAppCandidates(
int userId, Context context) {
- ArraySet<String> systemCarrierAppsDisabledUntilUsed =
- SystemConfig.getInstance().getDisabledUntilUsedPreinstalledCarrierApps();
+ Set<String> systemCarrierAppsDisabledUntilUsed =
+ context.getSystemService(SystemConfigManager.class)
+ .getDisabledUntilUsedPreinstalledCarrierApps();
return getDefaultCarrierAppCandidatesHelper(userId, systemCarrierAppsDisabledUntilUsed,
context);
}
private static List<ApplicationInfo> getDefaultCarrierAppCandidatesHelper(
- int userId, ArraySet<String> systemCarrierAppsDisabledUntilUsed, Context context) {
- if (systemCarrierAppsDisabledUntilUsed == null) {
+ int userId, Set<String> systemCarrierAppsDisabledUntilUsed, Context context) {
+ if (systemCarrierAppsDisabledUntilUsed == null
+ || systemCarrierAppsDisabledUntilUsed.isEmpty()) {
return null;
}
- int size = systemCarrierAppsDisabledUntilUsed.size();
- if (size == 0) {
- return null;
- }
-
- List<ApplicationInfo> apps = new ArrayList<>(size);
- for (int i = 0; i < size; i++) {
- String packageName = systemCarrierAppsDisabledUntilUsed.valueAt(i);
+ List<ApplicationInfo> apps = new ArrayList<>(systemCarrierAppsDisabledUntilUsed.size());
+ for (String packageName : systemCarrierAppsDisabledUntilUsed) {
ApplicationInfo ai =
getApplicationInfoIfSystemApp(userId, packageName, context);
if (ai != null) {
@@ -370,14 +366,14 @@ public final class CarrierAppUtils {
}
private static Map<String, List<ApplicationInfo>> getDefaultCarrierAssociatedAppsHelper(
- int userId, ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed,
+ int userId, Map<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed,
Context context) {
int size = systemCarrierAssociatedAppsDisabledUntilUsed.size();
Map<String, List<ApplicationInfo>> associatedApps = new ArrayMap<>(size);
- for (int i = 0; i < size; i++) {
- String carrierAppPackage = systemCarrierAssociatedAppsDisabledUntilUsed.keyAt(i);
- List<String> associatedAppPackages =
- systemCarrierAssociatedAppsDisabledUntilUsed.valueAt(i);
+ for (Map.Entry<String, List<String>> entry
+ : systemCarrierAssociatedAppsDisabledUntilUsed.entrySet()) {
+ String carrierAppPackage = entry.getKey();
+ List<String> associatedAppPackages = entry.getValue();
for (int j = 0; j < associatedAppPackages.size(); j++) {
ApplicationInfo ai =
getApplicationInfoIfSystemApp(
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 6a40487f44eb..f4aed6d64402 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -3032,6 +3032,13 @@ public class CarrierConfigManager {
"ascii_7_bit_support_for_long_message_bool";
/**
+ * Controls whether to show wifi calling icon in statusbar when wifi calling is available.
+ * @hide
+ */
+ public static final String KEY_SHOW_WIFI_CALLING_ICON_IN_STATUS_BAR_BOOL =
+ "show_wifi_calling_icon_in_status_bar_bool";
+
+ /**
* Controls RSRP threshold at which OpportunisticNetworkService will decide whether
* the opportunistic network is good enough for internet data.
*/
@@ -3457,7 +3464,7 @@ public class CarrierConfigManager {
* @hide
*/
public static final String KEY_DATA_SWITCH_VALIDATION_MIN_GAP_LONG =
- "data_switch_validation_min_gap_LONG";
+ "data_switch_validation_min_gap_long";
/**
* A boolean property indicating whether this subscription should be managed as an opportunistic
@@ -3484,14 +3491,14 @@ public class CarrierConfigManager {
/**
* Delay in milliseconds to turn off wifi when IMS is registered over wifi.
*/
- public static final String KEY_WIFI_OFF_DEFERRING_TIME_INT =
- KEY_PREFIX + "wifi_off_deferring_time_int";
+ public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT =
+ KEY_PREFIX + "wifi_off_deferring_time_millis_int";
private Ims() {}
private static PersistableBundle getDefaults() {
PersistableBundle defaults = new PersistableBundle();
- defaults.putInt(KEY_WIFI_OFF_DEFERRING_TIME_INT, 0);
+ defaults.putInt(KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT, 0);
return defaults;
}
}
@@ -3740,7 +3747,7 @@ public class CarrierConfigManager {
sDefaults.putInt(KEY_IMS_DTMF_TONE_DELAY_INT, 0);
sDefaults.putInt(KEY_CDMA_DTMF_TONE_DELAY_INT, 100);
sDefaults.putBoolean(KEY_CALL_FORWARDING_MAP_NON_NUMBER_TO_VOICEMAIL_BOOL, false);
- sDefaults.putBoolean(KEY_IGNORE_RTT_MODE_SETTING_BOOL, false);
+ sDefaults.putBoolean(KEY_IGNORE_RTT_MODE_SETTING_BOOL, true);
sDefaults.putInt(KEY_CDMA_3WAYCALL_FLASH_DELAY_INT , 0);
sDefaults.putBoolean(KEY_SUPPORT_ADHOC_CONFERENCE_CALLS_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_ADD_CONFERENCE_PARTICIPANTS_BOOL, false);
@@ -4022,6 +4029,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, false);
sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_SUB6_BOOL, false);
sDefaults.putBoolean(KEY_ASCII_7_BIT_SUPPORT_FOR_LONG_MESSAGE_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_WIFI_CALLING_ICON_IN_STATUS_BAR_BOOL, false);
/* Default value is minimum RSRP level needed for SIGNAL_STRENGTH_GOOD */
sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT, -108);
/* Default value is minimum RSRP level needed for SIGNAL_STRENGTH_MODERATE */
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index e957f3e3d70f..08614b95d7b0 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -2022,11 +2022,11 @@ public class ServiceState implements Parcelable {
/**
* The current registered raw data network operator name in long alphanumeric format.
*
+ * The long format can be up to 16 characters long.
+ *
* @return long raw name of operator, null if unregistered or unknown
- * @hide
*/
@Nullable
- @SystemApi
public String getOperatorAlphaLongRaw() {
return mOperatorAlphaLongRaw;
}
@@ -2041,11 +2041,11 @@ public class ServiceState implements Parcelable {
/**
* The current registered raw data network operator name in short alphanumeric format.
*
+ * The short format can be up to 8 characters long.
+ *
* @return short raw name of operator, null if unregistered or unknown
- * @hide
*/
@Nullable
- @SystemApi
public String getOperatorAlphaShortRaw() {
return mOperatorAlphaShortRaw;
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 00fd99c392f1..67a2604ba9c7 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1057,7 +1057,7 @@ public class TelephonyManager {
* or that all steps during multi-SIM change are done. To know those information you still need
* to listen to SIM_STATE changes or active subscription changes.
*
- * See extra of {@link #EXTRA_NUM_OF_ACTIVE_SIM_SUPPORTED} for updated value.
+ * See extra of {@link #EXTRA_ACTIVE_SIM_SUPPORTED_COUNT} for updated value.
*/
public static final String ACTION_MULTI_SIM_CONFIG_CHANGED =
"android.telephony.action.MULTI_SIM_CONFIG_CHANGED";
@@ -1067,6 +1067,8 @@ public class TelephonyManager {
* The number of active SIM supported by current multi-SIM config. It's not related to how many
* SIM/subscriptions are currently active.
*
+ * Same value will be returned by {@link #getActiveModemCount()}.
+ *
* For single SIM mode, it's 1.
* For DSDS or DSDA mode, it's 2.
* For triple-SIM mode, it's 3.
@@ -1075,8 +1077,8 @@ public class TelephonyManager {
*
* type: integer
*/
- public static final String EXTRA_NUM_OF_ACTIVE_SIM_SUPPORTED =
- "android.telephony.extra.NUM_OF_ACTIVE_SIM_SUPPORTED";
+ public static final String EXTRA_ACTIVE_SIM_SUPPORTED_COUNT =
+ "android.telephony.extra.ACTIVE_SIM_SUPPORTED_COUNT";
/**
* @hide
@@ -12599,14 +12601,32 @@ public class TelephonyManager {
@TestApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers,
- @Nullable @CallbackExecutor Executor executor,
- @Nullable Consumer<Boolean> callback) {
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull Consumer<Boolean> callback) {
Objects.requireNonNull(specifiers, "Specifiers must not be null.");
- if (callback != null) {
- Objects.requireNonNull(executor, "Executor must not be null when"
- + " the callback is nonnull");
- }
+ Objects.requireNonNull(executor, "Executor must not be null.");
+ Objects.requireNonNull(callback, "Callback must not be null.");
+ setSystemSelectionChannelsInternal(specifiers, executor, callback);
+ }
+ /**
+ * Same as {@link #setSystemSelectionChannels(List, Executor, Consumer<Boolean>)}, but to be
+ * used when the caller does not need feedback on the results of the operation.
+ * @param specifiers which bands to scan.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers) {
+ Objects.requireNonNull(specifiers, "Specifiers must not be null.");
+ setSystemSelectionChannelsInternal(specifiers, null, null);
+ }
+
+
+ private void setSystemSelectionChannelsInternal(@NonNull List<RadioAccessSpecifier> specifiers,
+ @Nullable @CallbackExecutor Executor executor,
+ @Nullable Consumer<Boolean> callback) {
IBooleanConsumer aidlConsumer = callback == null ? null : new IBooleanConsumer.Stub() {
@Override
public void accept(boolean result) {
diff --git a/tests/AppResourcesLoaders/Android.bp b/tests/AppResourcesLoaders/Android.bp
new file mode 100644
index 000000000000..e5739dbf181c
--- /dev/null
+++ b/tests/AppResourcesLoaders/Android.bp
@@ -0,0 +1,22 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+android_test {
+ name: "AppResourcesLoaders",
+ srcs: ["**/*.java"],
+ sdk_version: "current",
+ java_resources: [":AppResourcesLoaders_Overlay"]
+}
diff --git a/tests/AppResourcesLoaders/AndroidManifest.xml b/tests/AppResourcesLoaders/AndroidManifest.xml
new file mode 100644
index 000000000000..cb403b968abf
--- /dev/null
+++ b/tests/AppResourcesLoaders/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.example.loaders">
+ <application android:label="AppResourcesLoaders"
+ android:name=".LoadersApplication">
+ <activity android:name=".LoaderActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name=".LoaderActivityIsolated"
+ android:process="com.android.phone" />
+ </application>
+</manifest>
diff --git a/tests/AppResourcesLoaders/Overlay/Android.bp b/tests/AppResourcesLoaders/Overlay/Android.bp
new file mode 100644
index 000000000000..80443f6c3c00
--- /dev/null
+++ b/tests/AppResourcesLoaders/Overlay/Android.bp
@@ -0,0 +1,19 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+android_test_helper_app {
+ name: "AppResourcesLoaders_Overlay",
+}
diff --git a/tests/AppResourcesLoaders/Overlay/AndroidManifest.xml b/tests/AppResourcesLoaders/Overlay/AndroidManifest.xml
new file mode 100644
index 000000000000..083ba37262fd
--- /dev/null
+++ b/tests/AppResourcesLoaders/Overlay/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.example.loaders">
+ <application android:hasCode="false" />
+</manifest>
diff --git a/tests/AppResourcesLoaders/Overlay/res/values/values.xml b/tests/AppResourcesLoaders/Overlay/res/values/values.xml
new file mode 100644
index 000000000000..8f6e462ffcae
--- /dev/null
+++ b/tests/AppResourcesLoaders/Overlay/res/values/values.xml
@@ -0,0 +1,20 @@
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <string name="loader_present">Loaders present: true</string>
+ <public type="string" name="loader_present" id="0x7f010000" />
+</resources> \ No newline at end of file
diff --git a/tests/AppResourcesLoaders/res/layout/activity_isolated.xml b/tests/AppResourcesLoaders/res/layout/activity_isolated.xml
new file mode 100644
index 000000000000..0a13f00633f6
--- /dev/null
+++ b/tests/AppResourcesLoaders/res/layout/activity_isolated.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <TextView android:text="@string/loader_present"
+ style="@style/ButtonStyle"/>
+</LinearLayout> \ No newline at end of file
diff --git a/tests/AppResourcesLoaders/res/layout/activity_main.xml b/tests/AppResourcesLoaders/res/layout/activity_main.xml
new file mode 100644
index 000000000000..7277700cb14c
--- /dev/null
+++ b/tests/AppResourcesLoaders/res/layout/activity_main.xml
@@ -0,0 +1,29 @@
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <TextView android:text="@string/loader_present"
+ style="@style/ButtonStyle"/>
+
+ <Button android:id="@+id/btn_isolated_activity"
+ android:text="Launch Isolated Activity"
+ style="@style/ButtonStyle"/>
+</LinearLayout> \ No newline at end of file
diff --git a/tests/AppResourcesLoaders/res/values/styles.xml b/tests/AppResourcesLoaders/res/values/styles.xml
new file mode 100644
index 000000000000..ee73d65a21a6
--- /dev/null
+++ b/tests/AppResourcesLoaders/res/values/styles.xml
@@ -0,0 +1,23 @@
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <style name="ButtonStyle" >
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">40dp</item>
+ <item name="android:layout_centerInParent">true</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/tests/AppResourcesLoaders/res/values/values.xml b/tests/AppResourcesLoaders/res/values/values.xml
new file mode 100644
index 000000000000..af128b6e0ac9
--- /dev/null
+++ b/tests/AppResourcesLoaders/res/values/values.xml
@@ -0,0 +1,20 @@
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <string name="loader_present">Loaders present: false</string>
+ <public type="string" name="loader_present" id="0x7f010000" />
+</resources> \ No newline at end of file
diff --git a/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivity.java b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivity.java
new file mode 100644
index 000000000000..49ef46f1c8de
--- /dev/null
+++ b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivity.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.example.loaders;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+public class LoaderActivity extends Activity {
+
+ @Override
+ protected void attachBaseContext(Context newBase) {
+ super.attachBaseContext(newBase);
+ final String loaderPresentOnAttach =
+ newBase.getResources().getString(R.string.loader_present);
+ if (loaderPresentOnAttach == null || !loaderPresentOnAttach.endsWith("true")) {
+ throw new AssertionError("Loader not present in attachBaseContext");
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ findViewById(R.id.btn_isolated_activity).setOnClickListener((v) -> {
+ startActivity(new Intent(this, LoaderActivityIsolated.class));
+ });
+ }
+}
diff --git a/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivityIsolated.java b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivityIsolated.java
new file mode 100644
index 000000000000..04550b980ea1
--- /dev/null
+++ b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoaderActivityIsolated.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.example.loaders;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+
+public class LoaderActivityIsolated extends Activity {
+
+ @Override
+ protected void attachBaseContext(Context newBase) {
+ super.attachBaseContext(newBase);
+ final String loaderPresentOnAttach =
+ newBase.getResources().getString(R.string.loader_present);
+ if (loaderPresentOnAttach == null || !loaderPresentOnAttach.endsWith("true")) {
+ throw new AssertionError("Loader not present in attachBaseContext");
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_isolated);
+ }
+}
diff --git a/tests/AppResourcesLoaders/src/com/android/example/loaders/LoadersApplication.java b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoadersApplication.java
new file mode 100644
index 000000000000..709c208f4174
--- /dev/null
+++ b/tests/AppResourcesLoaders/src/com/android/example/loaders/LoadersApplication.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.example.loaders;
+
+import android.app.Application;
+import android.content.res.Resources;
+import android.content.res.loader.ResourcesLoader;
+import android.content.res.loader.ResourcesProvider;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class LoadersApplication extends Application {
+ private static final String TAG = "LoadersApplication";
+ private static final String LOADER_RESOURCES_APK = "AppResourcesLoaders_Overlay.apk";
+
+ @Override
+ public void onCreate() {
+ try {
+ final Resources resources = getResources();
+ final ResourcesLoader loader = new ResourcesLoader();
+ loader.addProvider(ResourcesProvider.loadFromApk(copyResource(LOADER_RESOURCES_APK)));
+ resources.addLoaders(loader);
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to load loader resources ", e);
+ }
+ }
+
+ private ParcelFileDescriptor copyResource(String fileName) throws IOException {
+ final File apkFile = new File(getFilesDir(), fileName);
+ final InputStream is = getClassLoader().getResourceAsStream(LOADER_RESOURCES_APK);
+ final FileOutputStream os = new FileOutputStream(apkFile);
+ byte[] buffer = new byte[8192];
+ int count;
+ while ((count = is.read(buffer)) != -1) {
+ os.write(buffer, 0, count);
+ }
+ return ParcelFileDescriptor.open(apkFile, ParcelFileDescriptor.MODE_READ_ONLY);
+ }
+}
diff --git a/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java b/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
index f96766a1d3ad..504bd1727682 100644
--- a/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
+++ b/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
@@ -15,6 +15,9 @@
*/
package com.android.utils.blob;
+import static com.android.utils.blob.Utils.BUFFER_SIZE_BYTES;
+import static com.android.utils.blob.Utils.copy;
+
import static com.google.common.truth.Truth.assertThat;
import android.app.blob.BlobHandle;
@@ -23,22 +26,17 @@ import android.content.Context;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
-import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.io.RandomAccessFile;
-import java.nio.file.Files;
import java.security.MessageDigest;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class DummyBlobData {
private static final long DEFAULT_SIZE_BYTES = 10 * 1024L * 1024L;
- private static final int BUFFER_SIZE_BYTES = 16 * 1024;
private final Context mContext;
private final Random mRandom;
@@ -83,7 +81,7 @@ public class DummyBlobData {
}
public BlobHandle getBlobHandle() throws Exception {
- return BlobHandle.createWithSha256(createSha256Digest(mFile), mLabel,
+ return BlobHandle.createWithSha256(mFileDigest, mLabel,
mExpiryTimeMs, "test_tag");
}
@@ -106,11 +104,7 @@ public class DummyBlobData {
public void writeToSession(BlobStoreManager.Session session,
long offsetBytes, long lengthBytes) throws Exception {
try (FileInputStream in = new FileInputStream(mFile)) {
- in.getChannel().position(offsetBytes);
- try (FileOutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream(
- session.openWrite(offsetBytes, lengthBytes))) {
- copy(in, out, lengthBytes);
- }
+ Utils.writeToSession(session, in, offsetBytes, lengthBytes);
}
}
@@ -123,16 +117,8 @@ public class DummyBlobData {
}
}
- private void copy(InputStream in, OutputStream out, long lengthBytes) throws Exception {
- final byte[] buffer = new byte[BUFFER_SIZE_BYTES];
- long bytesWrittern = 0;
- while (bytesWrittern < lengthBytes) {
- final int toWrite = (bytesWrittern + buffer.length <= lengthBytes)
- ? buffer.length : (int) (lengthBytes - bytesWrittern);
- in.read(buffer, 0, toWrite);
- out.write(buffer, 0, toWrite);
- bytesWrittern += toWrite;
- }
+ public ParcelFileDescriptor openForRead() throws Exception {
+ return ParcelFileDescriptor.open(mFile, ParcelFileDescriptor.MODE_READ_ONLY);
}
public void readFromSessionAndVerifyBytes(BlobStoreManager.Session session,
@@ -198,19 +184,6 @@ public class DummyBlobData {
return digest.digest();
}
- private byte[] createSha256Digest(File file) throws Exception {
- final MessageDigest digest = MessageDigest.getInstance("SHA-256");
- try (BufferedInputStream in = new BufferedInputStream(
- Files.newInputStream(file.toPath()))) {
- final byte[] buffer = new byte[BUFFER_SIZE_BYTES];
- int bytesRead;
- while ((bytesRead = in.read(buffer)) > 0) {
- digest.update(buffer, 0, bytesRead);
- }
- }
- return digest.digest();
- }
-
private void writeRandomData(RandomAccessFile file, long fileSize)
throws Exception {
long bytesWritten = 0;
diff --git a/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java b/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java
new file mode 100644
index 000000000000..c35385cd0429
--- /dev/null
+++ b/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.utils.blob;
+
+import android.app.blob.BlobStoreManager;
+import android.os.ParcelFileDescriptor;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class Utils {
+ public static final int BUFFER_SIZE_BYTES = 16 * 1024;
+
+ public static void copy(InputStream in, OutputStream out, long lengthBytes)
+ throws IOException {
+ final byte[] buffer = new byte[BUFFER_SIZE_BYTES];
+ long bytesWrittern = 0;
+ while (bytesWrittern < lengthBytes) {
+ final int toWrite = (bytesWrittern + buffer.length <= lengthBytes)
+ ? buffer.length : (int) (lengthBytes - bytesWrittern);
+ in.read(buffer, 0, toWrite);
+ out.write(buffer, 0, toWrite);
+ bytesWrittern += toWrite;
+ }
+ }
+
+ public static void writeToSession(BlobStoreManager.Session session, ParcelFileDescriptor input,
+ long lengthBytes) throws IOException {
+ try (FileInputStream in = new ParcelFileDescriptor.AutoCloseInputStream(input)) {
+ writeToSession(session, in, 0, lengthBytes);
+ }
+ }
+
+ public static void writeToSession(BlobStoreManager.Session session, FileInputStream in,
+ long offsetBytes, long lengthBytes) throws IOException {
+ in.getChannel().position(offsetBytes);
+ try (FileOutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream(
+ session.openWrite(offsetBytes, lengthBytes))) {
+ copy(in, out, lengthBytes);
+ }
+ }
+}
diff --git a/tests/net/common/java/android/net/NetworkScoreTest.kt b/tests/net/common/java/android/net/NetworkScoreTest.kt
index a63d58d5a0f6..30836b7c9be1 100644
--- a/tests/net/common/java/android/net/NetworkScoreTest.kt
+++ b/tests/net/common/java/android/net/NetworkScoreTest.kt
@@ -16,7 +16,7 @@
package android.net
-import android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN
+import android.os.Parcelable
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import com.android.testutils.assertParcelSane
@@ -28,49 +28,77 @@ import org.junit.Test
import org.junit.runner.RunWith
private const val TEST_SCORE = 80
+private const val KEY_DEFAULT_CAPABILITIES = "DEFAULT_CAPABILITIES"
@RunWith(AndroidJUnit4::class)
@SmallTest
class NetworkScoreTest {
@Test
fun testParcelNetworkScore() {
+ val networkScore = NetworkScore()
val defaultCap = NetworkCapabilities()
- val builder = NetworkScore.Builder().setLegacyScore(TEST_SCORE)
- assertEquals(TEST_SCORE, builder.build().getLegacyScore())
- assertParcelSane(builder.build(), 7)
+ networkScore.putExtension(KEY_DEFAULT_CAPABILITIES, defaultCap)
+ assertEquals(defaultCap, networkScore.getExtension(KEY_DEFAULT_CAPABILITIES))
+ networkScore.putIntExtension(NetworkScore.LEGACY_SCORE, TEST_SCORE)
+ assertEquals(TEST_SCORE, networkScore.getIntExtension(NetworkScore.LEGACY_SCORE))
+ assertParcelSane(networkScore, 1)
+ }
- builder.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI)
- .addPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION)
- .setLinkLayerMetrics(NetworkScore.Metrics(44 /* latency */,
- 380 /* downlinkBandwidth */, BANDWIDTH_UNKNOWN /* uplinkBandwidth */))
- .setEndToEndMetrics(NetworkScore.Metrics(11 /* latency */,
- BANDWIDTH_UNKNOWN /* downlinkBandwidth */, 100_000 /* uplinkBandwidth */))
- .setRange(NetworkScore.RANGE_MEDIUM)
- assertParcelSane(builder.build(), 7)
- builder.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI)
- val ns = builder.build()
- assertParcelSane(ns, 7)
- assertFalse(ns.hasPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI))
- assertTrue(ns.hasPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION))
+ @Test
+ fun testNullKeyAndValue() {
+ val networkScore = NetworkScore()
+ val defaultCap = NetworkCapabilities()
+ networkScore.putIntExtension(null, TEST_SCORE)
+ assertEquals(TEST_SCORE, networkScore.getIntExtension(null))
+ networkScore.putExtension(null, defaultCap)
+ assertEquals(defaultCap, networkScore.getExtension(null))
+ networkScore.putExtension(null, null)
+ val result: Parcelable? = networkScore.getExtension(null)
+ assertEquals(null, result)
+ }
- val exitingNs = ns.withExiting(true)
- assertNotEquals(ns.isExiting, exitingNs.isExiting)
- assertNotEquals(ns, exitingNs)
- assertParcelSane(exitingNs, 7)
+ @Test
+ fun testRemoveExtension() {
+ val networkScore = NetworkScore()
+ val defaultCap = NetworkCapabilities()
+ networkScore.putExtension(KEY_DEFAULT_CAPABILITIES, defaultCap)
+ networkScore.putIntExtension(NetworkScore.LEGACY_SCORE, TEST_SCORE)
+ assertEquals(defaultCap, networkScore.getExtension(KEY_DEFAULT_CAPABILITIES))
+ assertEquals(TEST_SCORE, networkScore.getIntExtension(NetworkScore.LEGACY_SCORE))
+ networkScore.removeExtension(KEY_DEFAULT_CAPABILITIES)
+ networkScore.removeExtension(NetworkScore.LEGACY_SCORE)
+ val result: Parcelable? = networkScore.getExtension(KEY_DEFAULT_CAPABILITIES)
+ assertEquals(null, result)
+ assertEquals(0, networkScore.getIntExtension(NetworkScore.LEGACY_SCORE))
}
@Test
fun testEqualsNetworkScore() {
- val builder1 = NetworkScore.Builder()
- val builder2 = NetworkScore.Builder()
- assertTrue(builder1.build().equals(builder2.build()))
- assertEquals(builder1.build().hashCode(), builder2.build().hashCode())
+ val ns1 = NetworkScore()
+ val ns2 = NetworkScore()
+ assertTrue(ns1.equals(ns2))
+ assertEquals(ns1.hashCode(), ns2.hashCode())
+
+ ns1.putIntExtension(NetworkScore.LEGACY_SCORE, TEST_SCORE)
+ assertFalse(ns1.equals(ns2))
+ assertNotEquals(ns1.hashCode(), ns2.hashCode())
+ ns2.putIntExtension(NetworkScore.LEGACY_SCORE, TEST_SCORE)
+ assertTrue(ns1.equals(ns2))
+ assertEquals(ns1.hashCode(), ns2.hashCode())
+
+ val defaultCap = NetworkCapabilities()
+ ns1.putExtension(KEY_DEFAULT_CAPABILITIES, defaultCap)
+ assertFalse(ns1.equals(ns2))
+ assertNotEquals(ns1.hashCode(), ns2.hashCode())
+ ns2.putExtension(KEY_DEFAULT_CAPABILITIES, defaultCap)
+ assertTrue(ns1.equals(ns2))
+ assertEquals(ns1.hashCode(), ns2.hashCode())
- builder1.setLegacyScore(TEST_SCORE)
- assertFalse(builder1.build().equals(builder2.build()))
- assertNotEquals(builder1.hashCode(), builder2.hashCode())
- builder2.setLegacyScore(TEST_SCORE)
- assertTrue(builder1.build().equals(builder2.build()))
- assertEquals(builder1.build().hashCode(), builder2.build().hashCode())
+ ns1.putIntExtension(null, 10)
+ assertFalse(ns1.equals(ns2))
+ assertNotEquals(ns1.hashCode(), ns2.hashCode())
+ ns2.putIntExtension(null, 10)
+ assertTrue(ns1.equals(ns2))
+ assertEquals(ns1.hashCode(), ns2.hashCode())
}
}
diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
index 7ae9e95a520f..a35fb407bca9 100644
--- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
+++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
@@ -40,7 +40,6 @@ import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkProvider;
-import android.net.NetworkScore;
import android.net.NetworkSpecifier;
import android.net.SocketKeepalive;
import android.net.UidRange;
@@ -156,13 +155,9 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
}
}
- private NetworkScore makeNetworkScore(final int legacyScore) {
- return new NetworkScore.Builder().setLegacyScore(legacyScore).build();
- }
-
public void adjustScore(int change) {
mScore += change;
- mNetworkAgent.sendNetworkScore(makeNetworkScore(mScore));
+ mNetworkAgent.sendNetworkScore(mScore);
}
public int getScore() {
diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
index 25e9057fd13c..e863266c4b49 100644
--- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
@@ -353,7 +353,8 @@ public class LingerMonitorTest {
NetworkCapabilities caps = new NetworkCapabilities();
caps.addCapability(0);
caps.addTransportType(transport);
- NetworkScore ns = new NetworkScore.Builder().setLegacyScore(50).build();
+ NetworkScore ns = new NetworkScore();
+ ns.putIntExtension(NetworkScore.LEGACY_SCORE, 50);
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
caps, ns, mCtx, null, null /* config */, mConnService, mNetd, mDnsResolver, mNMS,
NetworkProvider.ID_NONE);
diff --git a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
index aed62d046896..3026e0b51133 100644
--- a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
+++ b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
@@ -46,7 +46,8 @@ public final class FrameworksTestsFilter extends SelectTest {
"android.view.InsetsSourceTest",
"android.view.InsetsSourceConsumerTest",
"android.view.InsetsStateTest",
- "android.view.WindowMetricsTest"
+ "android.view.WindowMetricsTest",
+ "android.view.PendingInsetsControllerTest"
};
public FrameworksTestsFilter(Bundle testArgs) {
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 4c4a96277d12..5a7bf4b15f1a 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -2442,16 +2442,23 @@ public class WifiConfiguration implements Parcelable {
if (TextUtils.isEmpty(keyMgmt)) {
throw new IllegalStateException("Not an EAP network");
}
+ String keyId = trimStringForKeyId(SSID) + "_" + keyMgmt + "_"
+ + trimStringForKeyId(enterpriseConfig.getKeyId(current != null
+ ? current.enterpriseConfig : null));
- return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" +
- trimStringForKeyId(enterpriseConfig.getKeyId(current != null ?
- current.enterpriseConfig : null));
+ if (!fromWifiNetworkSuggestion) {
+ return keyId;
+ }
+ return keyId + "_" + trimStringForKeyId(BSSID) + "_" + trimStringForKeyId(creatorName);
} catch (NullPointerException e) {
throw new IllegalStateException("Invalid config details");
}
}
private String trimStringForKeyId(String string) {
+ if (string == null) {
+ return "";
+ }
// Remove quotes and spaces
return string.replace("\"", "").replace(" ", "");
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 6487e8390374..a262c92b8b29 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -4430,7 +4430,8 @@ public class WifiManager {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
- public void setPasspointMeteredOverride(@NonNull String fqdn, int meteredOverride) {
+ public void setPasspointMeteredOverride(@NonNull String fqdn,
+ @WifiConfiguration.MeteredOverride int meteredOverride) {
try {
mService.setPasspointMeteredOverride(fqdn, meteredOverride);
} catch (RemoteException e) {
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index 00790d5a2d60..047a64b25733 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -253,6 +253,67 @@ public class WifiConfigurationTest {
}
/**
+ * Verifies that getKeyIdForCredentials returns the expected string for Suggestion Enterprise
+ * networks
+ * @throws Exception
+ */
+ @Test
+ public void testGetKeyIdForCredentialsForSuggestion() throws Exception {
+ WifiConfiguration config = new WifiConfiguration();
+ final String mSsid = "TestAP";
+ final String packageName = "TestApp";
+ final String bSsid = MacAddressUtils.createRandomUnicastAddress().toString();
+ String suggestionSuffix = "_" + bSsid + "_" + packageName;
+ config.SSID = mSsid;
+ config.fromWifiNetworkSuggestion = true;
+ config.creatorName = packageName;
+ config.BSSID = bSsid;
+
+ // Test various combinations
+ // EAP with TLS
+ config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
+ config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+ config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
+ String keyId = config.getKeyIdForCredentials(config);
+ assertEquals(keyId, mSsid + "_WPA_EAP_TLS_NULL" + suggestionSuffix);
+
+ // EAP with TTLS & MSCHAPv2
+ config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
+ config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS);
+ config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
+ keyId = config.getKeyIdForCredentials(config);
+ assertEquals(keyId, mSsid + "_WPA_EAP_TTLS_MSCHAPV2" + suggestionSuffix);
+
+ // Suite-B 192 with PWD & GTC
+ config.allowedKeyManagement.clear();
+ config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192);
+ config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PWD);
+ config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
+ keyId = config.getKeyIdForCredentials(config);
+ assertEquals(keyId, mSsid + "_SUITE_B_192_PWD_GTC" + suggestionSuffix);
+
+ // IEEE8021X with SIM
+ config.allowedKeyManagement.clear();
+ config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
+ config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
+ config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
+ keyId = config.getKeyIdForCredentials(config);
+ assertEquals(keyId, mSsid + "_IEEE8021X_SIM_NULL" + suggestionSuffix);
+
+ // Try calling this method with non-Enterprise network, expect an exception
+ boolean exceptionThrown = false;
+ try {
+ config.allowedKeyManagement.clear();
+ config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
+ config.preSharedKey = "TestPsk";
+ keyId = config.getKeyIdForCredentials(config);
+ } catch (IllegalStateException e) {
+ exceptionThrown = true;
+ }
+ assertTrue(exceptionThrown);
+ }
+
+ /**
* Verifies that getSsidAndSecurityTypeString returns the correct String for networks of
* various different security types
*/