Merge "Remove CloseGuard from DisplayEventReceiver" into sc-dev
diff --git a/Android.bp b/Android.bp
index 9e1820e..ca014bc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -14,41 +14,6 @@
// Build the master framework library.
-// Defaults for platform code that runs inside system_server
-java_defaults {
- name: "platform_service_defaults",
- plugins: [
- "error_prone_android_framework",
- ],
- errorprone: {
- javacflags: [
- // "-Xep:AndroidFrameworkBinderIdentity:ERROR",
- "-Xep:AndroidFrameworkCompatChange:ERROR",
- // "-Xep:AndroidFrameworkUid:ERROR",
- // NOTE: only enable to generate local patchfiles
- // "-XepPatchChecks:refaster:frameworks/base/errorprone/refaster/EfficientXml.java.refaster",
- // "-XepPatchLocation:/tmp/refaster/",
- ],
- },
-}
-
-// Defaults for platform apps
-java_defaults {
- name: "platform_app_defaults",
- plugins: [
- "error_prone_android_framework",
- ],
- errorprone: {
- javacflags: [
- // We're less worried about performance in app code
- "-Xep:AndroidFrameworkEfficientCollections:OFF",
- "-Xep:AndroidFrameworkEfficientParcelable:OFF",
- "-Xep:AndroidFrameworkEfficientStrings:OFF",
- "-Xep:AndroidFrameworkEfficientXml:OFF",
- ],
- },
-}
-
// READ ME: ########################################################
//
// When updating this list of aidl files, consider if that aidl is
@@ -306,43 +271,6 @@
installable: false,
}
-filegroup {
- name: "framework-jarjar-rules",
- srcs: ["framework-jarjar-rules.txt"],
-}
-
-filegroup {
- name: "libincident_aidl",
- srcs: [
- "core/java/android/os/IIncidentDumpCallback.aidl",
- "core/java/android/os/IIncidentManager.aidl",
- "core/java/android/os/IIncidentReportStatusListener.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
- name: "libvibrator_aidl",
- srcs: [
- "core/java/android/os/IExternalVibrationController.aidl",
- "core/java/android/os/IExternalVibratorService.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
- name: "libpowermanager_aidl",
- srcs: [
- "core/java/android/os/Temperature.aidl",
- "core/java/android/os/CoolingDevice.aidl",
- "core/java/android/os/IThermalEventListener.aidl",
- "core/java/android/os/IThermalStatusListener.aidl",
- "core/java/android/os/IThermalService.aidl",
- "core/java/android/os/IPowerManager.aidl",
- ],
- path: "core/java",
-}
-
java_defaults {
name: "framework-minus-apex-defaults",
defaults: ["framework-aidl-export-defaults"],
@@ -363,7 +291,7 @@
"--core-library",
"--multi-dex",
],
- jarjar_rules: ":framework-jarjar-rules",
+ jarjar_rules: "framework-jarjar-rules.txt",
javac_shard_size: 150,
plugins: [
"view-inspector-annotation-processor",
@@ -460,86 +388,6 @@
src: ":framework-minus-apex",
}
-genrule {
- name: "statslog-framework-java-gen",
- tools: ["stats-log-api-gen"],
- cmd: "$(location stats-log-api-gen) --java $(out) --module framework" +
- " --javaPackage com.android.internal.util --javaClass FrameworkStatsLog --worksource",
- out: ["com/android/internal/util/FrameworkStatsLog.java"],
-}
-
-java_library {
- name: "uieventloggerlib",
- srcs: [
- "core/java/com/android/internal/logging/UiEvent.java",
- "core/java/com/android/internal/logging/UiEventLogger.java",
- "core/java/com/android/internal/logging/UiEventLoggerImpl.java",
- "core/java/com/android/internal/logging/InstanceId.java",
- "core/java/com/android/internal/logging/InstanceIdSequence.java",
- ":statslog-framework-java-gen",
- ],
-}
-
-gensrcs {
- name: "framework-javastream-protos",
- depfile: true,
-
- tools: [
- "aprotoc",
- "protoc-gen-javastream",
- "soong_zip",
- ],
-
- cmd: "mkdir -p $(genDir)/$(in) " +
- "&& $(location aprotoc) " +
- " --plugin=$(location protoc-gen-javastream) " +
- " --dependency_out=$(depfile) " +
- " --javastream_out=$(genDir)/$(in) " +
- " -Iexternal/protobuf/src " +
- " -I . " +
- " $(in) " +
- "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)",
-
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- ":libtombstone_proto-src",
- "core/proto/**/*.proto",
- "libs/incident/**/*.proto",
- ":service-permission-protos",
- ],
- output_extension: "srcjar",
-}
-
-gensrcs {
- name: "framework-cppstream-protos",
- depfile: true,
-
- tools: [
- "aprotoc",
- "protoc-gen-cppstream",
- ],
-
- cmd: "mkdir -p $(genDir) " +
- "&& $(location aprotoc) " +
- " --plugin=$(location protoc-gen-cppstream) " +
- " --dependency_out=$(depfile) " +
- " --cppstream_out=$(genDir) " +
- " -Iexternal/protobuf/src " +
- " -I . " +
- " $(in)",
-
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- "core/proto/**/*.proto",
- "libs/incident/**/*.proto",
- ":service-permission-protos",
- ],
-
- output_extension: "proto.h",
-}
-
filegroup {
name: "framework-annotations",
srcs: [
@@ -615,76 +463,6 @@
],
}
-filegroup {
- name: "framework-services-net-module-wifi-shared-srcs",
- srcs: [
- "core/java/android/net/DhcpResults.java",
- "core/java/android/util/LocalLog.java",
- ],
-}
-
-// keep these files in sync with the package/Tethering/jarjar-rules.txt and
-// package/Connectivity/jarjar-rules.txt for the tethering module and connectivity module.
-filegroup {
- name: "framework-connectivity-shared-srcs",
- srcs: [
- "core/java/android/util/IndentingPrintWriter.java",
- "core/java/android/util/LocalLog.java",
- // This should be android.util.IndentingPrintWriter, but it's not available in all branches.
- "core/java/com/android/internal/util/IndentingPrintWriter.java",
- "core/java/com/android/internal/util/IState.java",
- "core/java/com/android/internal/util/MessageUtils.java",
- "core/java/com/android/internal/util/State.java",
- "core/java/com/android/internal/util/StateMachine.java",
- "core/java/com/android/internal/util/WakeupMessage.java",
- ],
-}
-
-// keep these files in sync with the apex/jobscheduler/service jarjar-rules.txt for
-// the jobscheduler module.
-filegroup {
- name: "framework-jobscheduler-shared-srcs",
- srcs: [
- "core/java/com/android/internal/util/ArrayUtils.java",
- "core/java/com/android/internal/util/BitUtils.java",
- "core/java/com/android/internal/util/CollectionUtils.java",
- "core/java/com/android/internal/util/ConcurrentUtils.java",
- "core/java/com/android/internal/util/DumpUtils.java",
- "core/java/com/android/internal/util/FastPrintWriter.java",
- "core/java/com/android/internal/util/FastXmlSerializer.java",
- "core/java/com/android/internal/util/FunctionalUtils.java",
- "core/java/com/android/internal/util/ParseUtils.java",
- "core/java/com/android/internal/util/Preconditions.java",
- "core/java/com/android/internal/util/RingBufferIndices.java",
- "core/java/com/android/internal/util/StatLogger.java",
- "core/java/com/android/internal/util/XmlUtils.java",
- ],
-}
-
-// Keep these files in sync with the apex/permission/jarjar-rules.txt for the permission module.
-filegroup {
- name: "framework-permission-s-shared-srcs",
- srcs: [
- "core/java/com/android/internal/infra/AndroidFuture.java",
- "core/java/com/android/internal/infra/ServiceConnector.java",
- "core/java/com/android/internal/util/Preconditions.java",
- "core/java/com/android/internal/infra/AndroidFuture.aidl",
- "core/java/com/android/internal/infra/IAndroidFuture.aidl",
- "core/java/android/os/HandlerExecutor.java",
- ],
- path: "core/java",
-}
-
-// Keep these files in sync with the apex/permission/jarjar-rules.txt for the permission module.
-filegroup {
- name: "service-permission-shared-srcs",
- srcs: [
- "core/java/android/util/IndentingPrintWriter.java",
- "core/java/com/android/internal/util/dump/DualDumpOutputStream.java",
- ],
- path: "core/java",
-}
-
// Build ext.jar
// ============================================================
java_library {
@@ -699,382 +477,6 @@
dxflags: ["--core-library"],
}
-// ==== java proto host library ==============================
-java_library_host {
- name: "platformprotos",
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- ":libstats_internal_protos",
- ":statsd_internal_protos",
- "cmds/am/proto/instrumentation_data.proto",
- "cmds/statsd/src/**/*.proto",
- "core/proto/**/*.proto",
- "libs/incident/proto/**/*.proto",
- ":service-permission-protos",
- ],
- proto: {
- include_dirs: [
- "external/protobuf/src",
- "frameworks/proto_logging/stats",
- ],
- type: "full",
- },
- // Protos have lots of MissingOverride and similar.
- errorprone: {
- javacflags: ["-XepDisableAllChecks"],
- },
-}
-
-// ==== java proto device library (for test only) ==============================
-java_library {
- name: "platformprotosnano",
- proto: {
- type: "nano",
- output_params: ["store_unknown_fields=true"],
- include_dirs: ["external/protobuf/src"],
- },
- exclude_srcs: [
- "core/proto/android/privacy.proto",
- "core/proto/android/section.proto",
- "core/proto/android/typedef.proto",
- ],
- sdk_version: "9",
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- "core/proto/**/*.proto",
- "libs/incident/proto/android/os/**/*.proto",
- ":service-permission-protos",
- ],
-}
-
-// ==== java proto device library (for test only) ==============================
-java_library {
- name: "platformprotoslite",
- proto: {
- type: "lite",
- include_dirs: ["external/protobuf/src"],
- },
-
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- "core/proto/**/*.proto",
- "libs/incident/proto/android/os/**/*.proto",
- ":service-permission-protos",
- ],
- exclude_srcs: [
- "core/proto/android/privacy.proto",
- "core/proto/android/section.proto",
- "core/proto/android/typedef.proto",
- ],
- sdk_version: "core_current",
- // Protos have lots of MissingOverride and similar.
- errorprone: {
- javacflags: ["-XepDisableAllChecks"],
- },
-}
-
-// ==== c++ proto device library ==============================
-cc_defaults {
- name: "libplatformprotos-defaults",
-
- proto: {
- export_proto_headers: true,
- include_dirs: [
- "external/protobuf/src",
- ],
- },
-
- cflags: [
- "-Wall",
- "-Werror",
- "-Wno-unused-parameter",
- ],
-
- srcs: [
- ":ipconnectivity-proto-src",
- ":libstats_atom_enum_protos",
- "core/proto/**/*.proto",
- ":service-permission-protos",
- ],
-}
-
-cc_library {
- name: "libplatformprotos",
- defaults: ["libplatformprotos-defaults"],
- host_supported: true,
-
- target: {
- host: {
- proto: {
- type: "full",
- },
- },
- android: {
- proto: {
- type: "lite",
- },
- shared_libs: [
- "libprotobuf-cpp-lite",
- ],
- shared: {
- enabled: false,
- },
- },
- },
-}
-
-// This library is meant for vendor code that needs to output protobuf. It links
-// against the static version of libprotobuf-cpp-lite, for which we can not guarantee
-// binary compatibility.
-cc_library {
- name: "libplatformprotos-static",
- defaults: ["libplatformprotos-defaults"],
- host_supported: false,
-
- // This is okay because this library is only built as a static library. The C++
- // API is not guaranteed. The proto API is guaranteed to be stable via Metrics Council,
- // but is not authorized to be used outside of debugging.
- vendor_available: true,
-
- target: {
- android: {
- proto: {
- type: "lite",
- },
- static_libs: [
- "libprotobuf-cpp-lite",
- ],
- shared: {
- enabled: false,
- },
- },
- },
-}
-
-// This is the full proto version of libplatformprotos. It may only
-// be used by test code that is not shipped on the device.
-cc_library {
- name: "libplatformprotos-test",
- defaults: ["libplatformprotos-defaults"],
- host_supported: false,
-
- target: {
- android: {
- proto: {
- type: "full",
- },
- shared: {
- enabled: false,
- },
- },
- },
-}
-
-filegroup {
- name: "incremental_aidl",
- srcs: [
- "core/java/android/os/incremental/IIncrementalServiceConnector.aidl",
- "core/java/android/os/incremental/IncrementalFileSystemControlParcel.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
- name: "dataloader_aidl",
- srcs: [
- "core/java/android/content/pm/DataLoaderParamsParcel.aidl",
- "core/java/android/content/pm/DataLoaderType.aidl",
- "core/java/android/content/pm/FileSystemControlParcel.aidl",
- "core/java/android/content/pm/IDataLoader.aidl",
- "core/java/android/content/pm/IDataLoaderManager.aidl",
- "core/java/android/content/pm/InstallationFileParcel.aidl",
- "core/java/android/content/pm/InstallationFileLocation.aidl",
- "core/java/android/content/pm/IDataLoaderStatusListener.aidl",
- "core/java/android/content/pm/IPackageInstallerSessionFileSystemConnector.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
- name: "incremental_manager_aidl",
- srcs: [
- "core/java/android/os/incremental/IIncrementalService.aidl",
- "core/java/android/os/incremental/IStorageLoadingProgressListener.aidl",
- "core/java/android/os/incremental/IncrementalNewFileParams.aidl",
- "core/java/android/os/incremental/IStorageHealthListener.aidl",
- "core/java/android/os/incremental/PerUidReadTimeouts.aidl",
- "core/java/android/os/incremental/StorageHealthCheckParams.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
- name: "activity_manager_procstate_aidl",
- srcs: [
- "core/java/android/app/ProcessStateEnum.aidl",
- ],
- path: "core/java",
-}
-
-cc_defaults {
- name: "incremental_default",
- cflags: [
- "-Wall",
- "-Wextra",
- "-Wextra-semi",
- "-Werror",
- "-Wzero-as-null-pointer-constant",
- "-DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION",
- ],
- shared_libs: [
- "libbinder",
- "libutils",
- ],
- aidl: {
- include_dirs: [
- "frameworks/native/aidl/binder",
- ],
- export_aidl_headers: true,
- },
-}
-
-cc_library {
- name: "libincremental_aidl-cpp",
- srcs: [
- ":incremental_aidl",
- ],
- defaults: ["incremental_default"],
-}
-
-cc_library {
- name: "libdataloader_aidl-cpp",
- srcs: [
- ":dataloader_aidl",
- ],
- defaults: ["incremental_default"],
- shared_libs: [
- "libincremental_aidl-cpp",
- ],
-}
-
-cc_library {
- name: "libincremental_manager_aidl-cpp",
- srcs: [
- ":incremental_manager_aidl",
- ],
- defaults: ["incremental_default"],
- shared_libs: [
- "libincremental_aidl-cpp",
- "libdataloader_aidl-cpp",
- ],
-}
-
-// Build Rust bindings for PermissionController. Needed by keystore2.
-aidl_interface {
- name: "android.os.permissions_aidl",
- unstable: true,
- local_include_dir: "core/java",
- srcs: [
- "core/java/android/os/IPermissionController.aidl",
- ],
- backend: {
- rust: {
- enabled: true,
- },
- },
-}
-
-python_defaults {
- name: "base_default",
- version: {
- py2: {
- enabled: false,
- embedded_launcher: false,
- },
- py3: {
- enabled: true,
- embedded_launcher: true,
- },
- },
-}
-
-python_binary_host {
- name: "fontchain_linter",
- defaults: ["base_default"],
- main: "tools/fonts/fontchain_linter.py",
- srcs: [
- "tools/fonts/fontchain_linter.py",
- ],
- libs: [
- "fontTools",
- ],
-}
-
-python_binary_host {
- name: "update_font_metadata",
- defaults: ["base_default"],
- main: "tools/fonts/update_font_metadata.py",
- srcs: [
- "tools/fonts/update_font_metadata.py",
- ],
- libs: [
- "fontTools",
- ],
-}
-
-// Avoid including Parcelable classes as we don't want to have two copies of
-// Parcelable cross the libraries. This is used by telephony-common (frameworks/opt/telephony)
-// and TeleService app (packages/services/Telephony).
-filegroup {
- name: "framework-telephony-common-shared-srcs",
- srcs: [
- "core/java/android/os/RegistrantList.java",
- "core/java/android/os/Registrant.java",
- "core/java/android/util/IndentingPrintWriter.java",
- "core/java/android/util/LocalLog.java",
- "core/java/android/util/TimeUtils.java",
- "core/java/com/android/internal/os/SomeArgs.java",
- "core/java/com/android/internal/util/AsyncChannel.java",
- "core/java/com/android/internal/util/AsyncService.java",
- "core/java/com/android/internal/util/BitwiseInputStream.java",
- "core/java/com/android/internal/util/FastXmlSerializer.java",
- "core/java/com/android/internal/util/HexDump.java",
- "core/java/com/android/internal/util/IState.java",
- "core/java/com/android/internal/util/IndentingPrintWriter.java",
- "core/java/com/android/internal/util/Preconditions.java",
- "core/java/com/android/internal/util/State.java",
- "core/java/com/android/internal/util/StateMachine.java",
- "core/java/com/android/internal/util/UserIcons.java",
- ],
-}
-
-// Avoid including Parcelable classes as we don't want to have two copies of
-// Parcelable cross the process.
-filegroup {
- name: "framework-cellbroadcast-shared-srcs",
- srcs: [
- "core/java/android/os/HandlerExecutor.java",
- "core/java/android/util/LocalLog.java",
- "core/java/com/android/internal/util/IState.java",
- "core/java/com/android/internal/util/Preconditions.java",
- "core/java/com/android/internal/util/State.java",
- "core/java/com/android/internal/util/StateMachine.java",
- ],
-}
-
-filegroup {
- name: "framework-ims-common-shared-srcs",
- srcs: [
- "core/java/android/os/RegistrantList.java",
- "core/java/android/os/Registrant.java",
- "core/java/com/android/internal/os/SomeArgs.java",
- "core/java/com/android/internal/util/Preconditions.java",
- ],
-}
-
// utility classes statically linked into framework-wifi and dynamically linked
// into wifi-service
java_library {
@@ -1102,27 +504,6 @@
],
}
-// utility classes statically linked into wifi-service
-filegroup {
- name: "framework-wifi-service-shared-srcs",
- srcs: [
- "core/java/android/net/InterfaceConfiguration.java",
- "core/java/android/util/BackupUtils.java",
- "core/java/android/util/Rational.java",
- "core/java/com/android/internal/util/FastXmlSerializer.java",
- "core/java/com/android/internal/util/HexDump.java",
- "core/java/com/android/internal/util/IState.java",
- "core/java/com/android/internal/util/MessageUtils.java",
- "core/java/com/android/internal/util/State.java",
- "core/java/com/android/internal/util/StateMachine.java",
- "core/java/com/android/internal/util/WakeupMessage.java",
- ],
- visibility: [
- "//frameworks/opt/net/wifi/service",
- "//packages/modules/Wifi/service",
- ],
-}
-
// TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp
metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.xml) " +
"--hide-package com.android.server " +
@@ -1156,32 +537,5 @@
build = [
"StubLibraries.bp",
"ApiDocs.bp",
+ "ProtoLibraries.bp",
]
-
-// protolog start
-filegroup {
- name: "protolog-common-src",
- srcs: [
- "core/java/com/android/internal/protolog/common/**/*.java",
- ],
-}
-
-java_library {
- name: "protolog-lib",
- platform_apis: true,
- srcs: [
- "core/java/com/android/internal/protolog/ProtoLogImpl.java",
- "core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java",
- ":protolog-common-src",
- ],
-}
-
-java_library {
- name: "protolog-groups",
- srcs: [
- "core/java/com/android/internal/protolog/ProtoLogGroup.java",
- ":protolog-common-src",
- ],
-}
-
-// protolog end
diff --git a/OWNERS b/OWNERS
index 710f13e..4970dd1 100644
--- a/OWNERS
+++ b/OWNERS
@@ -30,3 +30,4 @@
per-file Android.mk = file:platform/build/soong:/OWNERS
per-file ApiDocs.bp = file:platform/build/soong:/OWNERS
per-file StubLibraries.bp = file:platform/build/soong:/OWNERS
+per-file ProtoLibraries.bp = file:platform/build/soong:/OWNERS
diff --git a/ProtoLibraries.bp b/ProtoLibraries.bp
new file mode 100644
index 0000000..14415db
--- /dev/null
+++ b/ProtoLibraries.bp
@@ -0,0 +1,247 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+gensrcs {
+ name: "framework-javastream-protos",
+ depfile: true,
+
+ tools: [
+ "aprotoc",
+ "protoc-gen-javastream",
+ "soong_zip",
+ ],
+
+ cmd: "mkdir -p $(genDir)/$(in) " +
+ "&& $(location aprotoc) " +
+ " --plugin=$(location protoc-gen-javastream) " +
+ " --dependency_out=$(depfile) " +
+ " --javastream_out=$(genDir)/$(in) " +
+ " -Iexternal/protobuf/src " +
+ " -I . " +
+ " $(in) " +
+ "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)",
+
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ ":libtombstone_proto-src",
+ "core/proto/**/*.proto",
+ "libs/incident/**/*.proto",
+ ":service-permission-protos",
+ ],
+ output_extension: "srcjar",
+}
+
+gensrcs {
+ name: "framework-cppstream-protos",
+ depfile: true,
+
+ tools: [
+ "aprotoc",
+ "protoc-gen-cppstream",
+ ],
+
+ cmd: "mkdir -p $(genDir) " +
+ "&& $(location aprotoc) " +
+ " --plugin=$(location protoc-gen-cppstream) " +
+ " --dependency_out=$(depfile) " +
+ " --cppstream_out=$(genDir) " +
+ " -Iexternal/protobuf/src " +
+ " -I . " +
+ " $(in)",
+
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ "core/proto/**/*.proto",
+ "libs/incident/**/*.proto",
+ ":service-permission-protos",
+ ],
+
+ output_extension: "proto.h",
+}
+
+// ==== java proto host library ==============================
+java_library_host {
+ name: "platformprotos",
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ ":libstats_internal_protos",
+ ":statsd_internal_protos",
+ "cmds/am/proto/instrumentation_data.proto",
+ "cmds/statsd/src/**/*.proto",
+ "core/proto/**/*.proto",
+ "libs/incident/proto/**/*.proto",
+ ":service-permission-protos",
+ ],
+ proto: {
+ include_dirs: [
+ "external/protobuf/src",
+ "frameworks/proto_logging/stats",
+ ],
+ type: "full",
+ },
+ // Protos have lots of MissingOverride and similar.
+ errorprone: {
+ javacflags: ["-XepDisableAllChecks"],
+ },
+}
+
+// ==== java proto device library (for test only) ==============================
+java_library {
+ name: "platformprotosnano",
+ proto: {
+ type: "nano",
+ output_params: ["store_unknown_fields=true"],
+ include_dirs: ["external/protobuf/src"],
+ },
+ exclude_srcs: [
+ "core/proto/android/privacy.proto",
+ "core/proto/android/section.proto",
+ "core/proto/android/typedef.proto",
+ ],
+ sdk_version: "9",
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ "core/proto/**/*.proto",
+ "libs/incident/proto/android/os/**/*.proto",
+ ":service-permission-protos",
+ ],
+}
+
+// ==== java proto device library (for test only) ==============================
+java_library {
+ name: "platformprotoslite",
+ proto: {
+ type: "lite",
+ include_dirs: ["external/protobuf/src"],
+ },
+
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ "core/proto/**/*.proto",
+ "libs/incident/proto/android/os/**/*.proto",
+ ":service-permission-protos",
+ ],
+ exclude_srcs: [
+ "core/proto/android/privacy.proto",
+ "core/proto/android/section.proto",
+ "core/proto/android/typedef.proto",
+ ],
+ sdk_version: "core_current",
+ // Protos have lots of MissingOverride and similar.
+ errorprone: {
+ javacflags: ["-XepDisableAllChecks"],
+ },
+}
+
+// ==== c++ proto device library ==============================
+cc_defaults {
+ name: "libplatformprotos-defaults",
+
+ proto: {
+ export_proto_headers: true,
+ include_dirs: [
+ "external/protobuf/src",
+ ],
+ },
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-unused-parameter",
+ ],
+
+ srcs: [
+ ":ipconnectivity-proto-src",
+ ":libstats_atom_enum_protos",
+ "core/proto/**/*.proto",
+ ":service-permission-protos",
+ ],
+}
+
+cc_library {
+ name: "libplatformprotos",
+ defaults: ["libplatformprotos-defaults"],
+ host_supported: true,
+
+ target: {
+ host: {
+ proto: {
+ type: "full",
+ },
+ },
+ android: {
+ proto: {
+ type: "lite",
+ },
+ shared_libs: [
+ "libprotobuf-cpp-lite",
+ ],
+ shared: {
+ enabled: false,
+ },
+ },
+ },
+}
+
+// This library is meant for vendor code that needs to output protobuf. It links
+// against the static version of libprotobuf-cpp-lite, for which we can not guarantee
+// binary compatibility.
+cc_library {
+ name: "libplatformprotos-static",
+ defaults: ["libplatformprotos-defaults"],
+ host_supported: false,
+
+ // This is okay because this library is only built as a static library. The C++
+ // API is not guaranteed. The proto API is guaranteed to be stable via Metrics Council,
+ // but is not authorized to be used outside of debugging.
+ vendor_available: true,
+
+ target: {
+ android: {
+ proto: {
+ type: "lite",
+ },
+ static_libs: [
+ "libprotobuf-cpp-lite",
+ ],
+ shared: {
+ enabled: false,
+ },
+ },
+ },
+}
+
+// This is the full proto version of libplatformprotos. It may only
+// be used by test code that is not shipped on the device.
+cc_library {
+ name: "libplatformprotos-test",
+ defaults: ["libplatformprotos-defaults"],
+ host_supported: false,
+
+ target: {
+ android: {
+ proto: {
+ type: "full",
+ },
+ shared: {
+ enabled: false,
+ },
+ },
+ },
+}
diff --git a/StubLibraries.bp b/StubLibraries.bp
index a83cb4d..284e807 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -114,7 +114,7 @@
last_released: {
api_file: ":android-non-updatable.api.public.latest",
removed_api_file: ":android-non-updatable-removed.api.public.latest",
- baseline_file: ":android-incompatibilities.api.public.latest",
+ baseline_file: ":android-non-updatable-incompatibilities.api.public.latest",
},
api_lint: {
enabled: true,
@@ -166,7 +166,7 @@
last_released: {
api_file: ":android-non-updatable.api.system.latest",
removed_api_file: ":android-non-updatable-removed.api.system.latest",
- baseline_file: ":android-incompatibilities.api.system.latest"
+ baseline_file: ":android-non-updatable-incompatibilities.api.system.latest"
},
api_lint: {
enabled: true,
@@ -310,18 +310,67 @@
]
java_defaults {
- name: "android_defaults_stubs_current",
- libs: [ "stub-annotations" ],
- static_libs: [
- // License notices from art module
- "art-notices-for-framework-stubs-jar",
- "framework-res-package-jar", // Export package of framework-res
- ],
- errorprone: {
- javacflags: [
- "-XepDisableAllChecks",
- ],
+ name: "android-non-updatable_defaults_stubs_current",
+ libs: ["stub-annotations"],
+ static_libs: ["framework-res-package-jar"], // Export package of framework-res
+ sdk_version: "none",
+ system_modules: "none",
+ java_version: "1.8",
+ compile_dex: true,
+ dist: {
+ targets: ["sdk", "win_sdk"],
+ tag: ".jar",
+ dest: "android-non-updatable.jar",
+ }
+}
+
+java_library_static {
+ name: "android-non-updatable.stubs",
+ defaults: ["android-non-updatable_defaults_stubs_current"],
+ srcs: [":api-stubs-docs-non-updatable"],
+ libs: modules_public_stubs,
+ dist: {
+ dir: "apistubs/android/public",
},
+}
+
+java_library_static {
+ name: "android-non-updatable.stubs.system",
+ defaults: ["android-non-updatable_defaults_stubs_current"],
+ srcs: [ ":system-api-stubs-docs-non-updatable" ],
+ libs: modules_system_stubs,
+ dist: {
+ dir: "apistubs/android/system",
+ },
+}
+
+java_library_static {
+ name: "android-non-updatable.stubs.module_lib",
+ defaults: ["android-non-updatable_defaults_stubs_current"],
+ srcs: [":module-lib-api-stubs-docs-non-updatable"],
+ libs: [
+ "sdk_system_current_android",
+ // NOTE: The below can be removed once the prebuilt stub contains IKE.
+ "sdk_system_current_android.net.ipsec.ike",
+ ],
+ dist: {
+ dir: "apistubs/android/module-lib",
+ },
+}
+
+java_library_static {
+ name: "android-non-updatable.stubs.test",
+ defaults: ["android-non-updatable_defaults_stubs_current"],
+ srcs: [":test-api-stubs-docs-non-updatable"],
+ libs: modules_system_stubs,
+ dist: {
+ dir: "apistubs/android/test",
+ },
+}
+
+java_defaults {
+ name: "android_defaults_stubs_current",
+ static_libs: ["art-notices-for-framework-stubs-jar"], // License notices from art module
sdk_version: "none",
system_modules: "none",
java_version: "1.8",
@@ -339,8 +388,8 @@
java_library_static {
name: "android_stubs_current",
- srcs: [ ":api-stubs-docs-non-updatable" ],
static_libs: modules_public_stubs + [
+ "android-non-updatable.stubs",
"private-stub-annotations-jar",
],
defaults: ["android_defaults_stubs_current"],
@@ -348,8 +397,8 @@
java_library_static {
name: "android_system_stubs_current",
- srcs: [ ":system-api-stubs-docs-non-updatable" ],
static_libs: modules_system_stubs + [
+ "android-non-updatable.stubs.system",
"private-stub-annotations-jar",
],
defaults: [
@@ -371,10 +420,10 @@
java_library_static {
name: "android_test_stubs_current",
- srcs: [ ":test-api-stubs-docs-non-updatable" ],
// Modules do not have test APIs, but we want to include their SystemApis, like we include
// the SystemApi of framework-non-updatable-sources.
static_libs: modules_system_stubs + [
+ "android-non-updatable.stubs.test",
"private-stub-annotations-jar",
],
defaults: [
@@ -396,17 +445,14 @@
java_library_static {
name: "android_module_lib_stubs_current",
- srcs: [ ":module-lib-api-stubs-docs-non-updatable" ],
defaults: [
"android_defaults_stubs_current",
"android_stubs_dists_default",
],
- libs: [
- "sdk_system_current_android",
- // NOTE: The below can be removed once the prebuilt stub contains IKE.
- "sdk_system_current_android.net.ipsec.ike",
+ static_libs: [
+ "android-non-updatable.stubs.module_lib",
+ "art.module.public.api.stubs",
],
- static_libs: ["art.module.public.api.stubs"],
dist: {
dir: "apistubs/android/module-lib",
},
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
index 3677489..ac91bdb 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
@@ -23,6 +23,7 @@
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -270,8 +271,8 @@
documentBundles.add(documents.get(i).getBundle());
}
try {
- // TODO(b/173532925) a timestamp needs to be sent here to calculate binder latency
mService.putDocuments(mPackageName, mDatabaseName, documentBundles, mUserId,
+ /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
executor.execute(() -> callback.onResult(result));
diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
index 4d05ad7..0b8f052 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
+++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
@@ -94,6 +94,7 @@
* @param databaseName The name of the database where this document lives.
* @param documentBundes List of GenericDocument bundles.
* @param userId Id of the calling user
+ * @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
* will be called with the cause throwable. Otherwise,
@@ -106,6 +107,7 @@
in String databaseName,
in List<Bundle> documentBundles,
in int userId,
+ in long binderCallStartTimeMillis,
in IAppSearchBatchResultCallback callback);
/**
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index b46e85d..35c441e 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -18,6 +18,7 @@
import static android.app.appsearch.AppSearchResult.throwableToFailedResult;
import static android.os.UserHandle.USER_NULL;
+import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -45,6 +46,7 @@
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.ArrayMap;
@@ -57,6 +59,9 @@
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.appsearch.external.localstorage.AppSearchImpl;
+import com.android.server.appsearch.external.localstorage.stats.CallStats;
+import com.android.server.appsearch.stats.LoggerInstanceManager;
+import com.android.server.appsearch.stats.PlatformLogger;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -80,6 +85,7 @@
private PackageManagerInternal mPackageManagerInternal;
private ImplInstanceManager mImplInstanceManager;
private UserManager mUserManager;
+ private LoggerInstanceManager mLoggerInstanceManager;
// Never call shutdownNow(). It will cancel the futures it's returned. And since
// Executor#execute won't return anything, we will hang forever waiting for the execution.
@@ -106,6 +112,7 @@
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mImplInstanceManager = ImplInstanceManager.getInstance(mContext);
mUserManager = mContext.getSystemService(UserManager.class);
+ mLoggerInstanceManager = LoggerInstanceManager.getInstance();
registerReceivers();
}
@@ -147,6 +154,7 @@
private void handleUserRemoved(@UserIdInt int userId) {
try {
mImplInstanceManager.removeAppSearchImplForUser(userId);
+ mLoggerInstanceManager.removePlatformLoggerForUser(userId);
Slog.i(TAG, "Removed AppSearchImpl instance for user: " + userId);
} catch (Throwable t) {
Slog.e(TAG, "Unable to remove data for user: " + userId, t);
@@ -274,6 +282,7 @@
@NonNull String databaseName,
@NonNull List<Bundle> documentBundles,
@UserIdInt int userId,
+ @ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchBatchResultCallback callback) {
Preconditions.checkNotNull(packageName);
Preconditions.checkNotNull(databaseName);
@@ -282,6 +291,11 @@
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
EXECUTOR.execute(() -> {
+ long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
+ @AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
+ PlatformLogger logger = null;
+ int operationSuccessCount = 0;
+ int operationFailureCount = 0;
try {
verifyUserUnlocked(callingUserId);
verifyCallingPackage(callingUid, packageName);
@@ -289,20 +303,46 @@
new AppSearchBatchResult.Builder<>();
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(callingUserId);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
for (int i = 0; i < documentBundles.size(); i++) {
GenericDocument document = new GenericDocument(documentBundles.get(i));
try {
- impl.putDocument(packageName, databaseName, document,
- /*logger=*/ null);
+ impl.putDocument(packageName, databaseName, document, logger);
resultBuilder.setSuccess(document.getUri(), /*result=*/ null);
+ ++operationSuccessCount;
} catch (Throwable t) {
resultBuilder.setResult(document.getUri(),
throwableToFailedResult(t));
+ AppSearchResult<Void> result = throwableToFailedResult(t);
+ resultBuilder.setResult(document.getUri(), result);
+ // for failures, we would just log the one for last failure
+ statusCode = result.getResultCode();
+ ++operationFailureCount;
}
}
invokeCallbackOnResult(callback, resultBuilder.build());
} catch (Throwable t) {
invokeCallbackOnError(callback, t);
+ } finally {
+ if (logger != null) {
+ CallStats.Builder cBuilder = new CallStats.Builder(packageName,
+ databaseName)
+ .setCallType(CallStats.CALL_TYPE_PUT_DOCUMENTS)
+ // TODO(b/173532925) check the existing binder call latency chart
+ // is good enough for us:
+ // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4
+ .setEstimatedBinderLatencyMillis(
+ 2 * (int) (totalLatencyStartTimeMillis
+ - binderCallStartTimeMillis))
+ .setNumOperationsSucceeded(operationSuccessCount)
+ .setNumOperationsFailed(operationFailureCount);
+ cBuilder.getGeneralStatsBuilder()
+ .setStatusCode(statusCode)
+ .setTotalLatencyMillis(
+ (int) (SystemClock.elapsedRealtime()
+ - totalLatencyStartTimeMillis));
+ logger.logStats(cBuilder.build());
+ }
}
});
}
@@ -717,6 +757,7 @@
try {
verifyUserUnlocked(callingUserId);
mImplInstanceManager.getOrCreateAppSearchImpl(mContext, callingUserId);
+ mLoggerInstanceManager.getOrCreatePlatformLogger(getContext(), callingUserId);
invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null));
} catch (Throwable t) {
invokeCallbackOnError(callback, t);
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
index e82dd9a..af39b79 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
@@ -106,7 +106,6 @@
*
* @param userId The multi-user userId of the user that need to be removed.
*/
- @NonNull
public void removeAppSearchImplForUser(@UserIdInt int userId) {
synchronized (mInstancesLocked) {
mInstancesLocked.remove(userId);
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java
new file mode 100644
index 0000000..4544063
--- /dev/null
+++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.stats;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.content.Context;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.appsearch.AppSearchManagerService;
+
+/**
+ * Manages the lifecycle of instances of {@link PlatformLogger}.
+ *
+ * <p>These instances are managed per unique device-user.
+ */
+public final class LoggerInstanceManager {
+ // TODO(b/173532925) flags to control those three
+ // So probably we can't pass those three in the constructor but need to fetch the latest value
+ // every time we need them in the logger.
+ private static final int MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS = 100;
+ private static final int DEFAULT_SAMPLING_RATIO = 10;
+
+ private static volatile LoggerInstanceManager sLoggerInstanceManager;
+
+ @GuardedBy("mInstancesLocked")
+ private final SparseArray<PlatformLogger> mInstancesLocked = new SparseArray<>();
+
+ private LoggerInstanceManager() {
+ }
+
+ /**
+ * Gets an instance of {@link LoggerInstanceManager} to be used.
+ *
+ * <p>If no instance has been initialized yet, a new one will be created. Otherwise, the
+ * existing instance will be returned.
+ */
+ @NonNull
+ public static LoggerInstanceManager getInstance() {
+ if (sLoggerInstanceManager == null) {
+ synchronized (LoggerInstanceManager.class) {
+ if (sLoggerInstanceManager == null) {
+ sLoggerInstanceManager =
+ new LoggerInstanceManager();
+ }
+ }
+ }
+ return sLoggerInstanceManager;
+ }
+
+ /**
+ * Gets an instance of PlatformLogger for the given user, or creates one if none exists.
+ *
+ * @param context The context
+ * @param userId The multi-user userId of the device user calling AppSearch
+ * @return An initialized {@link PlatformLogger} for this user
+ */
+ @NonNull
+ public PlatformLogger getOrCreatePlatformLogger(
+ @NonNull Context context, @UserIdInt int userId) {
+ synchronized (mInstancesLocked) {
+ PlatformLogger instance = mInstancesLocked.get(userId);
+ if (instance == null) {
+ instance = new PlatformLogger(context, userId, new PlatformLogger.Config(
+ MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
+ DEFAULT_SAMPLING_RATIO,
+ // TODO(b/173532925) re-enable sampling ratios for different stats types
+ // once we have P/H flag manager setup in ag/13977824
+ /*samplingRatios=*/ new SparseIntArray()));
+ mInstancesLocked.put(userId, instance);
+ }
+ return instance;
+ }
+ }
+
+
+ /**
+ * Gets an instance of PlatformLogger for the given user.
+ *
+ * <p>This method should only be called by an initialized SearchSession, which has been already
+ * created the PlatformLogger instance for the given user.
+ *
+ * @param userId The multi-user userId of the device user calling AppSearch
+ * @return An initialized {@link PlatformLogger} for this user
+ * @throws IllegalStateException if {@link PlatformLogger} haven't created for the given user.
+ */
+ @NonNull
+ public PlatformLogger getPlatformLogger(@UserIdInt int userId) {
+ synchronized (mInstancesLocked) {
+ PlatformLogger instance = mInstancesLocked.get(userId);
+ if (instance == null) {
+ // Impossible scenario, user cannot call an uninitialized SearchSession,
+ // getInstance should always find the instance for the given user and never try to
+ // create an instance for this user again.
+ throw new IllegalStateException(
+ "PlatformLogger has never been created for this user: " + userId);
+ }
+ return instance;
+ }
+ }
+
+ /**
+ * Remove an instance of {@link PlatformLogger} for the given user.
+ *
+ * <p>This method should only be called if {@link AppSearchManagerService} receives an
+ * ACTION_USER_REMOVED, which the logger instance of given user should be removed.
+ *
+ * @param userId The multi-user userId of the user that need to be removed.
+ */
+ public void removePlatformLoggerForUser(@UserIdInt int userId) {
+ synchronized (mInstancesLocked) {
+ mInstancesLocked.remove(userId);
+ }
+ }
+}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
index aeb66d9..1c04d99 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
@@ -17,21 +17,26 @@
package com.android.server.appsearch.stats;
import android.annotation.NonNull;
-import android.annotation.Nullable;
+import android.app.appsearch.exceptions.AppSearchException;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Process;
import android.os.SystemClock;
import android.util.ArrayMap;
+import android.util.Log;
import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.Preconditions;
import com.android.server.appsearch.external.localstorage.AppSearchLogger;
import com.android.server.appsearch.external.localstorage.stats.CallStats;
import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.Random;
@@ -120,19 +125,18 @@
* @param minTimeIntervalBetweenSamplesMillis minimum time interval apart in Milliseconds
* required for two consecutive stats logged
* @param defaultSamplingRatio default sampling ratio
- * @param samplingRatios SparseArray to customize sampling ratio for
+ * @param samplingRatios SparseArray to customize sampling ratio for
* different stat types
*/
public Config(long minTimeIntervalBetweenSamplesMillis,
int defaultSamplingRatio,
- @Nullable SparseIntArray samplingRatios) {
+ @NonNull SparseIntArray samplingRatios) {
+ // TODO(b/173532925) Probably we can get rid of those three after we have p/h flags
+ // for them.
+ // e.g. we can just call DeviceConfig.get(SAMPLING_RATIO_FOR_PUT_DOCUMENTS).
mMinTimeIntervalBetweenSamplesMillis = minTimeIntervalBetweenSamplesMillis;
mDefaultSamplingRatio = defaultSamplingRatio;
- if (samplingRatios != null) {
- mSamplingRatios = samplingRatios;
- } else {
- mSamplingRatios = new SparseIntArray();
- }
+ mSamplingRatios = samplingRatios;
}
}
@@ -169,7 +173,7 @@
Preconditions.checkNotNull(stats);
synchronized (mLock) {
if (shouldLogForTypeLocked(stats.getCallType())) {
- logToWestworldLocked(stats);
+ logStatsImplLocked(stats);
}
}
}
@@ -180,7 +184,7 @@
Preconditions.checkNotNull(stats);
synchronized (mLock) {
if (shouldLogForTypeLocked(CallStats.CALL_TYPE_PUT_DOCUMENT)) {
- logToWestworldLocked(stats);
+ logStatsImplLocked(stats);
}
}
}
@@ -201,25 +205,103 @@
}
@GuardedBy("mLock")
- private void logToWestworldLocked(@NonNull CallStats stats) {
+ private void logStatsImplLocked(@NonNull CallStats stats) {
mLastPushTimeMillisLocked = SystemClock.elapsedRealtime();
ExtraStats extraStats = createExtraStatsLocked(stats.getGeneralStats().getPackageName(),
stats.getCallType());
- /* TODO(b/173532925) Log the CallStats to Westworld
- stats.log(..., samplingRatio, skippedSampleCount, ...)
- */
+ String database = stats.getGeneralStats().getDatabase();
+ try {
+ int hashCodeForDatabase = calculateHashCodeMd5(database);
+ FrameworkStatsLog.write(FrameworkStatsLog.APP_SEARCH_CALL_STATS_REPORTED,
+ extraStats.mSamplingRatio,
+ extraStats.mSkippedSampleCount,
+ extraStats.mPackageUid,
+ hashCodeForDatabase,
+ stats.getGeneralStats().getStatusCode(),
+ stats.getGeneralStats().getTotalLatencyMillis(),
+ stats.getCallType(),
+ stats.getEstimatedBinderLatencyMillis(),
+ stats.getNumOperationsSucceeded(),
+ stats.getNumOperationsFailed());
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+ // TODO(b/184204720) report hashing error to Westworld
+ // We need to set a special value(e.g. 0xFFFFFFFF) for the hashing of the database,
+ // so in the dashboard we know there is some error for hashing.
+ //
+ // Something is wrong while calculating the hash code for database
+ // this shouldn't happen since we always use "MD5" and "UTF-8"
+ Log.e(TAG, "Error calculating hash code for database " + database, e);
+ }
}
@GuardedBy("mLock")
- private void logToWestworldLocked(@NonNull PutDocumentStats stats) {
+ private void logStatsImplLocked(@NonNull PutDocumentStats stats) {
mLastPushTimeMillisLocked = SystemClock.elapsedRealtime();
ExtraStats extraStats = createExtraStatsLocked(stats.getGeneralStats().getPackageName(),
CallStats.CALL_TYPE_PUT_DOCUMENT);
- /* TODO(b/173532925) Log the PutDocumentStats to Westworld
- stats.log(..., samplingRatio, skippedSampleCount, ...)
- */
+ String database = stats.getGeneralStats().getDatabase();
+ try {
+ int hashCodeForDatabase = calculateHashCodeMd5(database);
+ FrameworkStatsLog.write(FrameworkStatsLog.APP_SEARCH_PUT_DOCUMENT_STATS_REPORTED,
+ extraStats.mSamplingRatio,
+ extraStats.mSkippedSampleCount,
+ extraStats.mPackageUid,
+ hashCodeForDatabase,
+ stats.getGeneralStats().getStatusCode(),
+ stats.getGeneralStats().getTotalLatencyMillis(),
+ stats.getGenerateDocumentProtoLatencyMillis(),
+ stats.getRewriteDocumentTypesLatencyMillis(),
+ stats.getNativeLatencyMillis(),
+ stats.getNativeDocumentStoreLatencyMillis(),
+ stats.getNativeIndexLatencyMillis(),
+ stats.getNativeIndexMergeLatencyMillis(),
+ stats.getNativeDocumentSizeBytes(),
+ stats.getNativeNumTokensIndexed(),
+ stats.getNativeExceededMaxNumTokens());
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+ // TODO(b/184204720) report hashing error to Westworld
+ // We need to set a special value(e.g. 0xFFFFFFFF) for the hashing of the database,
+ // so in the dashboard we know there is some error for hashing.
+ //
+ // Something is wrong while calculating the hash code for database
+ // this shouldn't happen since we always use "MD5" and "UTF-8"
+ Log.e(TAG, "Error calculating hash code for database " + database, e);
+ }
}
+ /**
+ * Calculate the hash code as an integer by returning the last four bytes of its MD5.
+ *
+ * @param str a string
+ * @return hash code as an integer
+ * @throws AppSearchException if either algorithm or encoding does not exist.
+ */
+ @VisibleForTesting
+ @NonNull
+ static int calculateHashCodeMd5(@NonNull String str) throws
+ NoSuchAlgorithmException, UnsupportedEncodingException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(str.getBytes(/*charsetName=*/ "UTF-8"));
+ byte[] digest = md.digest();
+
+ // Since MD5 generates 16 bytes digest, we don't need to check the length here to see
+ // if it is smaller than sizeof(int)(4).
+ //
+ // We generate the same value as BigInteger(digest).intValue().
+ // BigInteger takes bytes[] and treat it as big endian. And its intValue() would get the
+ // lower 4 bytes. So here we take the last 4 bytes and treat them as big endian.
+ return (digest[12] & 0xFF) << 24
+ | (digest[13] & 0xFF) << 16
+ | (digest[14] & 0xFF) << 8
+ | (digest[15] & 0xFF);
+ }
+
+ /**
+ * Creates {@link ExtraStats} to hold additional information generated for logging.
+ *
+ * <p>This method is called by most of logToWestworldLocked functions to reduce code
+ * duplication.
+ */
@VisibleForTesting
@GuardedBy("mLock")
@NonNull
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
index 3ea1922..88f3df8 100644
--- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java
+++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
@@ -23,6 +23,7 @@
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
@@ -1132,12 +1133,31 @@
}
/**
- * Called to check if the caller has permission to use alarms set via {@link }
- * @return
+ * Called to check if the caller has the permission
+ * {@link Manifest.permission#SCHEDULE_EXACT_ALARM}.
+ *
+ * Apps can start {@link android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM} to
+ * request this from the user.
+ *
+ * @return {@code true} if the caller has the permission, {@code false} otherwise.
+ * @see android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM
*/
public boolean canScheduleExactAlarms() {
+ return hasScheduleExactAlarm(mContext.getOpPackageName(), mContext.getUserId());
+ }
+
+ /**
+ * Called to check if the given package in the given user has the permission
+ * {@link Manifest.permission#SCHEDULE_EXACT_ALARM}.
+ *
+ * <p><em>Note: This is only for use by system components.</em>
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean hasScheduleExactAlarm(@NonNull String packageName, int userId) {
try {
- return mService.canScheduleExactAlarms();
+ return mService.hasScheduleExactAlarm(packageName, userId);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
index a10cbbe..cd7c1e8 100644
--- a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
+++ b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
@@ -41,6 +41,6 @@
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
AlarmManager.AlarmClockInfo getNextAlarmClock(int userId);
long currentNetworkTimeMillis();
- boolean canScheduleExactAlarms();
+ boolean hasScheduleExactAlarm(String packageName, int userId);
int getConfigVersion();
}
diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
index d459c05..44e87c3 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
@@ -176,8 +176,6 @@
/** @hide */
public static final int REASON_DEVICE_DEMO_MODE = 63;
/** @hide */
- public static final int REASON_EXEMPTED_PACKAGE = 64;
- /** @hide */
public static final int REASON_ALLOWLISTED_PACKAGE = 65;
/** @hide */
public static final int REASON_APPOP = 66;
@@ -344,7 +342,6 @@
REASON_INSTR_BACKGROUND_FGS_PERMISSION,
REASON_SYSTEM_ALERT_WINDOW_PERMISSION,
REASON_DEVICE_DEMO_MODE,
- REASON_EXEMPTED_PACKAGE,
REASON_ALLOWLISTED_PACKAGE,
REASON_APPOP,
REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD,
@@ -601,8 +598,6 @@
return "SYSTEM_ALERT_WINDOW_PERMISSION";
case REASON_DEVICE_DEMO_MODE:
return "DEVICE_DEMO_MODE";
- case REASON_EXEMPTED_PACKAGE:
- return "EXEMPTED_PACKAGE";
case REASON_ALLOWLISTED_PACKAGE:
return "ALLOWLISTED_PACKAGE";
case REASON_APPOP:
diff --git a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java
index 07231b0..29a5dee 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java
@@ -176,8 +176,6 @@
/** @hide */
public static final int REASON_DEVICE_DEMO_MODE = PowerExemptionManager.REASON_DEVICE_DEMO_MODE;
/** @hide */
- public static final int REASON_EXEMPTED_PACKAGE = PowerExemptionManager.REASON_EXEMPTED_PACKAGE;
- /** @hide */
public static final int REASON_ALLOWLISTED_PACKAGE =
PowerExemptionManager.REASON_ALLOWLISTED_PACKAGE;
/** @hide */
@@ -341,7 +339,6 @@
REASON_INSTR_BACKGROUND_FGS_PERMISSION,
REASON_SYSTEM_ALERT_WINDOW_PERMISSION,
REASON_DEVICE_DEMO_MODE,
- REASON_EXEMPTED_PACKAGE,
REASON_ALLOWLISTED_PACKAGE,
REASON_APPOP,
// temp and system allowlist reasons.
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 08e1a95..7a36141 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -126,6 +126,8 @@
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
+import libcore.util.EmptyArray;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
@@ -139,6 +141,7 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.Random;
+import java.util.Set;
import java.util.TimeZone;
import java.util.TreeSet;
import java.util.function.Predicate;
@@ -194,6 +197,7 @@
DeviceIdleInternal mLocalDeviceIdleController;
private UsageStatsManagerInternal mUsageStatsManagerInternal;
private ActivityManagerInternal mActivityManagerInternal;
+ private PackageManagerInternal mPackageManagerInternal;
final Object mLock = new Object();
@@ -262,10 +266,12 @@
interface Stats {
int REORDER_ALARMS_FOR_STANDBY = 0;
+ int HAS_SCHEDULE_EXACT_ALARM = 1;
}
private final StatLogger mStatLogger = new StatLogger("Alarm manager stats", new String[]{
"REORDER_ALARMS_FOR_STANDBY",
+ "HAS_SCHEDULE_EXACT_ALARM",
});
BroadcastOptions mOptsWithFgs = BroadcastOptions.makeBasic();
@@ -383,6 +389,9 @@
*/
@VisibleForTesting
final class Constants implements DeviceConfig.OnPropertiesChangedListener {
+ @VisibleForTesting
+ static final int MAX_EXACT_ALARM_DENY_LIST_SIZE = 250;
+
// Key names stored in the settings value.
@VisibleForTesting
static final String KEY_MIN_FUTURITY = "min_futurity";
@@ -437,6 +446,8 @@
static final String KEY_CRASH_NON_CLOCK_APPS = "crash_non_clock_apps";
@VisibleForTesting
static final String KEY_PRIORITY_ALARM_DELAY = "priority_alarm_delay";
+ @VisibleForTesting
+ static final String KEY_EXACT_ALARM_DENY_LIST = "exact_alarm_deny_list";
private static final long DEFAULT_MIN_FUTURITY = 5 * 1000;
private static final long DEFAULT_MIN_INTERVAL = 60 * 1000;
@@ -537,6 +548,12 @@
*/
public long PRIORITY_ALARM_DELAY = DEFAULT_PRIORITY_ALARM_DELAY;
+ /**
+ * Set of apps that won't get SCHEDULE_EXACT_ALARM when the app-op mode for
+ * OP_SCHEDULE_EXACT_ALARM is MODE_DEFAULT.
+ */
+ public Set<String> EXACT_ALARM_DENY_LIST = Collections.emptySet();
+
private long mLastAllowWhileIdleWhitelistDuration = -1;
private int mVersion = 0;
@@ -686,6 +703,21 @@
PRIORITY_ALARM_DELAY = properties.getLong(KEY_PRIORITY_ALARM_DELAY,
DEFAULT_PRIORITY_ALARM_DELAY);
break;
+ case KEY_EXACT_ALARM_DENY_LIST:
+ final String rawValue = properties.getString(KEY_EXACT_ALARM_DENY_LIST,
+ "");
+ final String[] values = rawValue.isEmpty()
+ ? EmptyArray.STRING
+ : rawValue.split(",", MAX_EXACT_ALARM_DENY_LIST_SIZE + 1);
+ if (values.length > MAX_EXACT_ALARM_DENY_LIST_SIZE) {
+ Slog.w(TAG, "Deny list too long, truncating to "
+ + MAX_EXACT_ALARM_DENY_LIST_SIZE + " elements.");
+ updateExactAlarmDenyList(
+ Arrays.copyOf(values, MAX_EXACT_ALARM_DENY_LIST_SIZE));
+ } else {
+ updateExactAlarmDenyList(values);
+ }
+ break;
default:
if (name.startsWith(KEY_PREFIX_STANDBY_QUOTA) && !standbyQuotaUpdated) {
// The quotas need to be updated in order, so we can't just rely
@@ -699,6 +731,21 @@
}
}
+ private void updateExactAlarmDenyList(String[] newDenyList) {
+ if (newDenyList.length == 0) {
+ EXACT_ALARM_DENY_LIST = Collections.emptySet();
+ } else {
+ final Set<String> oldSet = EXACT_ALARM_DENY_LIST;
+ final Set<String> newlyAdded = new ArraySet<>(newDenyList);
+ EXACT_ALARM_DENY_LIST = Collections.unmodifiableSet(new ArraySet<>(newlyAdded));
+ newlyAdded.removeAll(oldSet);
+ if (newlyAdded.size() > 0) {
+ mHandler.obtainMessage(AlarmHandler.EXACT_ALARM_DENY_LIST_CHANGED, newlyAdded)
+ .sendToTarget();
+ }
+ }
+ }
+
private void migrateAlarmsToNewStoreLocked() {
final AlarmStore newStore = LAZY_BATCHING ? new LazyAlarmStore()
: new BatchingAlarmStore();
@@ -841,6 +888,9 @@
TimeUtils.formatDuration(PRIORITY_ALARM_DELAY, pw);
pw.println();
+ pw.print(KEY_EXACT_ALARM_DENY_LIST, EXACT_ALARM_DENY_LIST);
+ pw.println();
+
pw.decreaseIndent();
}
@@ -1428,8 +1478,9 @@
mInjector.setKernelTime(systemBuildTime);
}
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
// Determine SysUI's uid
- mSystemUiUid = mInjector.getSystemUiUid();
+ mSystemUiUid = mInjector.getSystemUiUid(mPackageManagerInternal);
if (mSystemUiUid <= 0) {
Slog.wtf(TAG, "SysUI package not found!");
}
@@ -1504,10 +1555,7 @@
if (op != AppOpsManager.OP_SCHEDULE_EXACT_ALARM) {
return;
}
- final int mode = mAppOpsService.checkOperation(op, uid,
- packageName);
- if (mode != AppOpsManager.MODE_ALLOWED
- && mode != AppOpsManager.MODE_DEFAULT) {
+ if (!hasScheduleExactAlarmInternal(packageName, uid)) {
mHandler.obtainMessage(AlarmHandler.REMOVE_EXACT_ALARMS,
uid, 0, packageName).sendToTarget();
}
@@ -2029,6 +2077,11 @@
}
@Override
+ public boolean hasScheduleExactAlarm(String packageName, int uid) {
+ return hasScheduleExactAlarmInternal(packageName, uid);
+ }
+
+ @Override
public void registerInFlightListener(InFlightListener callback) {
synchronized (mLock) {
mInFlightListeners.add(callback);
@@ -2036,6 +2089,21 @@
}
}
+ boolean hasScheduleExactAlarmInternal(String packageName, int uid) {
+ final long start = mStatLogger.getTime();
+ // No locking needed as EXACT_ALARM_DENY_LIST is immutable.
+ final boolean isOnDenyList = mConstants.EXACT_ALARM_DENY_LIST.contains(packageName);
+ if (isOnDenyList && mAppOps.checkOpNoThrow(AppOpsManager.OP_SCHEDULE_EXACT_ALARM, uid,
+ packageName) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
+ final boolean has = PermissionChecker.checkPermissionForPreflight(getContext(),
+ Manifest.permission.SCHEDULE_EXACT_ALARM, -1, uid, packageName)
+ == PermissionChecker.PERMISSION_GRANTED;
+ mStatLogger.logDurationStat(Stats.HAS_SCHEDULE_EXACT_ALARM, start);
+ return has;
+ }
+
/**
* Returns true if the given uid does not require SCHEDULE_EXACT_ALARM to set exact,
* allow-while-idle alarms.
@@ -2056,11 +2124,16 @@
int type, long triggerAtTime, long windowLength, long interval, int flags,
PendingIntent operation, IAlarmListener directReceiver, String listenerTag,
WorkSource workSource, AlarmManager.AlarmClockInfo alarmClock) {
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mInjector.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
// make sure the caller is not lying about which package should be blamed for
// wakelock time spent in alarm delivery
- mAppOps.checkPackage(callingUid, callingPackage);
+ if (callingUid != mPackageManagerInternal.getPackageUid(callingPackage, 0,
+ callingUserId)) {
+ throw new SecurityException("Package " + callingPackage
+ + " does not belong to the calling uid " + callingUid);
+ }
final boolean allowWhileIdle = (flags & FLAG_ALLOW_WHILE_IDLE) != 0;
final boolean exact = (windowLength == AlarmManager.WINDOW_EXACT);
@@ -2077,7 +2150,7 @@
final boolean needsPermission;
boolean lowerQuota;
if (CompatChanges.isChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION,
- callingPackage, UserHandle.getUserHandleForUid(callingUid))) {
+ callingPackage, UserHandle.of(callingUserId))) {
needsPermission = exact;
lowerQuota = !exact;
idleOptions = exact ? mOptsWithFgs.toBundle() : mOptsWithoutFgs.toBundle();
@@ -2086,7 +2159,7 @@
lowerQuota = allowWhileIdle;
idleOptions = allowWhileIdle ? mOptsWithFgs.toBundle() : null;
}
- if (needsPermission && !canScheduleExactAlarms()) {
+ if (needsPermission && !hasScheduleExactAlarmInternal(callingPackage, callingUid)) {
if (alarmClock != null || !isExemptFromExactAlarmPermission(callingUid)) {
final String errorMessage = "Caller " + callingPackage + " needs to hold "
+ Manifest.permission.SCHEDULE_EXACT_ALARM + " to set "
@@ -2165,10 +2238,18 @@
}
@Override
- public boolean canScheduleExactAlarms() {
- return PermissionChecker.checkCallingOrSelfPermissionForPreflight(getContext(),
- Manifest.permission.SCHEDULE_EXACT_ALARM)
- == PermissionChecker.PERMISSION_GRANTED;
+ public boolean hasScheduleExactAlarm(String packageName, int userId) {
+ final int callingUid = mInjector.getCallingUid();
+ if (UserHandle.getUserId(callingUid) != userId) {
+ getContext().enforceCallingOrSelfPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL, "hasScheduleExactAlarm");
+ }
+ final int uid = mPackageManagerInternal.getPackageUid(packageName, 0, userId);
+ if (callingUid != uid && !UserHandle.isCore(callingUid)) {
+ throw new SecurityException("Uid " + callingUid
+ + " cannot query hasScheduleExactAlarm for uid " + uid);
+ }
+ return (uid > 0) ? hasScheduleExactAlarmInternal(packageName, uid) : false;
}
@Override
@@ -3072,27 +3153,63 @@
}
/**
+ * Called when some packages are added to the {@link Constants#EXACT_ALARM_DENY_LIST}, as this
+ * may cause some of them to lose their permission.
+ *
+ * Note that these packages don't need to be installed on the device, but if they do have an
+ * exact alarm scheduled and they lose the permission, this alarm will be canceled.
+ *
+ * This is not expected to get called frequently.
+ */
+ void handlePackagesAddedToExactAlarmsDenyListLocked(ArraySet<String> packageNames) {
+ Slog.w(TAG, "Packages " + packageNames + " added to the exact alarm deny list.");
+ final Predicate<Alarm> whichAlarms = a -> {
+ if (!packageNames.contains(a.packageName) || a.windowLength != 0) {
+ return false;
+ }
+ if (!CompatChanges.isChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION,
+ a.packageName, UserHandle.getUserHandleForUid(a.uid))) {
+ return false;
+ }
+ if (a.alarmClock == null && isExemptFromExactAlarmPermission(a.uid)) {
+ return false;
+ }
+ return !hasScheduleExactAlarmInternal(a.packageName, a.uid);
+ };
+ removeAlarmsInternalLocked(whichAlarms);
+ }
+
+ /**
* Called when an app loses {@link Manifest.permission#SCHEDULE_EXACT_ALARM} to remove alarms
* that the app is no longer eligible to use.
+ *
+ * This is not expected to get called frequently.
* TODO (b/179541791): Add revocation history to dumpsys.
*/
void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
- if (isExemptFromExactAlarmPermission(uid)) {
- return;
- }
+ Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
if (!CompatChanges.isChangeEnabled(
AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION,
packageName, UserHandle.getUserHandleForUid(uid))) {
return;
}
- final Predicate<Alarm> whichAlarms =
- a -> (a.uid == uid && a.packageName.equals(packageName)
- && a.windowLength == AlarmManager.WINDOW_EXACT);
- final ArrayList<Alarm> removed = mAlarmStore.remove(whichAlarms);
- final boolean didRemove = !removed.isEmpty();
+ final Predicate<Alarm> whichAlarms = a -> {
+ if (a.uid == uid && a.packageName.equals(packageName) && a.windowLength == 0) {
+ return a.alarmClock != null || !isExemptFromExactAlarmPermission(uid);
+ }
+ return false;
+ };
+ removeAlarmsInternalLocked(whichAlarms);
+ }
+
+ private void removeAlarmsInternalLocked(Predicate<Alarm> whichAlarms) {
+ final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(whichAlarms);
+ final boolean didRemove = !removedAlarms.isEmpty();
if (didRemove) {
- decrementAlarmCount(uid, removed.size());
+ for (final Alarm removed : removedAlarms) {
+ decrementAlarmCount(removed.uid, 1);
+ }
}
for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
@@ -3119,21 +3236,22 @@
}
if (didRemove) {
+ boolean idleUntilUpdated = false;
+ if (mPendingIdleUntil != null && whichAlarms.test(mPendingIdleUntil)) {
+ mPendingIdleUntil = null;
+ idleUntilUpdated = true;
+ }
if (mNextWakeFromIdle != null && whichAlarms.test(mNextWakeFromIdle)) {
mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
if (mPendingIdleUntil != null) {
- final boolean idleUntilUpdated = mAlarmStore.updateAlarmDeliveries(alarm -> {
- if (alarm != mPendingIdleUntil) {
- return false;
- }
- return adjustIdleUntilTime(alarm);
- });
- if (idleUntilUpdated) {
- mAlarmStore.updateAlarmDeliveries(
- alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
- }
+ idleUntilUpdated |= mAlarmStore.updateAlarmDeliveries(alarm ->
+ (alarm == mPendingIdleUntil && adjustIdleUntilTime(alarm)));
}
}
+ if (idleUntilUpdated) {
+ mAlarmStore.updateAlarmDeliveries(
+ alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
+ }
rescheduleKernelAlarmsLocked();
updateNextAlarmClockLocked();
}
@@ -3147,63 +3265,7 @@
}
return;
}
-
- final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(
- a -> a.matches(operation, directReceiver));
- for (final Alarm removed : removedAlarms) {
- decrementAlarmCount(removed.uid, 1);
- }
- final boolean didRemove = !removedAlarms.isEmpty();
-
- for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
- final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.valueAt(i);
- for (int j = alarmsForUid.size() - 1; j >= 0; j--) {
- final Alarm alarm = alarmsForUid.get(j);
- if (alarm.matches(operation, directReceiver)) {
- // Don't set didRemove, since this doesn't impact the scheduled alarms.
- alarmsForUid.remove(j);
- decrementAlarmCount(alarm.uid, 1);
- }
- }
- if (alarmsForUid.size() == 0) {
- mPendingBackgroundAlarms.removeAt(i);
- }
- }
- for (int i = mPendingNonWakeupAlarms.size() - 1; i >= 0; i--) {
- final Alarm a = mPendingNonWakeupAlarms.get(i);
- if (a.matches(operation, directReceiver)) {
- // Don't set didRemove, since this doesn't impact the scheduled alarms.
- mPendingNonWakeupAlarms.remove(i);
- decrementAlarmCount(a.uid, 1);
- }
- }
- if (didRemove) {
- if (DEBUG_BATCH) {
- Slog.v(TAG, "remove(operation) changed bounds; rebatching");
- }
- boolean idleUntilUpdated = false;
- if (mPendingIdleUntil != null && mPendingIdleUntil.matches(operation, directReceiver)) {
- mPendingIdleUntil = null;
- idleUntilUpdated = true;
- }
- if (mNextWakeFromIdle != null && mNextWakeFromIdle.matches(operation, directReceiver)) {
- mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
- if (mPendingIdleUntil != null) {
- idleUntilUpdated |= mAlarmStore.updateAlarmDeliveries(alarm -> {
- if (alarm != mPendingIdleUntil) {
- return false;
- }
- return adjustIdleUntilTime(alarm);
- });
- }
- }
- if (idleUntilUpdated) {
- mAlarmStore.updateAlarmDeliveries(
- alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
- }
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
+ removeAlarmsInternalLocked(a -> a.matches(operation, directReceiver));
}
void removeLocked(final int uid) {
@@ -3211,55 +3273,7 @@
// If a force-stop occurs for a system-uid package, ignore it.
return;
}
-
- final ArrayList<Alarm> removed = mAlarmStore.remove(a -> a.uid == uid);
- final boolean didRemove = !removed.isEmpty();
- if (didRemove) {
- decrementAlarmCount(uid, removed.size());
- }
-
- for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
- final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.valueAt(i);
- for (int j = alarmsForUid.size() - 1; j >= 0; j--) {
- if (alarmsForUid.get(j).uid == uid) {
- alarmsForUid.remove(j);
- decrementAlarmCount(uid, 1);
- }
- }
- if (alarmsForUid.size() == 0) {
- mPendingBackgroundAlarms.removeAt(i);
- }
- }
- // If we're currently using this app's alarms to come out of doze,
- // make sure to reset to any remaining WAKE_FROM_IDLE alarms.
- boolean idleUntilUpdated = false;
- if (mNextWakeFromIdle != null && mNextWakeFromIdle.uid == uid) {
- mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
- if (mPendingIdleUntil != null) {
- idleUntilUpdated |= mAlarmStore.updateAlarmDeliveries(alarm -> {
- if (alarm != mPendingIdleUntil) {
- return false;
- }
- return adjustIdleUntilTime(alarm);
- });
- }
- }
- if (mPendingIdleUntil != null && mPendingIdleUntil.uid == uid) {
- // Should never happen - only the system uid is allowed to set idle-until alarms
- Slog.wtf(TAG, "Removed app uid " + uid + " set idle-until alarm!");
- mPendingIdleUntil = null;
- idleUntilUpdated = true;
- }
- if (idleUntilUpdated) {
- mAlarmStore.updateAlarmDeliveries(alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
- }
- if (didRemove) {
- if (DEBUG_BATCH) {
- Slog.v(TAG, "remove(uid) changed bounds; rebatching");
- }
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
+ removeAlarmsInternalLocked(a -> a.uid == uid);
}
void removeLocked(final String packageName) {
@@ -3270,50 +3284,7 @@
}
return;
}
-
- final ArrayList<Alarm> removed = mAlarmStore.remove(a -> a.matches(packageName));
- final boolean didRemove = !removed.isEmpty();
- if (didRemove) {
- decrementAlarmCount(removed.get(0).uid, removed.size());
- }
-
- for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
- final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.valueAt(i);
- for (int j = alarmsForUid.size() - 1; j >= 0; j--) {
- final Alarm alarm = alarmsForUid.get(j);
- if (alarm.matches(packageName)) {
- alarmsForUid.remove(j);
- decrementAlarmCount(alarm.uid, 1);
- }
- }
- if (alarmsForUid.size() == 0) {
- mPendingBackgroundAlarms.removeAt(i);
- }
- }
- // If we're currently using this app's alarms to come out of doze,
- // make sure to reset to any remaining WAKE_FROM_IDLE alarms.
- if (mNextWakeFromIdle != null && mNextWakeFromIdle.matches(packageName)) {
- mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
- if (mPendingIdleUntil != null) {
- final boolean updated = mAlarmStore.updateAlarmDeliveries(alarm -> {
- if (alarm != mPendingIdleUntil) {
- return false;
- }
- return adjustIdleUntilTime(alarm);
- });
- if (updated) {
- mAlarmStore.updateAlarmDeliveries(
- alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
- }
- }
- }
- if (didRemove) {
- if (DEBUG_BATCH) {
- Slog.v(TAG, "remove(package) changed bounds; rebatching");
- }
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
+ removeAlarmsInternalLocked(a -> a.matches(packageName));
}
// Only called for ephemeral apps
@@ -3324,28 +3295,7 @@
}
final Predicate<Alarm> whichAlarms = (a) -> (a.uid == uid
&& mActivityManagerInternal.isAppStartModeDisabled(uid, a.packageName));
- final ArrayList<Alarm> removed = mAlarmStore.remove(whichAlarms);
- final boolean didRemove = !removed.isEmpty();
- if (didRemove) {
- decrementAlarmCount(uid, removed.size());
- }
-
- for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
- if (mPendingBackgroundAlarms.keyAt(i) == uid) {
- final ArrayList<Alarm> toRemove = mPendingBackgroundAlarms.valueAt(i);
- if (toRemove != null) {
- decrementAlarmCount(uid, toRemove.size());
- }
- mPendingBackgroundAlarms.removeAt(i);
- }
- }
- if (didRemove) {
- if (DEBUG_BATCH) {
- Slog.v(TAG, "remove(package) changed bounds; rebatching");
- }
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
+ removeAlarmsInternalLocked(whichAlarms);
}
void removeUserLocked(int userHandle) {
@@ -3720,6 +3670,10 @@
}
}
+ int getCallingUid() {
+ return Binder.getCallingUid();
+ }
+
long getNextAlarm(int type) {
return AlarmManagerService.getNextAlarm(mNativeData, type);
}
@@ -3751,8 +3705,7 @@
return pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*alarm*");
}
- int getSystemUiUid() {
- PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ int getSystemUiUid(PackageManagerInternal pm) {
return pm.getPackageUid(pm.getSystemUiServiceComponent().getPackageName(),
MATCH_SYSTEM_ONLY, USER_SYSTEM);
}
@@ -3962,6 +3915,7 @@
public static final int CHARGING_STATUS_CHANGED = 6;
public static final int REMOVE_FOR_CANCELED = 7;
public static final int REMOVE_EXACT_ALARMS = 8;
+ public static final int EXACT_ALARM_DENY_LIST_CHANGED = 9;
AlarmHandler() {
super(Looper.myLooper());
@@ -4048,7 +4002,11 @@
removeExactAlarmsOnPermissionRevokedLocked(uid, packageName);
}
break;
-
+ case EXACT_ALARM_DENY_LIST_CHANGED:
+ synchronized (mLock) {
+ handlePackagesAddedToExactAlarmsDenyListLocked((ArraySet<String>) msg.obj);
+ }
+ break;
default:
// nope, just ignore it
break;
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index a62e258..97ee0e1 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -49,6 +49,7 @@
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
@@ -111,6 +112,7 @@
import com.android.internal.app.IBatteryStats;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ConcurrentUtils;
+import com.android.server.AlarmManagerInternal;
import com.android.server.JobSchedulerBackgroundThread;
import com.android.server.LocalServices;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -1191,6 +1193,10 @@
if (mInjector.isWellbeingPackage(packageName)) {
return STANDBY_BUCKET_WORKING_SET;
}
+
+ if (mInjector.hasScheduleExactAlarm(packageName, UserHandle.getUid(userId, appId))) {
+ return STANDBY_BUCKET_WORKING_SET;
+ }
}
// Check this last, as it can be the most expensive check
@@ -1202,6 +1208,11 @@
return STANDBY_BUCKET_ACTIVE;
}
+ if (mPackageManager.checkPermission(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,
+ packageName) == PERMISSION_GRANTED) {
+ return STANDBY_BUCKET_FREQUENT;
+ }
+
return STANDBY_BUCKET_NEVER;
}
@@ -2007,6 +2018,7 @@
private PowerManager mPowerManager;
private IDeviceIdleController mDeviceIdleController;
private CrossProfileAppsInternal mCrossProfileAppsInternal;
+ private AlarmManagerInternal mAlarmManagerInternal;
int mBootPhase;
/**
* The minimum amount of time required since the last user interaction before an app can be
@@ -2047,6 +2059,7 @@
mBatteryManager = mContext.getSystemService(BatteryManager.class);
mCrossProfileAppsInternal = LocalServices.getService(
CrossProfileAppsInternal.class);
+ mAlarmManagerInternal = LocalServices.getService(AlarmManagerInternal.class);
final ActivityManager activityManager =
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
@@ -2110,6 +2123,10 @@
return mWellbeingApp != null && mWellbeingApp.equals(packageName);
}
+ boolean hasScheduleExactAlarm(String packageName, int uid) {
+ return mAlarmManagerInternal.hasScheduleExactAlarm(packageName, uid);
+ }
+
void updatePowerWhitelistCache() {
try {
// Don't call out to DeviceIdleController with the lock held.
diff --git a/apex/media/framework/lint-baseline.xml b/apex/media/framework/lint-baseline.xml
new file mode 100644
index 0000000..e1b1450
--- /dev/null
+++ b/apex/media/framework/lint-baseline.xml
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `new android.media.ApplicationMediaCapabilities.Builder`"
+ errorLine1=" new ApplicationMediaCapabilities.Builder();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java"
+ line="208"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `new android.media.ApplicationMediaCapabilities.Builder`"
+ errorLine1=" ApplicationMediaCapabilities.Builder builder = new ApplicationMediaCapabilities.Builder();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java"
+ line="314"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.os.RemoteException#rethrowFromSystemServer`"
+ errorLine1=" e.rethrowFromSystemServer();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaCommunicationManager.java"
+ line="110"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.os.Parcel#writeParcelableCreator`"
+ errorLine1=" dest.writeParcelableCreator((Parcelable) parcelable);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParceledListSlice.java"
+ line="77"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.os.Parcel#readParcelableCreator`"
+ errorLine1=" return from.readParcelableCreator(loader);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParceledListSlice.java"
+ line="82"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.TrackData#mediaFormat`"
+ errorLine1=" this.mediaFormat = mediaFormat;"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="273"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.TrackData#drmInitData`"
+ errorLine1=" this.drmInitData = drmInitData;"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="274"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" this.timeMicros = timeMicros;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="295"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" this.position = position;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="296"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" return "[timeMicros=" + timeMicros + ", position=" + position + "]";"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="302"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" return "[timeMicros=" + timeMicros + ", position=" + position + "]";"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="302"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level R (current min is 29): `android.media.MediaParser.SeekPoint`"
+ errorLine1=" SeekPoint other = (SeekPoint) obj;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="313"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" return timeMicros == other.timeMicros && position == other.position;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="314"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" return timeMicros == other.timeMicros && position == other.position;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="314"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" return timeMicros == other.timeMicros && position == other.position;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="314"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" return timeMicros == other.timeMicros && position == other.position;"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="314"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" int result = (int) timeMicros;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="319"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" result = 31 * result + (int) position;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="320"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level R (current min is 29): `android.media.MediaParser.InputReader`"
+ errorLine1=" public interface SeekableInputReader extends InputReader {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="352"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 31 (current min is 29): `android.media.metrics.LogSessionId#LOG_SESSION_ID_NONE`"
+ errorLine1=" @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1071"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `SeekableInputReader` to `InputReader` requires API level 30 (current min is 29)"
+ errorLine1=" mExoDataReader.mInputReader = seekableInputReader;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1201"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" mPendingSeekPosition = seekPoint.position;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1287"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" mPendingSeekTimeMicros = seekPoint.timeMicros;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1288"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#position`"
+ errorLine1=" mExtractor.seek(seekPoint.position, seekPoint.timeMicros);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1290"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.MediaParser.SeekPoint#timeMicros`"
+ errorLine1=" mExtractor.seek(seekPoint.position, seekPoint.timeMicros);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1290"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level R (current min is 29): `android.media.DrmInitData.SchemeInitData#uuid`"
+ errorLine1=" if (schemeInitData.uuid.equals(schemeUuid)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1579"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level R (current min is 29): `android.media.MediaParser.InputReader`"
+ errorLine1=" private static final class DataReaderAdapter implements InputReader {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1872"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level R (current min is 29): `android.media.MediaParser.InputReader`"
+ errorLine1=" private static final class ParsableByteArrayAdapter implements InputReader {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/apex/media/framework/java/android/media/MediaParser.java"
+ line="1905"
+ column="68"/>
+ </issue>
+
+</issues>
diff --git a/api/Android.bp b/api/Android.bp
index 4baf7c1..6571270 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -336,6 +336,9 @@
genrule {
name: "combined-removed-dex",
+ visibility: [
+ "//frameworks/base/boot",
+ ],
srcs: [
":frameworks-base-api-removed.txt",
":frameworks-base-api-system-removed.txt",
diff --git a/boot/Android.bp b/boot/Android.bp
index 71edea2..844dd64 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -43,4 +43,49 @@
// done correctly.
platform_bootclasspath {
name: "platform-bootclasspath",
+
+ // Additional information needed by hidden api processing.
+ hidden_api: {
+ unsupported: [
+ "hiddenapi/hiddenapi-unsupported.txt",
+ ],
+ removed: [
+ ":combined-removed-dex",
+ ],
+ max_target_r_low_priority: [
+ "hiddenapi/hiddenapi-max-target-r-loprio.txt",
+ ],
+ max_target_q: [
+ "hiddenapi/hiddenapi-max-target-q.txt",
+ ],
+ max_target_p: [
+ "hiddenapi/hiddenapi-max-target-p.txt",
+ ],
+ max_target_o_low_priority: [
+ "hiddenapi/hiddenapi-max-target-o.txt",
+ ],
+ blocked: [
+ "hiddenapi/hiddenapi-force-blocked.txt",
+ ],
+ unsupported_packages: [
+ "hiddenapi/hiddenapi-unsupported-packages.txt",
+ ],
+ },
+
+ dists: [
+ {
+ targets: ["droidcore"],
+ tag: "hiddenapi-flags.csv",
+ },
+ {
+ targets: ["droidcore"],
+ tag: "hiddenapi-index.csv",
+ },
+ {
+ targets: ["droidcore"],
+ tag: "hiddenapi-metadata.csv",
+ // Legacy name
+ dest: "hiddenapi-unsupported.csv",
+ },
+ ],
}
diff --git a/core/api/current.txt b/core/api/current.txt
index ef1d9ef..6823f65 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -3960,6 +3960,7 @@
method public boolean isImmersive();
method public boolean isInMultiWindowMode();
method public boolean isInPictureInPictureMode();
+ method public boolean isLaunchedFromBubble();
method public boolean isLocalVoiceInteractionSupported();
method public boolean isTaskRoot();
method public boolean isVoiceInteraction();
@@ -5883,8 +5884,8 @@
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIcon(@NonNull android.graphics.drawable.Icon);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIntent(@NonNull android.app.PendingIntent);
- method @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressBubble(boolean);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressNotification(boolean);
+ method @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressableBubble(boolean);
}
public static class Notification.Builder {
@@ -7202,7 +7203,6 @@
method public boolean isComplianceAcknowledgementRequired();
method public boolean isDeviceIdAttestationSupported();
method public boolean isDeviceOwnerApp(String);
- method public boolean isEnterpriseNetworkPreferenceEnabled();
method public boolean isEphemeralUser(@NonNull android.content.ComponentName);
method public boolean isKeyPairGrantedToWifiAuth(@NonNull String);
method public boolean isLockTaskPermitted(String);
@@ -7213,6 +7213,7 @@
method public boolean isOrganizationOwnedDeviceWithManagedProfile();
method public boolean isOverrideApnEnabled(@NonNull android.content.ComponentName);
method public boolean isPackageSuspended(@NonNull android.content.ComponentName, String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public boolean isPreferentialNetworkServiceEnabled();
method public boolean isProfileOwnerApp(String);
method public boolean isProvisioningAllowed(@NonNull String);
method public boolean isResetPasswordTokenActive(android.content.ComponentName);
@@ -7264,7 +7265,6 @@
method public void setDelegatedScopes(@NonNull android.content.ComponentName, @NonNull String, @NonNull java.util.List<java.lang.String>);
method public void setDeviceOwnerLockScreenInfo(@NonNull android.content.ComponentName, CharSequence);
method public void setEndUserSessionMessage(@NonNull android.content.ComponentName, @Nullable CharSequence);
- method public void setEnterpriseNetworkPreferenceEnabled(boolean);
method public void setFactoryResetProtectionPolicy(@NonNull android.content.ComponentName, @Nullable android.app.admin.FactoryResetProtectionPolicy);
method public int setGlobalPrivateDnsModeOpportunistic(@NonNull android.content.ComponentName);
method @WorkerThread public int setGlobalPrivateDnsModeSpecifiedHost(@NonNull android.content.ComponentName, @NonNull String);
@@ -7307,6 +7307,7 @@
method public boolean setPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName, @Nullable java.util.List<java.lang.String>);
method public boolean setPermittedInputMethods(@NonNull android.content.ComponentName, java.util.List<java.lang.String>);
method public void setPersonalAppsSuspended(@NonNull android.content.ComponentName, boolean);
+ method public void setPreferentialNetworkServiceEnabled(boolean);
method public void setProfileEnabled(@NonNull android.content.ComponentName);
method public void setProfileName(@NonNull android.content.ComponentName, String);
method public void setRecommendedGlobalProxy(@NonNull android.content.ComponentName, @Nullable android.net.ProxyInfo);
@@ -7399,7 +7400,7 @@
field public static final String EXTRA_PROVISIONING_LOGO_URI = "android.app.extra.PROVISIONING_LOGO_URI";
field @Deprecated public static final String EXTRA_PROVISIONING_MAIN_COLOR = "android.app.extra.PROVISIONING_MAIN_COLOR";
field public static final String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE";
- field public static final String EXTRA_PROVISIONING_PERMISSION_GRANT_OPT_OUT = "android.app.extra.PROVISIONING_PERMISSION_GRANT_OPT_OUT";
+ field public static final String EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT = "android.app.extra.PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT";
field public static final String EXTRA_PROVISIONING_SERIAL_NUMBER = "android.app.extra.PROVISIONING_SERIAL_NUMBER";
field public static final String EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS = "android.app.extra.PROVISIONING_SKIP_EDUCATION_SCREENS";
field public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
@@ -10644,6 +10645,7 @@
field public static final String NOTIFICATION_SERVICE = "notification";
field public static final String NSD_SERVICE = "servicediscovery";
field public static final String PEOPLE_SERVICE = "people";
+ field public static final String PERFORMANCE_HINT_SERVICE = "performance_hint";
field public static final String POWER_SERVICE = "power";
field public static final String PRINT_SERVICE = "print";
field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
@@ -10667,7 +10669,7 @@
field public static final String USB_SERVICE = "usb";
field public static final String USER_SERVICE = "user";
field public static final String VIBRATOR_MANAGER_SERVICE = "vibrator_manager";
- field public static final String VIBRATOR_SERVICE = "vibrator";
+ field @Deprecated public static final String VIBRATOR_SERVICE = "vibrator";
field public static final String VPN_MANAGEMENT_SERVICE = "vpn_management";
field @UiContext public static final String WALLPAPER_SERVICE = "wallpaper";
field public static final String WIFI_AWARE_SERVICE = "wifiaware";
@@ -11221,7 +11223,6 @@
field public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
field public static final String EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME";
field public static final String EXTRA_INTENT = "android.intent.extra.INTENT";
- field public static final String EXTRA_IS_BUBBLED = "android.intent.extra.IS_BUBBLED";
field public static final String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
field public static final String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
field public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID";
@@ -12085,7 +12086,6 @@
}
public class DataLoaderParams {
- method @NonNull public static final android.content.pm.DataLoaderParams forIncremental(@NonNull android.content.ComponentName, @NonNull String);
method @NonNull public static final android.content.pm.DataLoaderParams forStreaming(@NonNull android.content.ComponentName, @NonNull String);
method @NonNull public final String getArguments();
method @NonNull public final android.content.ComponentName getComponentName();
@@ -12330,7 +12330,6 @@
field public static final String ACTION_SESSION_COMMITTED = "android.content.pm.action.SESSION_COMMITTED";
field public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
field public static final String ACTION_SESSION_UPDATED = "android.content.pm.action.SESSION_UPDATED";
- field public static final int DATA_LOADER_TYPE_INCREMENTAL = 2; // 0x2
field public static final int DATA_LOADER_TYPE_NONE = 0; // 0x0
field public static final int DATA_LOADER_TYPE_STREAMING = 1; // 0x1
field public static final String EXTRA_DATA_LOADER_TYPE = "android.content.pm.extra.DATA_LOADER_TYPE";
@@ -12732,7 +12731,6 @@
field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct";
field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND = "android.hardware.touchscreen.multitouch.jazzhand";
- field public static final String FEATURE_TRANSLATION = "android.software.translation";
field public static final String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
field public static final String FEATURE_USB_HOST = "android.hardware.usb.host";
field public static final String FEATURE_VERIFIED_BOOT = "android.software.verified_boot";
@@ -20235,6 +20233,7 @@
field public static final int TYPE_FM_TUNER = 16; // 0x10
field public static final int TYPE_HDMI = 9; // 0x9
field public static final int TYPE_HDMI_ARC = 10; // 0xa
+ field public static final int TYPE_HDMI_EARC = 29; // 0x1d
field public static final int TYPE_HEARING_AID = 23; // 0x17
field public static final int TYPE_IP = 20; // 0x14
field public static final int TYPE_LINE_ANALOG = 5; // 0x5
@@ -30835,16 +30834,16 @@
method public void onCancel();
}
- public abstract class CombinedVibrationEffect implements android.os.Parcelable {
- method @NonNull public static android.os.CombinedVibrationEffect createSynced(@NonNull android.os.VibrationEffect);
+ public abstract class CombinedVibration implements android.os.Parcelable {
+ method @NonNull public static android.os.CombinedVibration createParallel(@NonNull android.os.VibrationEffect);
method public int describeContents();
- method @NonNull public static android.os.CombinedVibrationEffect.SyncedCombination startSynced();
- field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibrationEffect> CREATOR;
+ method @NonNull public static android.os.CombinedVibration.ParallelCombination startParallel();
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibration> CREATOR;
}
- public static final class CombinedVibrationEffect.SyncedCombination {
- method @NonNull public android.os.CombinedVibrationEffect.SyncedCombination addVibrator(int, @NonNull android.os.VibrationEffect);
- method @NonNull public android.os.CombinedVibrationEffect combine();
+ public static final class CombinedVibration.ParallelCombination {
+ method @NonNull public android.os.CombinedVibration.ParallelCombination addVibrator(int, @NonNull android.os.VibrationEffect);
+ method @NonNull public android.os.CombinedVibration combine();
}
public class ConditionVariable {
@@ -31559,6 +31558,17 @@
field public static final int PATTERN_SUFFIX = 4; // 0x4
}
+ public final class PerformanceHintManager {
+ method @Nullable public android.os.PerformanceHintManager.Session createHintSession(@NonNull int[], long);
+ method public long getPreferredUpdateRateNanos();
+ }
+
+ public static class PerformanceHintManager.Session implements java.io.Closeable {
+ method public void close();
+ method public void reportActualWorkDuration(long);
+ method public void updateTargetWorkDuration(long);
+ }
+
public final class PersistableBundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
ctor public PersistableBundle();
ctor public PersistableBundle(int);
@@ -32086,8 +32096,8 @@
method @NonNull public abstract android.os.Vibrator getDefaultVibrator();
method @NonNull public abstract android.os.Vibrator getVibrator(int);
method @NonNull public abstract int[] getVibratorIds();
- method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibrationEffect);
- method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibrationEffect, @Nullable android.os.VibrationAttributes);
+ method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibration);
+ method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibration, @Nullable android.os.VibrationAttributes);
}
public class WorkSource implements android.os.Parcelable {
@@ -47127,7 +47137,7 @@
method @NonNull public android.hardware.SensorManager getSensorManager();
method public int getSources();
method public int getVendorId();
- method public android.os.Vibrator getVibrator();
+ method @Deprecated public android.os.Vibrator getVibrator();
method @NonNull public android.os.VibratorManager getVibratorManager();
method public boolean[] hasKeys(int...);
method public boolean hasMicrophone();
@@ -55522,13 +55532,16 @@
method public void setChar(@IdRes int, String, char);
method public void setCharSequence(@IdRes int, String, CharSequence);
method public void setCharSequence(@IdRes int, @NonNull String, @StringRes int);
+ method public void setCharSequenceAttr(@IdRes int, @NonNull String, @AttrRes int);
method public void setChronometer(@IdRes int, long, String, boolean);
method public void setChronometerCountDown(@IdRes int, boolean);
method public void setColor(@IdRes int, @NonNull String, @ColorRes int);
+ method public void setColorAttr(@IdRes int, @NonNull String, @AttrRes int);
method public void setColorInt(@IdRes int, @NonNull String, @ColorInt int, @ColorInt int);
method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList);
method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList, @Nullable android.content.res.ColorStateList);
method public void setColorStateList(@IdRes int, @NonNull String, @ColorRes int);
+ method public void setColorStateListAttr(@IdRes int, @NonNull String, @AttrRes int);
method public void setCompoundButtonChecked(@IdRes int, boolean);
method public void setContentDescription(@IdRes int, CharSequence);
method public void setDisplayedChild(@IdRes int, int);
@@ -55537,6 +55550,7 @@
method public void setFloat(@IdRes int, String, float);
method public void setFloatDimen(@IdRes int, @NonNull String, @DimenRes int);
method public void setFloatDimen(@IdRes int, @NonNull String, float, int);
+ method public void setFloatDimenAttr(@IdRes int, @NonNull String, @AttrRes int);
method public void setIcon(@IdRes int, String, android.graphics.drawable.Icon);
method public void setIcon(@IdRes int, @NonNull String, @Nullable android.graphics.drawable.Icon, @Nullable android.graphics.drawable.Icon);
method public void setImageViewBitmap(@IdRes int, android.graphics.Bitmap);
@@ -55546,6 +55560,7 @@
method public void setInt(@IdRes int, String, int);
method public void setIntDimen(@IdRes int, @NonNull String, @DimenRes int);
method public void setIntDimen(@IdRes int, @NonNull String, float, int);
+ method public void setIntDimenAttr(@IdRes int, @NonNull String, @AttrRes int);
method public void setIntent(@IdRes int, String, android.content.Intent);
method public void setLabelFor(@IdRes int, @IdRes int);
method public void setLightBackgroundLayoutId(@LayoutRes int);
@@ -55571,12 +55586,16 @@
method public void setTextViewTextSize(@IdRes int, int, float);
method public void setUri(@IdRes int, String, android.net.Uri);
method public void setViewLayoutHeight(@IdRes int, float, int);
+ method public void setViewLayoutHeightAttr(@IdRes int, @AttrRes int);
method public void setViewLayoutHeightDimen(@IdRes int, @DimenRes int);
method public void setViewLayoutMargin(@IdRes int, int, float, int);
+ method public void setViewLayoutMarginAttr(@IdRes int, int, @AttrRes int);
method public void setViewLayoutMarginDimen(@IdRes int, int, @DimenRes int);
method public void setViewLayoutWidth(@IdRes int, float, int);
+ method public void setViewLayoutWidthAttr(@IdRes int, @AttrRes int);
method public void setViewLayoutWidthDimen(@IdRes int, @DimenRes int);
method public void setViewOutlinePreferredRadius(@IdRes int, float, int);
+ method public void setViewOutlinePreferredRadiusAttr(@IdRes int, @AttrRes int);
method public void setViewOutlinePreferredRadiusDimen(@IdRes int, @DimenRes int);
method public void setViewPadding(@IdRes int, @Px int, @Px int, @Px int, @Px int);
method public void setViewVisibility(@IdRes int, int);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index cdbb292..b1e448b 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -56,7 +56,7 @@
package android.content {
public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
- method @NonNull public static android.net.Uri createContentUriAsUser(@NonNull android.net.Uri, @NonNull android.os.UserHandle);
+ method @NonNull public static android.net.Uri createContentUriForUser(@NonNull android.net.Uri, @NonNull android.os.UserHandle);
}
public abstract class Context {
@@ -260,7 +260,7 @@
}
public static class Build.VERSION {
- field public static final int FIRST_SDK_INT;
+ field public static final int DEVICE_INITIAL_SDK_INT;
}
public interface Parcelable {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index b1b3411..d42f07d 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -366,6 +366,7 @@
field public static final int config_helpIntentNameKey = 17039390; // 0x104001e
field public static final int config_helpPackageNameKey = 17039387; // 0x104001b
field public static final int config_helpPackageNameValue = 17039388; // 0x104001c
+ field public static final int config_systemActivityRecognizer;
field public static final int config_systemAmbientAudioIntelligence;
field public static final int config_systemAudioIntelligence;
field public static final int config_systemAutomotiveCluster;
@@ -2229,7 +2230,7 @@
package android.companion {
public final class CompanionDeviceManager {
- method @RequiresPermission(android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES) public boolean associate(@NonNull String, @NonNull android.net.MacAddress);
+ method @RequiresPermission(android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES) public void associate(@NonNull String, @NonNull android.net.MacAddress);
method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean canPairWithoutPrompt(@NonNull String, @NonNull String, int);
method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean isDeviceAssociatedForWifiConnection(@NonNull String, @NonNull android.net.MacAddress, @NonNull android.os.UserHandle);
}
@@ -2370,7 +2371,6 @@
field public static final String ACTION_PENDING_INCIDENT_REPORTS_CHANGED = "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED";
field public static final String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
field public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
- field public static final String ACTION_REBOOT_READY = "android.intent.action.REBOOT_READY";
field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
field @RequiresPermission(android.Manifest.permission.REVIEW_ACCESSIBILITY_SERVICES) public static final String ACTION_REVIEW_ACCESSIBILITY_SERVICES = "android.intent.action.REVIEW_ACCESSIBILITY_SERVICES";
field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_ONGOING_PERMISSION_USAGE = "android.intent.action.REVIEW_ONGOING_PERMISSION_USAGE";
@@ -2398,7 +2398,6 @@
field public static final String EXTRA_INSTANT_APP_HOSTNAME = "android.intent.extra.INSTANT_APP_HOSTNAME";
field public static final String EXTRA_INSTANT_APP_SUCCESS = "android.intent.extra.INSTANT_APP_SUCCESS";
field public static final String EXTRA_INSTANT_APP_TOKEN = "android.intent.extra.INSTANT_APP_TOKEN";
- field public static final String EXTRA_IS_READY_TO_REBOOT = "android.intent.extra.IS_READY_TO_REBOOT";
field public static final String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE";
field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID";
field public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";
@@ -2524,6 +2523,10 @@
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES) public void startActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
}
+ public class DataLoaderParams {
+ method @NonNull public static final android.content.pm.DataLoaderParams forIncremental(@NonNull android.content.ComponentName, @NonNull String);
+ }
+
public final class InstantAppInfo implements android.os.Parcelable {
ctor public InstantAppInfo(android.content.pm.ApplicationInfo, String[], String[]);
ctor public InstantAppInfo(String, CharSequence, String[], String[]);
@@ -2614,6 +2617,7 @@
public class PackageInstaller {
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
+ field public static final int DATA_LOADER_TYPE_INCREMENTAL = 2; // 0x2
}
public static class PackageInstaller.Session implements java.io.Closeable {
@@ -5096,7 +5100,7 @@
public static class AudioAttributes.Builder {
method public android.media.AudioAttributes.Builder addBundle(@NonNull android.os.Bundle);
method public android.media.AudioAttributes.Builder setCapturePreset(int);
- method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public android.media.AudioAttributes.Builder setHotwordMode();
+ method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public android.media.AudioAttributes.Builder setHotwordModeEnabled(boolean);
method public android.media.AudioAttributes.Builder setInternalCapturePreset(int);
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioAttributes.Builder setSystemUsage(int);
}
@@ -8021,14 +8025,14 @@
method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.os.connectivity.WifiBatteryStats getWifiBatteryStats();
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockAcquiredFromSource(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockReleasedFromSource(@NonNull android.os.WorkSource);
- method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportMobileRadioPowerState(boolean, int) throws java.lang.RuntimeException;
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportMobileRadioPowerState(boolean, int);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStartedFromSource(@NonNull android.os.WorkSource, @IntRange(from=0) int);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStoppedFromSource(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastDisabled(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastEnabled(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOff();
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOn();
- method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRadioPowerState(boolean, int) throws java.lang.RuntimeException;
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRadioPowerState(boolean, int);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRssiChanged(@IntRange(from=0xffffff81, to=0) int);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStartedFromSource(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStoppedFromSource(@NonNull android.os.WorkSource);
@@ -8435,10 +8439,15 @@
method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener, android.os.Handler) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener) throws java.io.IOException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVERY) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, @NonNull String) throws java.io.IOException;
- method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, boolean) throws java.io.IOException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static int rebootAndApply(@NonNull android.content.Context, @NonNull String, boolean) throws java.io.IOException;
method @RequiresPermission(allOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootWipeAb(android.content.Context, java.io.File, String) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void scheduleUpdateOnBoot(android.content.Context, java.io.File) throws java.io.IOException;
method public static boolean verifyPackageCompatibility(java.io.File) throws java.io.IOException;
+ field public static final int RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME = 2000; // 0x7d0
+ field public static final int RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED = 3000; // 0xbb8
+ field public static final int RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE = 5000; // 0x1388
+ field public static final int RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH = 4000; // 0xfa0
+ field public static final int RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED = 1000; // 0x3e8
}
public final class RemoteCallback implements android.os.Parcelable {
@@ -8554,7 +8563,7 @@
method @NonNull public static String formatUid(int);
method public static int getAppId(int);
method public int getIdentifier();
- method public static int getUid(@NonNull android.os.UserHandle, int);
+ method public int getUid(int);
method @Deprecated public boolean isOwner();
method public boolean isSystem();
method public static int myUserId();
@@ -9292,6 +9301,7 @@
field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
field public static final String ODI_CAPTIONS_ENABLED = "odi_captions_enabled";
field public static final String THEME_CUSTOMIZATION_OVERLAY_PACKAGES = "theme_customization_overlay_packages";
+ field public static final String UI_TRANSLATION_ENABLED = "ui_translation_enabled";
field public static final String USER_SETUP_COMPLETE = "user_setup_complete";
field public static final int USER_SETUP_PERSONALIZATION_COMPLETE = 10; // 0xa
field public static final int USER_SETUP_PERSONALIZATION_NOT_STARTED = 0; // 0x0
@@ -9812,7 +9822,6 @@
public final class DisplayHashParams implements android.os.Parcelable {
method public int describeContents();
method @Nullable public android.util.Size getBufferSize();
- method public boolean isBufferScaleWithFiltering();
method public boolean isGrayscaleBuffer();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.service.displayhash.DisplayHashParams> CREATOR;
@@ -9821,7 +9830,6 @@
public static final class DisplayHashParams.Builder {
ctor public DisplayHashParams.Builder();
method @NonNull public android.service.displayhash.DisplayHashParams build();
- method @NonNull public android.service.displayhash.DisplayHashParams.Builder setBufferScaleWithFiltering(boolean);
method @NonNull public android.service.displayhash.DisplayHashParams.Builder setBufferSize(int, int);
method @NonNull public android.service.displayhash.DisplayHashParams.Builder setGrayscaleBuffer(boolean);
}
@@ -13516,7 +13524,8 @@
}
public interface SipDelegateConnection {
- method public void closeDialog(@NonNull String);
+ method public default void cleanupSession(@NonNull String);
+ method @Deprecated public default void closeDialog(@NonNull String);
method public void notifyMessageReceiveError(@NonNull String, int);
method public void notifyMessageReceived(@NonNull String);
method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long);
@@ -13967,7 +13976,8 @@
}
public interface SipDelegate {
- method public void closeDialog(@NonNull String);
+ method public default void cleanupSession(@NonNull String);
+ method @Deprecated public default void closeDialog(@NonNull String);
method public void notifyMessageReceiveError(@NonNull String, int);
method public void notifyMessageReceived(@NonNull String);
method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long);
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 51657ef..d59e4f8 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -75,6 +75,10 @@
field public static final int ACCESSIBILITY_TAKE_SCREENSHOT_REQUEST_INTERVAL_TIMES_MS = 1000; // 0x3e8
}
+ public class AccessibilityServiceInfo implements android.os.Parcelable {
+ method @NonNull public android.content.ComponentName getComponentName();
+ }
+
}
package android.animation {
@@ -137,6 +141,7 @@
method public void setLaunchActivityType(int);
method public void setLaunchTaskId(int);
method public void setLaunchWindowingMode(int);
+ method public void setLaunchedFromBubble(boolean);
method public void setTaskAlwaysOnTop(boolean);
method public void setTaskOverlay(boolean, boolean);
}
@@ -156,10 +161,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void moveTaskToRootTask(int, int, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksInWindowingModes(@NonNull int[]);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksWithActivityTypes(@NonNull int[]);
- method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizePrimarySplitScreen(@NonNull android.graphics.Rect, @NonNull android.graphics.Rect);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizeTask(int, android.graphics.Rect);
- method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
- method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean setTaskWindowingModeSplitScreenPrimary(int, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void startSystemLockTaskMode(int);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void stopSystemLockTaskMode();
method public static boolean supportsMultiWindow(android.content.Context);
@@ -204,6 +206,10 @@
method public void onTaskRemovalStarted(int);
}
+ public class AlarmManager {
+ method public boolean hasScheduleExactAlarm(@NonNull String, int);
+ }
+
public class AppDetailsActivity extends android.app.Activity {
ctor public AppDetailsActivity();
}
@@ -1374,6 +1380,11 @@
method public static int xsdStringToUsage(@NonNull String);
}
+ public final class AudioDeviceInfo {
+ method public static void enforceValidAudioDeviceTypeIn(int);
+ method public static void enforceValidAudioDeviceTypeOut(int);
+ }
+
public final class AudioFocusRequest {
method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
}
@@ -1588,43 +1599,43 @@
public static class Build.VERSION {
field public static final String[] ACTIVE_CODENAMES;
- field public static final int FIRST_SDK_INT;
+ field public static final int DEVICE_INITIAL_SDK_INT;
field public static final int RESOURCES_SDK_INT;
}
- public abstract class CombinedVibrationEffect implements android.os.Parcelable {
+ public abstract class CombinedVibration implements android.os.Parcelable {
method public abstract long getDuration();
- method @NonNull public static android.os.CombinedVibrationEffect.SequentialCombination startSequential();
+ method @NonNull public static android.os.CombinedVibration.SequentialCombination startSequential();
}
- public static final class CombinedVibrationEffect.Mono extends android.os.CombinedVibrationEffect {
+ public static final class CombinedVibration.Mono extends android.os.CombinedVibration {
method public long getDuration();
method @NonNull public android.os.VibrationEffect getEffect();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibrationEffect.Mono> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibration.Mono> CREATOR;
}
- public static final class CombinedVibrationEffect.Sequential extends android.os.CombinedVibrationEffect {
+ public static final class CombinedVibration.Sequential extends android.os.CombinedVibration {
method @NonNull public java.util.List<java.lang.Integer> getDelays();
method public long getDuration();
- method @NonNull public java.util.List<android.os.CombinedVibrationEffect> getEffects();
+ method @NonNull public java.util.List<android.os.CombinedVibration> getEffects();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibrationEffect.Sequential> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibration.Sequential> CREATOR;
}
- public static final class CombinedVibrationEffect.SequentialCombination {
- method @NonNull public android.os.CombinedVibrationEffect.SequentialCombination addNext(int, @NonNull android.os.VibrationEffect);
- method @NonNull public android.os.CombinedVibrationEffect.SequentialCombination addNext(int, @NonNull android.os.VibrationEffect, int);
- method @NonNull public android.os.CombinedVibrationEffect.SequentialCombination addNext(@NonNull android.os.CombinedVibrationEffect);
- method @NonNull public android.os.CombinedVibrationEffect.SequentialCombination addNext(@NonNull android.os.CombinedVibrationEffect, int);
- method @NonNull public android.os.CombinedVibrationEffect combine();
+ public static final class CombinedVibration.SequentialCombination {
+ method @NonNull public android.os.CombinedVibration.SequentialCombination addNext(int, @NonNull android.os.VibrationEffect);
+ method @NonNull public android.os.CombinedVibration.SequentialCombination addNext(int, @NonNull android.os.VibrationEffect, int);
+ method @NonNull public android.os.CombinedVibration.SequentialCombination addNext(@NonNull android.os.CombinedVibration);
+ method @NonNull public android.os.CombinedVibration.SequentialCombination addNext(@NonNull android.os.CombinedVibration, int);
+ method @NonNull public android.os.CombinedVibration combine();
}
- public static final class CombinedVibrationEffect.Stereo extends android.os.CombinedVibrationEffect {
+ public static final class CombinedVibration.Stereo extends android.os.CombinedVibration {
method public long getDuration();
method @NonNull public android.util.SparseArray<android.os.VibrationEffect> getEffects();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibrationEffect.Stereo> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.CombinedVibration.Stereo> CREATOR;
}
public class DeviceIdleManager {
diff --git a/core/java/Android.bp b/core/java/Android.bp
index 919f1e2..1d290de 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -127,3 +127,329 @@
],
visibility: ["//frameworks/base/test-mock"],
}
+
+filegroup {
+ name: "libincident_aidl",
+ srcs: [
+ "android/os/IIncidentDumpCallback.aidl",
+ "android/os/IIncidentManager.aidl",
+ "android/os/IIncidentReportStatusListener.aidl",
+ ],
+}
+
+filegroup {
+ name: "libvibrator_aidl",
+ srcs: [
+ "android/os/IExternalVibrationController.aidl",
+ "android/os/IExternalVibratorService.aidl",
+ ],
+}
+
+filegroup {
+ name: "libpowermanager_aidl",
+ srcs: [
+ "android/os/Temperature.aidl",
+ "android/os/CoolingDevice.aidl",
+ "android/os/IThermalEventListener.aidl",
+ "android/os/IThermalStatusListener.aidl",
+ "android/os/IThermalService.aidl",
+ "android/os/IPowerManager.aidl",
+ ],
+}
+
+genrule {
+ name: "statslog-framework-java-gen",
+ tools: ["stats-log-api-gen"],
+ cmd: "$(location stats-log-api-gen) --java $(out) --module framework" +
+ " --javaPackage com.android.internal.util --javaClass FrameworkStatsLog --worksource",
+ out: ["com/android/internal/util/FrameworkStatsLog.java"],
+}
+
+java_library {
+ name: "uieventloggerlib",
+ srcs: [
+ "com/android/internal/logging/UiEvent.java",
+ "com/android/internal/logging/UiEventLogger.java",
+ "com/android/internal/logging/UiEventLoggerImpl.java",
+ "com/android/internal/logging/InstanceId.java",
+ "com/android/internal/logging/InstanceIdSequence.java",
+ ":statslog-framework-java-gen",
+ ],
+}
+
+filegroup {
+ name: "framework-services-net-module-wifi-shared-srcs",
+ srcs: [
+ "android/net/DhcpResults.java",
+ "android/util/LocalLog.java",
+ ],
+}
+
+// keep these files in sync with the package/Tethering/jarjar-rules.txt and
+// package/Connectivity/jarjar-rules.txt for the tethering module and connectivity module.
+filegroup {
+ name: "framework-connectivity-shared-srcs",
+ srcs: [
+ "android/util/IndentingPrintWriter.java",
+ "android/util/LocalLog.java",
+ // This should be android.util.IndentingPrintWriter, but it's not available in all branches.
+ "com/android/internal/util/IndentingPrintWriter.java",
+ "com/android/internal/util/IState.java",
+ "com/android/internal/util/MessageUtils.java",
+ "com/android/internal/util/State.java",
+ "com/android/internal/util/StateMachine.java",
+ "com/android/internal/util/WakeupMessage.java",
+ ],
+}
+
+// keep these files in sync with the apex/jobscheduler/service jarjar-rules.txt for
+// the jobscheduler module.
+filegroup {
+ name: "framework-jobscheduler-shared-srcs",
+ srcs: [
+ "com/android/internal/util/ArrayUtils.java",
+ "com/android/internal/util/BitUtils.java",
+ "com/android/internal/util/CollectionUtils.java",
+ "com/android/internal/util/ConcurrentUtils.java",
+ "com/android/internal/util/DumpUtils.java",
+ "com/android/internal/util/FastPrintWriter.java",
+ "com/android/internal/util/FastXmlSerializer.java",
+ "com/android/internal/util/FunctionalUtils.java",
+ "com/android/internal/util/ParseUtils.java",
+ "com/android/internal/util/Preconditions.java",
+ "com/android/internal/util/RingBufferIndices.java",
+ "com/android/internal/util/StatLogger.java",
+ "com/android/internal/util/XmlUtils.java",
+ ],
+}
+
+// Keep these files in sync with the apex/permission/jarjar-rules.txt for the permission module.
+filegroup {
+ name: "framework-permission-s-shared-srcs",
+ srcs: [
+ "com/android/internal/infra/AndroidFuture.java",
+ "com/android/internal/infra/ServiceConnector.java",
+ "com/android/internal/util/Preconditions.java",
+ "com/android/internal/infra/AndroidFuture.aidl",
+ "com/android/internal/infra/IAndroidFuture.aidl",
+ "android/os/HandlerExecutor.java",
+ ],
+}
+
+// Keep these files in sync with the apex/permission/jarjar-rules.txt for the permission module.
+filegroup {
+ name: "service-permission-shared-srcs",
+ srcs: [
+ "android/util/IndentingPrintWriter.java",
+ "com/android/internal/util/dump/DualDumpOutputStream.java",
+ ],
+}
+
+filegroup {
+ name: "incremental_aidl",
+ srcs: [
+ "android/os/incremental/IIncrementalServiceConnector.aidl",
+ "android/os/incremental/IncrementalFileSystemControlParcel.aidl",
+ ],
+}
+
+filegroup {
+ name: "dataloader_aidl",
+ srcs: [
+ "android/content/pm/DataLoaderParamsParcel.aidl",
+ "android/content/pm/DataLoaderType.aidl",
+ "android/content/pm/FileSystemControlParcel.aidl",
+ "android/content/pm/IDataLoader.aidl",
+ "android/content/pm/IDataLoaderManager.aidl",
+ "android/content/pm/InstallationFileParcel.aidl",
+ "android/content/pm/InstallationFileLocation.aidl",
+ "android/content/pm/IDataLoaderStatusListener.aidl",
+ "android/content/pm/IPackageInstallerSessionFileSystemConnector.aidl",
+ ],
+}
+
+filegroup {
+ name: "incremental_manager_aidl",
+ srcs: [
+ "android/os/incremental/IIncrementalService.aidl",
+ "android/os/incremental/IStorageLoadingProgressListener.aidl",
+ "android/os/incremental/IncrementalNewFileParams.aidl",
+ "android/os/incremental/IStorageHealthListener.aidl",
+ "android/os/incremental/PerUidReadTimeouts.aidl",
+ "android/os/incremental/StorageHealthCheckParams.aidl",
+ ],
+}
+
+filegroup {
+ name: "activity_manager_procstate_aidl",
+ srcs: [
+ "android/app/ProcessStateEnum.aidl",
+ ],
+}
+
+cc_defaults {
+ name: "incremental_default",
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Wextra-semi",
+ "-Werror",
+ "-Wzero-as-null-pointer-constant",
+ "-DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION",
+ ],
+ shared_libs: [
+ "libbinder",
+ "libutils",
+ ],
+ aidl: {
+ include_dirs: [
+ "frameworks/native/aidl/binder",
+ ],
+ export_aidl_headers: true,
+ },
+}
+
+cc_library {
+ name: "libincremental_aidl-cpp",
+ srcs: [
+ ":incremental_aidl",
+ ],
+ defaults: ["incremental_default"],
+}
+
+cc_library {
+ name: "libdataloader_aidl-cpp",
+ srcs: [
+ ":dataloader_aidl",
+ ],
+ defaults: ["incremental_default"],
+ shared_libs: [
+ "libincremental_aidl-cpp",
+ ],
+}
+
+cc_library {
+ name: "libincremental_manager_aidl-cpp",
+ srcs: [
+ ":incremental_manager_aidl",
+ ],
+ defaults: ["incremental_default"],
+ shared_libs: [
+ "libincremental_aidl-cpp",
+ "libdataloader_aidl-cpp",
+ ],
+}
+
+// Build Rust bindings for PermissionController. Needed by keystore2.
+aidl_interface {
+ name: "android.os.permissions_aidl",
+ unstable: true,
+ local_include_dir: ".",
+ srcs: [
+ "android/os/IPermissionController.aidl",
+ ],
+ backend: {
+ rust: {
+ enabled: true,
+ },
+ },
+}
+
+// Avoid including Parcelable classes as we don't want to have two copies of
+// Parcelable cross the libraries. This is used by telephony-common (frameworks/opt/telephony)
+// and TeleService app (packages/services/Telephony).
+filegroup {
+ name: "framework-telephony-common-shared-srcs",
+ srcs: [
+ "android/os/RegistrantList.java",
+ "android/os/Registrant.java",
+ "android/util/IndentingPrintWriter.java",
+ "android/util/LocalLog.java",
+ "android/util/TimeUtils.java",
+ "com/android/internal/os/SomeArgs.java",
+ "com/android/internal/util/AsyncChannel.java",
+ "com/android/internal/util/AsyncService.java",
+ "com/android/internal/util/BitwiseInputStream.java",
+ "com/android/internal/util/FastXmlSerializer.java",
+ "com/android/internal/util/HexDump.java",
+ "com/android/internal/util/IState.java",
+ "com/android/internal/util/IndentingPrintWriter.java",
+ "com/android/internal/util/Preconditions.java",
+ "com/android/internal/util/State.java",
+ "com/android/internal/util/StateMachine.java",
+ "com/android/internal/util/UserIcons.java",
+ ],
+}
+
+// Avoid including Parcelable classes as we don't want to have two copies of
+// Parcelable cross the process.
+filegroup {
+ name: "framework-cellbroadcast-shared-srcs",
+ srcs: [
+ "android/os/HandlerExecutor.java",
+ "android/util/LocalLog.java",
+ "com/android/internal/util/IState.java",
+ "com/android/internal/util/Preconditions.java",
+ "com/android/internal/util/State.java",
+ "com/android/internal/util/StateMachine.java",
+ ],
+}
+
+filegroup {
+ name: "framework-ims-common-shared-srcs",
+ srcs: [
+ "android/os/RegistrantList.java",
+ "android/os/Registrant.java",
+ "com/android/internal/os/SomeArgs.java",
+ "com/android/internal/util/Preconditions.java",
+ ],
+}
+
+// utility classes statically linked into wifi-service
+filegroup {
+ name: "framework-wifi-service-shared-srcs",
+ srcs: [
+ "android/net/InterfaceConfiguration.java",
+ "android/util/BackupUtils.java",
+ "android/util/Rational.java",
+ "com/android/internal/util/FastXmlSerializer.java",
+ "com/android/internal/util/HexDump.java",
+ "com/android/internal/util/IState.java",
+ "com/android/internal/util/MessageUtils.java",
+ "com/android/internal/util/State.java",
+ "com/android/internal/util/StateMachine.java",
+ "com/android/internal/util/WakeupMessage.java",
+ ],
+ visibility: [
+ "//frameworks/opt/net/wifi/service",
+ "//packages/modules/Wifi/service",
+ ],
+}
+
+// protolog start
+filegroup {
+ name: "protolog-common-src",
+ srcs: [
+ "com/android/internal/protolog/common/**/*.java",
+ ],
+}
+
+java_library {
+ name: "protolog-lib",
+ platform_apis: true,
+ srcs: [
+ "com/android/internal/protolog/ProtoLogImpl.java",
+ "com/android/internal/protolog/ProtoLogViewerConfigReader.java",
+ ":protolog-common-src",
+ ],
+}
+
+java_library {
+ name: "protolog-groups",
+ srcs: [
+ "com/android/internal/protolog/ProtoLogGroup.java",
+ ":protolog-common-src",
+ ],
+}
+
+// protolog end
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 856ed50..01ea026 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -24,6 +24,7 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.compat.annotation.UnsupportedAppUsage;
@@ -522,6 +523,7 @@
/**
* The component name the accessibility service.
*/
+ @NonNull
private ComponentName mComponentName;
/**
@@ -772,13 +774,15 @@
/**
* @hide
*/
- public void setComponentName(ComponentName component) {
+ public void setComponentName(@NonNull ComponentName component) {
mComponentName = component;
}
/**
* @hide
*/
+ @TestApi
+ @NonNull
public ComponentName getComponentName() {
return mComponentName;
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index f0d5a89..45120b6 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -899,6 +899,9 @@
/** The options for scene transition. */
ActivityOptions mPendingOptions;
+ /** Whether this activity was launched from a bubble. **/
+ boolean mLaunchedFromBubble;
+
private static final class ManagedCursor {
ManagedCursor(Cursor cursor) {
mCursor = cursor;
@@ -6790,6 +6793,25 @@
return getSharedPreferences(getLocalClassName(), mode);
}
+ /**
+ * Indicates whether this activity is launched from a bubble. A bubble is a floating shortcut
+ * on the screen that expands to show an activity.
+ *
+ * If your activity can be used normally or as a bubble, you might use this method to check
+ * if the activity is bubbled to modify any behaviour that might be different between the
+ * normal activity and the bubbled activity. For example, if you normally cancel the
+ * notification associated with the activity when you open the activity, you might not want to
+ * do that when you're bubbled as that would remove the bubble.
+ *
+ * @return {@code true} if the activity is launched from a bubble.
+ *
+ * @see Notification.Builder#setBubbleMetadata(Notification.BubbleMetadata)
+ * @see Notification.BubbleMetadata.Builder#Builder(String)
+ */
+ public boolean isLaunchedFromBubble() {
+ return mLaunchedFromBubble;
+ }
+
private void ensureSearchManager() {
if (mSearchManager != null) {
return;
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 006b2b5..c21de62 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -323,6 +323,9 @@
/** See {@link #setRemoveWithTaskOrganizer(boolean)}. */
private static final String KEY_REMOVE_WITH_TASK_ORGANIZER =
"android.activity.removeWithTaskOrganizer";
+ /** See {@link #setLaunchedFromBubble(boolean)}. */
+ private static final String KEY_LAUNCHED_FROM_BUBBLE =
+ "android.activity.launchTypeBubble";
/**
* @see #setLaunchCookie
@@ -410,6 +413,7 @@
private boolean mOverrideTaskTransition;
private int mSplashScreenThemeResId;
private boolean mRemoveWithTaskOrganizer;
+ private boolean mLaunchedFromBubble;
/**
* Create an ActivityOptions specifying a custom animation to run when
@@ -1161,6 +1165,7 @@
mOverrideTaskTransition = opts.getBoolean(KEY_OVERRIDE_TASK_TRANSITION);
mSplashScreenThemeResId = opts.getInt(KEY_SPLASH_SCREEN_THEME);
mRemoveWithTaskOrganizer = opts.getBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER);
+ mLaunchedFromBubble = opts.getBoolean(KEY_LAUNCHED_FROM_BUBBLE);
}
/**
@@ -1647,6 +1652,23 @@
}
/**
+ * Sets whether this activity is launched from a bubble.
+ * @hide
+ */
+ @TestApi
+ public void setLaunchedFromBubble(boolean fromBubble) {
+ mLaunchedFromBubble = fromBubble;
+ }
+
+ /**
+ * @return whether the activity was launched from a bubble.
+ * @hide
+ */
+ public boolean getLaunchedFromBubble() {
+ return mLaunchedFromBubble;
+ }
+
+ /**
* Update the current values in this ActivityOptions from those supplied
* in <var>otherOptions</var>. Any values
* defined in <var>otherOptions</var> replace those in the base options.
@@ -1883,6 +1905,9 @@
if (mRemoveWithTaskOrganizer) {
b.putBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER, mRemoveWithTaskOrganizer);
}
+ if (mLaunchedFromBubble) {
+ b.putBoolean(KEY_LAUNCHED_FROM_BUBBLE, mLaunchedFromBubble);
+ }
return b;
}
diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java
index a24f871..627017c 100644
--- a/core/java/android/app/ActivityTaskManager.java
+++ b/core/java/android/app/ActivityTaskManager.java
@@ -16,8 +16,6 @@
package android.app;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -169,35 +167,6 @@
};
/**
- * Sets the windowing mode for a specific task. Only works on tasks of type
- * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
- * @param taskId The id of the task to set the windowing mode for.
- * @param windowingMode The windowing mode to set for the task.
- * @param toTop If the task should be moved to the top once the windowing mode changes.
- * @return Whether the task was successfully put into the specified windowing mode.
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
- public boolean setTaskWindowingMode(int taskId, int windowingMode, boolean toTop)
- throws SecurityException {
- try {
- return getService().setTaskWindowingMode(taskId, windowingMode, toTop);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Moves the input task to the primary-split-screen stack.
- * @param taskId Id of task to move.
- * @param toTop If the task and stack should be moved to the top.
- * @return Whether the task was successfully put into splitscreen.
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
- public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, boolean toTop) {
- return setTaskWindowingMode(taskId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, toTop);
- }
-
- /**
* Removes root tasks in the windowing modes from the system if they are of activity type
* ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
*/
@@ -367,20 +336,6 @@
}
/**
- * Resize docked stack & its task to given stack & task bounds.
- * @param rootTaskBounds Bounds to resize stack.
- * @param taskBounds Bounds to resize task.
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
- public void resizePrimarySplitScreen(@NonNull Rect rootTaskBounds, @NonNull Rect taskBounds) {
- try {
- getService().resizePrimarySplitScreen(rootTaskBounds, taskBounds, null, null, null);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Clears launch params for the given package.
* @param packageNames the names of the packages of which the launch params are to be cleared
*/
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 35890c8..8ff14b0 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -594,6 +594,9 @@
*/
FixedRotationAdjustments mPendingFixedRotationAdjustments;
+ /** Whether this activiy was launched from a bubble. */
+ boolean mLaunchedFromBubble;
+
@LifecycleState
private int mLifecycleState = PRE_ON_CREATE;
@@ -613,7 +616,7 @@
List<ReferrerIntent> pendingNewIntents, ActivityOptions activityOptions,
boolean isForward, ProfilerInfo profilerInfo, ClientTransactionHandler client,
IBinder assistToken, FixedRotationAdjustments fixedRotationAdjustments,
- IBinder shareableActivityToken) {
+ IBinder shareableActivityToken, boolean launchedFromBubble) {
this.token = token;
this.assistToken = assistToken;
this.shareableActivityToken = shareableActivityToken;
@@ -634,6 +637,7 @@
compatInfo);
mActivityOptions = activityOptions;
mPendingFixedRotationAdjustments = fixedRotationAdjustments;
+ mLaunchedFromBubble = launchedFromBubble;
init();
}
@@ -3549,6 +3553,7 @@
activity.mPendingOptions = r.mActivityOptions;
r.mActivityOptions = null;
}
+ activity.mLaunchedFromBubble = r.mLaunchedFromBubble;
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index ec7d159..f7ea381 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -2641,9 +2641,8 @@
// WindowContext's resources.
windowTokenClient.attachContext(windowContext);
- // Step 5. Register the window context's token to the server side to associate with a
- // window manager node.
- windowContext.registerWithServer();
+ // Step 5. Associate the WindowContext's token to a DisplayArea.
+ windowContext.attachToDisplayArea();
return windowContext;
}
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index e5a969a..346882e 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -87,8 +87,6 @@
// surface exposed.
// TODO(b/174041603): Create a builder interface for things like startActivityXXX(...) to reduce
// interface duplication.
-// TODO(b/174040691): Clean-up/remove all obsolete or unused interfaces like things that should be
-// going through task organizer now.
interface IActivityTaskManager {
int startActivity(in IApplicationThread caller, in String callingPackage,
in String callingFeatureId, in Intent intent, in String resolvedType,
@@ -206,15 +204,6 @@
boolean resizeTask(int taskId, in Rect bounds, int resizeMode);
void moveRootTaskToDisplay(int taskId, int displayId);
- /**
- * Sets the windowing mode for a specific task. Only works on tasks of type
- * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
- * @param taskId The id of the task to set the windowing mode for.
- * @param windowingMode The windowing mode to set for the task.
- * @param toTop If the task should be moved to the top once the windowing mode changes.
- * @return Whether the task was successfully put into the specified windowing mode.
- */
- boolean setTaskWindowingMode(int taskId, int windowingMode, boolean toTop);
void moveTaskToRootTask(int taskId, int rootTaskId, boolean toTop);
/**
@@ -258,29 +247,6 @@
void suppressResizeConfigChanges(boolean suppress);
- /**
- * Resizes the docked stack, and all other stacks as the result of the dock stack bounds change.
- *
- * @param dockedBounds The bounds for the docked stack.
- * @param tempDockedTaskBounds The temporary bounds for the tasks in the docked stack, which
- * might be different from the stack bounds to allow more
- * flexibility while resizing, or {@code null} if they should be the
- * same as the stack bounds.
- * @param tempDockedTaskInsetBounds The temporary bounds for the tasks to calculate the insets.
- * When resizing, we usually "freeze" the layout of a task. To
- * achieve that, we also need to "freeze" the insets, which
- * gets achieved by changing task bounds but not bounds used
- * to calculate the insets in this transient state
- * @param tempOtherTaskBounds The temporary bounds for the tasks in all other stacks, or
- * {@code null} if they should be the same as the stack bounds.
- * @param tempOtherTaskInsetBounds Like {@code tempDockedTaskInsetBounds}, but for the other
- * stacks.
- * @throws RemoteException
- */
- void resizePrimarySplitScreen(in Rect dockedBounds, in Rect tempDockedTaskBounds,
- in Rect tempDockedTaskInsetBounds,
- in Rect tempOtherTaskBounds, in Rect tempOtherTaskInsetBounds);
-
/** Returns an interface enabling the management of window organizers. */
IWindowOrganizerController getWindowOrganizerController();
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index dab5aff..35a9f9b 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -188,6 +188,8 @@
List<ComponentName> getEnabledNotificationListeners(int userId);
ComponentName getAllowedNotificationAssistantForUser(int userId);
ComponentName getAllowedNotificationAssistant();
+ ComponentName getDefaultNotificationAssistant();
+ void resetDefaultNotificationAssistant(boolean loadFromConfig);
boolean hasEnabledNotificationListener(String packageName, int userId);
@UnsupportedAppUsage
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index fa35025..a60f1ca 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -9908,7 +9908,7 @@
*
* @hide
*/
- public static final int FLAG_SHOULD_SUPPRESS_BUBBLE = 0x00000004;
+ public static final int FLAG_SUPPRESSABLE_BUBBLE = 0x00000004;
/**
* Indicates whether the bubble is visually suppressed from the bubble stack.
@@ -10070,21 +10070,65 @@
* @return whether this bubble should be suppressed when the same content is visible
* outside of the bubble.
*
- * @see BubbleMetadata.Builder#setSuppressBubble(boolean)
+ * @see BubbleMetadata.Builder#setSuppressableBubble(boolean)
*/
public boolean isBubbleSuppressable() {
- return (mFlags & FLAG_SHOULD_SUPPRESS_BUBBLE) != 0;
+ return (mFlags & FLAG_SUPPRESSABLE_BUBBLE) != 0;
}
/**
* Indicates whether the bubble is currently visually suppressed from the bubble stack.
*
- * @see BubbleMetadata.Builder#setSuppressBubble(boolean)
+ * @see BubbleMetadata.Builder#setSuppressableBubble(boolean)
*/
public boolean isBubbleSuppressed() {
return (mFlags & FLAG_SUPPRESS_BUBBLE) != 0;
}
+ /**
+ * Sets whether the notification associated with the bubble is being visually
+ * suppressed from the notification shade. When <code>true</code> the notification is
+ * hidden, when <code>false</code> the notification shows as normal.
+ *
+ * @hide
+ */
+ public void setSuppressNotification(boolean suppressed) {
+ if (suppressed) {
+ mFlags |= Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
+ } else {
+ mFlags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
+ }
+ }
+
+ /**
+ * Sets whether the bubble should be visually suppressed from the bubble stack if the
+ * user is viewing the same content outside of the bubble. For example, the user has a
+ * bubble with Alice and then opens up the main app and navigates to Alice's page.
+ *
+ * @hide
+ */
+ public void setSuppressBubble(boolean suppressed) {
+ if (suppressed) {
+ mFlags |= Notification.BubbleMetadata.FLAG_SUPPRESS_BUBBLE;
+ } else {
+ mFlags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_BUBBLE;
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void setFlags(int flags) {
+ mFlags = flags;
+ }
+
+ /**
+ * @hide
+ */
+ public int getFlags() {
+ return mFlags;
+ }
+
public static final @android.annotation.NonNull Parcelable.Creator<BubbleMetadata> CREATOR =
new Parcelable.Creator<BubbleMetadata>() {
@@ -10128,20 +10172,6 @@
}
/**
- * @hide
- */
- public void setFlags(int flags) {
- mFlags = flags;
- }
-
- /**
- * @hide
- */
- public int getFlags() {
- return mFlags;
- }
-
- /**
* Builder to construct a {@link BubbleMetadata} object.
*/
public static final class Builder {
@@ -10175,13 +10205,8 @@
* <p>The shortcut activity will be used when the bubble is expanded. This will display
* the shortcut activity in a floating window over the existing foreground activity.</p>
*
- * <p>When the shortcut is displayed in a bubble, there will be an intent
- * extra set on the activity, {@link Intent#EXTRA_IS_BUBBLED}
- * with {@code true}. You may check this in the onCreate of your activity via:
- *
- * <pre class="prettyprint">
- * boolean isBubbled = getIntent().getBooleanExtra(Intent.EXTRA_IS_BUBBLED, false);
- * </pre>
+ * <p>When the activity is launched from a bubble,
+ * {@link Activity#isLaunchedFromBubble()} will return with {@code true}.
* </p>
*
* <p>If the shortcut has not been published when the bubble notification is sent,
@@ -10212,13 +10237,8 @@
* app content in a floating window over the existing foreground activity. The intent
* should point to a resizable activity. </p>
*
- * <p>When the activity is displayed in a bubble, there will be an intent
- * extra set on the activity, {@link Intent#EXTRA_IS_BUBBLED}
- * with {@code true}. You may check this in the onCreate of your activity via:
- *
- * <pre class="prettyprint">
- * boolean isBubbled = getIntent().getBooleanExtra(Intent.EXTRA_IS_BUBBLED, false);
- * </pre>
+ * <p>When the activity is launched from a bubble,
+ * {@link Activity#isLaunchedFromBubble()} will return with {@code true}.
* </p>
*
* @throws NullPointerException if intent is null.
@@ -10438,8 +10458,8 @@
* {@link Activity#setLocusContext(LocusId, Bundle)}
*/
@NonNull
- public BubbleMetadata.Builder setSuppressBubble(boolean suppressBubble) {
- setFlag(FLAG_SHOULD_SUPPRESS_BUBBLE, suppressBubble);
+ public BubbleMetadata.Builder setSuppressableBubble(boolean suppressBubble) {
+ setFlag(FLAG_SUPPRESSABLE_BUBBLE, suppressBubble);
return this;
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 47a9fbb..91dad2a 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -158,12 +158,14 @@
import android.os.IBinder;
import android.os.IDumpstate;
import android.os.IHardwarePropertiesManager;
+import android.os.IHintManager;
import android.os.IPowerManager;
import android.os.IRecoverySystem;
import android.os.ISystemUpdateManager;
import android.os.IThermalService;
import android.os.IUserManager;
import android.os.IncidentManager;
+import android.os.PerformanceHintManager;
import android.os.PowerManager;
import android.os.RecoverySystem;
import android.os.ServiceManager;
@@ -592,6 +594,17 @@
ctx.mMainThread.getHandler());
}});
+ registerService(Context.PERFORMANCE_HINT_SERVICE, PerformanceHintManager.class,
+ new CachedServiceFetcher<PerformanceHintManager>() {
+ @Override
+ public PerformanceHintManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder hintBinder = ServiceManager.getServiceOrThrow(
+ Context.PERFORMANCE_HINT_SERVICE);
+ IHintManager hintService = IHintManager.Stub.asInterface(hintBinder);
+ return new PerformanceHintManager(hintService);
+ }});
+
registerService(Context.RECOVERY_SERVICE, RecoverySystem.class,
new CachedServiceFetcher<RecoverySystem>() {
@Override
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 843aa2e..7af9482 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -991,8 +991,8 @@
* <p>Use only for device owner provisioning.
* @see #ACTION_GET_PROVISIONING_MODE
*/
- public static final String EXTRA_PROVISIONING_PERMISSION_GRANT_OPT_OUT =
- "android.app.extra.PROVISIONING_PERMISSION_GRANT_OPT_OUT";
+ public static final String EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT =
+ "android.app.extra.PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT";
/**
* A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the
@@ -5297,7 +5297,8 @@
* {@link #WIPE_EXTERNAL_STORAGE}, {@link #WIPE_RESET_PROTECTION_DATA},
* {@link #WIPE_EUICC} and {@link #WIPE_SILENTLY}.
* @throws SecurityException if the calling application does not own an active administrator
- * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
+ * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} or is not granted the
+ * {@link android.Manifest.permission#MASTER_CLEAR} permission.
*/
public void wipeData(int flags) {
wipeDataInternal(flags, "");
@@ -5325,7 +5326,8 @@
* @param reason a string that contains the reason for wiping data, which can be
* presented to the user.
* @throws SecurityException if the calling application does not own an active administrator
- * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
+ * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} or is not granted the
+ * {@link android.Manifest.permission#MASTER_CLEAR} permission.
* @throws IllegalArgumentException if the input reason string is null or empty, or if
* {@link #WIPE_SILENTLY} is set.
*/
@@ -10121,45 +10123,51 @@
}
/**
- * Sets whether enterprise network preference is enabled on the work profile.
+ * Sets whether preferential network service is enabled on the work profile.
+ * For example, an organization can have a deal/agreement with a carrier that all of
+ * the work data from its employees’ devices will be sent via a network service dedicated
+ * for enterprise use.
*
- * For example, a corporation can have a deal/agreement with a carrier that all of its
- * employees’ devices use data on a network preference dedicated for enterprise use.
+ * An example of a supported preferential network service is the Enterprise
+ * slice on 5G networks.
*
- * By default, enterprise network preference is enabled on the work profile on supported
+ * By default, preferential network service is enabled on the work profile on supported
* carriers and devices. Admins can explicitly disable it with this API.
+ * On fully-managed devices this method is unsupported because all traffic is considered
+ * work traffic.
*
* <p>This method can only be called by the profile owner of a managed profile.
- *
- * @param enabled whether enterprise network preference should be enabled.
+ * @param enabled whether preferential network service should be enabled.
* @throws SecurityException if the caller is not the profile owner.
**/
- public void setEnterpriseNetworkPreferenceEnabled(boolean enabled) {
- throwIfParentInstance("setEnterpriseNetworkPreferenceEnabled");
- if (mService != null) {
- try {
- mService.setEnterpriseNetworkPreferenceEnabled(enabled);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ public void setPreferentialNetworkServiceEnabled(boolean enabled) {
+ throwIfParentInstance("setPreferentialNetworkServiceEnabled");
+ if (mService == null) {
+ return;
+ }
+
+ try {
+ mService.setPreferentialNetworkServiceEnabled(enabled);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
}
}
/**
- * Indicates whether whether enterprise network preference is enabled.
+ * Indicates whether preferential network service is enabled.
*
* <p>This method can be called by the profile owner of a managed profile.
*
- * @return whether whether enterprise network preference is enabled.
+ * @return whether preferential network service is enabled.
* @throws SecurityException if the caller is not the profile owner.
*/
- public boolean isEnterpriseNetworkPreferenceEnabled() {
- throwIfParentInstance("isEnterpriseNetworkPreferenceEnabled");
+ public boolean isPreferentialNetworkServiceEnabled() {
+ throwIfParentInstance("isPreferentialNetworkServiceEnabled");
if (mService == null) {
return false;
}
try {
- return mService.isEnterpriseNetworkPreferenceEnabled(myUserId());
+ return mService.isPreferentialNetworkServiceEnabled(myUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -10963,8 +10971,8 @@
* <p>
* A device owner, by default, may continue granting these permissions. However, for increased
* user control, the admin may opt out of controlling grants for these permissions by including
- * {@link #EXTRA_PROVISIONING_PERMISSION_GRANT_OPT_OUT} in the provisioning parameters. In that
- * case the device owner's control will be limited do denying these permissions.
+ * {@link #EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT} in the provisioning parameters.
+ * In that case the device owner's control will be limited do denying these permissions.
* <p>
* Attempts by the admin to grant these permissions, when the admin is restricted from doing
* so, will be silently ignored (no exception will be thrown).
diff --git a/core/java/android/app/admin/FullyManagedDeviceProvisioningParams.java b/core/java/android/app/admin/FullyManagedDeviceProvisioningParams.java
index 9eb9a7b..80655dd 100644
--- a/core/java/android/app/admin/FullyManagedDeviceProvisioningParams.java
+++ b/core/java/android/app/admin/FullyManagedDeviceProvisioningParams.java
@@ -229,7 +229,7 @@
/**
* Marks that the Device Owner may grant permissions related to device sensors.
- * See {@link DevicePolicyManager#EXTRA_PROVISIONING_PERMISSION_GRANT_OPT_OUT}.
+ * See {@link DevicePolicyManager#EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT}.
*/
@NonNull
@SuppressLint("MissingGetterMatchingBuilder")
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 8a8c69c..05b0be4 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -274,8 +274,8 @@
void setSecondaryLockscreenEnabled(in ComponentName who, boolean enabled);
boolean isSecondaryLockscreenEnabled(in UserHandle userHandle);
- void setEnterpriseNetworkPreferenceEnabled(in boolean enabled);
- boolean isEnterpriseNetworkPreferenceEnabled(int userHandle);
+ void setPreferentialNetworkServiceEnabled(in boolean enabled);
+ boolean isPreferentialNetworkServiceEnabled(int userHandle);
void setLockTaskPackages(in ComponentName who, in String[] packages);
String[] getLockTaskPackages(in ComponentName who);
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index c95a74e..e93138b 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -691,6 +691,19 @@
return minMetrics;
}
+ /**
+ * Returns true if password is non-empty and contains digits only.
+ * @param password
+ * @return
+ */
+ public static boolean isNumericOnly(@NonNull String password) {
+ if (password.length() == 0) return false;
+ for (int i = 0; i < password.length(); i++) {
+ if (categoryChar(password.charAt(i)) != CHAR_DIGIT) return false;
+ }
+ return true;
+ }
+
@Override
public boolean equals(@Nullable Object o) {
if (this == o) return true;
diff --git a/core/java/android/app/servertransaction/LaunchActivityItem.java b/core/java/android/app/servertransaction/LaunchActivityItem.java
index 9f8fcc1..e281a02 100644
--- a/core/java/android/app/servertransaction/LaunchActivityItem.java
+++ b/core/java/android/app/servertransaction/LaunchActivityItem.java
@@ -72,6 +72,7 @@
private ProfilerInfo mProfilerInfo;
private IBinder mAssistToken;
private IBinder mShareableActivityToken;
+ private boolean mLaunchedFromBubble;
/**
* It is only non-null if the process is the first time to launch activity. It is only an
* optimization for quick look up of the interface so the field is ignored for comparison.
@@ -96,7 +97,8 @@
ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
- client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken);
+ client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken,
+ mLaunchedFromBubble);
client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
@@ -120,7 +122,8 @@
List<ReferrerIntent> pendingNewIntents, ActivityOptions activityOptions,
boolean isForward, ProfilerInfo profilerInfo, IBinder assistToken,
IActivityClientController activityClientController,
- FixedRotationAdjustments fixedRotationAdjustments, IBinder shareableActivityToken) {
+ FixedRotationAdjustments fixedRotationAdjustments, IBinder shareableActivityToken,
+ boolean launchedFromBubble) {
LaunchActivityItem instance = ObjectPool.obtain(LaunchActivityItem.class);
if (instance == null) {
instance = new LaunchActivityItem();
@@ -128,7 +131,8 @@
setValues(instance, intent, ident, info, curConfig, overrideConfig, compatInfo, referrer,
voiceInteractor, procState, state, persistentState, pendingResults,
pendingNewIntents, activityOptions, isForward, profilerInfo, assistToken,
- activityClientController, fixedRotationAdjustments, shareableActivityToken);
+ activityClientController, fixedRotationAdjustments, shareableActivityToken,
+ launchedFromBubble);
return instance;
}
@@ -136,7 +140,7 @@
@Override
public void recycle() {
setValues(this, null, 0, null, null, null, null, null, null, 0, null, null, null, null,
- null, false, null, null, null, null, null);
+ null, false, null, null, null, null, null, false);
ObjectPool.recycle(this);
}
@@ -166,6 +170,7 @@
dest.writeStrongInterface(mActivityClientController);
dest.writeTypedObject(mFixedRotationAdjustments, flags);
dest.writeStrongBinder(mShareableActivityToken);
+ dest.writeBoolean(mLaunchedFromBubble);
}
/** Read from Parcel. */
@@ -183,7 +188,8 @@
in.readTypedObject(ProfilerInfo.CREATOR),
in.readStrongBinder(),
IActivityClientController.Stub.asInterface(in.readStrongBinder()),
- in.readTypedObject(FixedRotationAdjustments.CREATOR), in.readStrongBinder());
+ in.readTypedObject(FixedRotationAdjustments.CREATOR), in.readStrongBinder(),
+ in.readBoolean());
}
public static final @NonNull Creator<LaunchActivityItem> CREATOR =
@@ -293,7 +299,8 @@
List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
ActivityOptions activityOptions, boolean isForward, ProfilerInfo profilerInfo,
IBinder assistToken, IActivityClientController activityClientController,
- FixedRotationAdjustments fixedRotationAdjustments, IBinder shareableActivityToken) {
+ FixedRotationAdjustments fixedRotationAdjustments, IBinder shareableActivityToken,
+ boolean launchedFromBubble) {
instance.mIntent = intent;
instance.mIdent = ident;
instance.mInfo = info;
@@ -314,5 +321,6 @@
instance.mActivityClientController = activityClientController;
instance.mFixedRotationAdjustments = fixedRotationAdjustments;
instance.mShareableActivityToken = shareableActivityToken;
+ instance.mLaunchedFromBubble = launchedFromBubble;
}
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 0116db0..0e25d8a 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -439,24 +439,22 @@
/**
* Associates given device with given app for the given user directly, without UI prompt.
*
- * @return whether successful
- *
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES)
- public boolean associate(
+ public void associate(
@NonNull String packageName,
@NonNull MacAddress macAddress) {
if (!checkFeaturePresent()) {
- return false;
+ return;
}
Objects.requireNonNull(packageName, "package name cannot be null");
Objects.requireNonNull(macAddress, "mac address cannot be null");
UserHandle user = android.os.Process.myUserHandle();
try {
- return mService.createAssociation(
+ mService.createAssociation(
packageName, macAddress.toString(), user.getIdentifier());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index 83db358..cc3749c 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -52,5 +52,5 @@
boolean canPairWithoutPrompt(in String packageName, in String deviceMacAddress, int userId);
- boolean createAssociation(in String packageName, in String macAddress, int userId);
+ void createAssociation(in String packageName, in String macAddress, int userId);
}
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 8284203..7e1df1b 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -2655,7 +2655,7 @@
*/
@NonNull
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
- public static Uri createContentUriAsUser(
+ public static Uri createContentUriForUser(
@NonNull Uri contentUri, @NonNull UserHandle userHandle) {
if (!ContentResolver.SCHEME_CONTENT.equals(contentUri.getScheme())) {
throw new IllegalArgumentException(String.format(
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 5fd8561..09ac810 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -4128,9 +4128,11 @@
* Use with {@link #getSystemService(String)} to retrieve a {@link android.os.Vibrator} for
* interacting with the vibration hardware.
*
+ * @deprecated Use {@link android.os.VibratorManager} to retrieve the default system vibrator.
* @see #getSystemService(String)
* @see android.os.Vibrator
*/
+ @Deprecated
public static final String VIBRATOR_SERVICE = "vibrator";
/**
@@ -4839,7 +4841,7 @@
/**
* Use with {@link #getSystemService(String)} to retrieve an
- * {@link android.scheduling.RebootReadinessManagerService} for communicating
+ * {@link android.scheduling.RebootReadinessManager} for communicating
* with the reboot readiness detector.
*
* @see #getSystemService(String)
@@ -5226,6 +5228,14 @@
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.os.PerformanceHintManager} for accessing the performance hinting service.
+ *
+ * @see #getSystemService(String)
+ */
+ public static final String PERFORMANCE_HINT_SERVICE = "performance_hint";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a
* {@link android.content.pm.ShortcutManager} for accessing the launcher shortcut service.
*
* @see #getSystemService(String)
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 8a8dfd1..9ad017c 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4841,31 +4841,6 @@
public static final String ACTION_PACKAGE_NEEDS_INTEGRITY_VERIFICATION =
"android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION";
- /**
- * Broadcast Action: Indicates that the device's reboot readiness has changed.
- *
- * <p>This broadcast will be sent with an extra that indicates whether or not the device is
- * ready to reboot.
- * <p>
- * The receiver <em>must</em> have the {@link android.Manifest.permission#REBOOT} permission.
- * <p class="note">
- * This is a protected intent that can only be sent by the system.
- *
- * @see #EXTRA_IS_READY_TO_REBOOT
- * @hide
- */
- @SystemApi
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_REBOOT_READY = "android.intent.action.REBOOT_READY";
-
- /**
- * A boolean extra used with {@link #ACTION_REBOOT_READY} which indicates if the
- * device is ready to reboot.
- * Will be {@code true} if ready to reboot, {@code false} otherwise.
- * @hide
- */
- @SystemApi
- public static final String EXTRA_IS_READY_TO_REBOOT = "android.intent.extra.IS_READY_TO_REBOOT";
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
@@ -6202,16 +6177,6 @@
*/
public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON";
- /**
- * A boolean extra indicating whether an activity is bubbled. Set on the shortcut or
- * pending intent provided for the bubble. If the extra is not present or false, then it is not
- * bubbled.
- *
- * @see android.app.Notification.Builder#setBubbleMetadata(Notification.BubbleMetadata)
- * @see android.app.Notification.BubbleMetadata.Builder#Builder(String)
- */
- public static final String EXTRA_IS_BUBBLED = "android.intent.extra.IS_BUBBLED";
-
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Intent flags (see mFlags variable).
diff --git a/core/java/android/content/pm/AppSearchShortcutInfo.java b/core/java/android/content/pm/AppSearchShortcutInfo.java
index b2478ca..6d5829c 100644
--- a/core/java/android/content/pm/AppSearchShortcutInfo.java
+++ b/core/java/android/content/pm/AppSearchShortcutInfo.java
@@ -52,6 +52,7 @@
/** The name of the schema type for {@link ShortcutInfo} documents.*/
public static final String SCHEMA_TYPE = "Shortcut";
+ public static final int SCHEMA_VERSION = 1;
public static final String KEY_ACTIVITY = "activity";
public static final String KEY_SHORT_LABEL = "shortLabel";
@@ -163,8 +164,10 @@
.setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
.build()
- ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_RANK)
+ ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_RANK)
.setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
+ .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
.build()
).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_IMPLICIT_RANK)
@@ -175,8 +178,10 @@
.setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
.build()
- ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_FLAGS)
+ ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_FLAGS)
.setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+ .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
+ .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
.build()
).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_ICON_RES_ID)
@@ -201,12 +206,111 @@
.setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_NONE)
.build()
- ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_DISABLED_REASON)
+ ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_DISABLED_REASON)
.setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
+ .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
.build()
).build();
+ /**
+ * The string representation of every flag within {@link ShortcutInfo}. Note that its value
+ * needs to be camelCase since AppSearch's tokenizer will break the word when it sees
+ * underscore.
+ */
+ private static final String IS_DYNAMIC = "Dyn";
+ private static final String NOT_DYNAMIC = "nDyn";
+ private static final String IS_PINNED = "Pin";
+ private static final String NOT_PINNED = "nPin";
+ private static final String HAS_ICON_RES = "IcR";
+ private static final String NO_ICON_RES = "nIcR";
+ private static final String HAS_ICON_FILE = "IcF";
+ private static final String NO_ICON_FILE = "nIcF";
+ private static final String IS_KEY_FIELD_ONLY = "Key";
+ private static final String NOT_KEY_FIELD_ONLY = "nKey";
+ private static final String IS_MANIFEST = "Man";
+ private static final String NOT_MANIFEST = "nMan";
+ private static final String IS_DISABLED = "Dis";
+ private static final String NOT_DISABLED = "nDis";
+ private static final String ARE_STRINGS_RESOLVED = "Str";
+ private static final String NOT_STRINGS_RESOLVED = "nStr";
+ private static final String IS_IMMUTABLE = "Im";
+ private static final String NOT_IMMUTABLE = "nIm";
+ private static final String HAS_ADAPTIVE_BITMAP = "IcA";
+ private static final String NO_ADAPTIVE_BITMAP = "nIcA";
+ private static final String IS_RETURNED_BY_SERVICE = "Rets";
+ private static final String NOT_RETURNED_BY_SERVICE = "nRets";
+ private static final String HAS_ICON_FILE_PENDING_SAVE = "Pens";
+ private static final String NO_ICON_FILE_PENDING_SAVE = "nPens";
+ private static final String IS_SHADOW = "Sdw";
+ private static final String NOT_SHADOW = "nSdw";
+ private static final String IS_LONG_LIVED = "Liv";
+ private static final String NOT_LONG_LIVED = "nLiv";
+ private static final String HAS_ICON_URI = "IcU";
+ private static final String NO_ICON_URI = "nIcU";
+ private static final String IS_CACHED_NOTIFICATION = "CaN";
+ private static final String NOT_CACHED_NOTIFICATION = "nCaN";
+ private static final String IS_CACHED_BUBBLE = "CaB";
+ private static final String NOT_CACHED_BUBBLE = "nCaB";
+ private static final String IS_CACHED_PEOPLE_TITLE = "CaPT";
+ private static final String NOT_CACHED_PEOPLE_TITLE = "nCaPT";
+
+ /**
+ * Following flags are not store within ShortcutInfo, but book-keeping states to reduce search
+ * space when performing queries against AppSearch.
+ */
+ private static final String HAS_BITMAP_PATH = "hBiP";
+ private static final String HAS_STRING_RESOURCE = "hStr";
+ private static final String HAS_NON_ZERO_RANK = "hRan";
+
+ public static final String QUERY_IS_DYNAMIC = KEY_FLAGS + ":" + IS_DYNAMIC;
+ public static final String QUERY_IS_NOT_DYNAMIC = KEY_FLAGS + ":" + NOT_DYNAMIC;
+ public static final String QUERY_IS_PINNED = KEY_FLAGS + ":" + IS_PINNED;
+ public static final String QUERY_IS_NOT_PINNED = KEY_FLAGS + ":" + NOT_PINNED;
+ public static final String QUERY_IS_MANIFEST = KEY_FLAGS + ":" + IS_MANIFEST;
+ public static final String QUERY_IS_NOT_MANIFEST = KEY_FLAGS + ":" + NOT_MANIFEST;
+ public static final String QUERY_IS_PINNED_AND_ENABLED =
+ "(" + KEY_FLAGS + ":" + IS_PINNED + " " + KEY_FLAGS + ":" + NOT_DISABLED + ")";
+ public static final String QUERY_IS_CACHED =
+ "(" + KEY_FLAGS + ":" + IS_CACHED_NOTIFICATION + " OR "
+ + KEY_FLAGS + ":" + IS_CACHED_BUBBLE + " OR "
+ + KEY_FLAGS + ":" + IS_CACHED_PEOPLE_TITLE + ")";
+ public static final String QUERY_IS_NOT_CACHED =
+ "(" + KEY_FLAGS + ":" + NOT_CACHED_NOTIFICATION + " "
+ + KEY_FLAGS + ":" + NOT_CACHED_BUBBLE + " "
+ + KEY_FLAGS + ":" + NOT_CACHED_PEOPLE_TITLE + ")";
+ public static final String QUERY_IS_FLOATING =
+ "((" + IS_PINNED + " OR " + QUERY_IS_CACHED + ") "
+ + QUERY_IS_NOT_DYNAMIC + " " + QUERY_IS_NOT_MANIFEST + ")";
+ public static final String QUERY_IS_NOT_FLOATING =
+ "((" + QUERY_IS_NOT_PINNED + " " + QUERY_IS_NOT_CACHED + ") OR "
+ + QUERY_IS_DYNAMIC + " OR " + QUERY_IS_MANIFEST + ")";
+ public static final String QUERY_IS_VISIBLE_TO_PUBLISHER =
+ "(" + KEY_DISABLED_REASON + ":" + ShortcutInfo.DISABLED_REASON_NOT_DISABLED
+ + " OR " + KEY_DISABLED_REASON + ":"
+ + ShortcutInfo.DISABLED_REASON_BY_APP
+ + " OR " + KEY_DISABLED_REASON + ":"
+ + ShortcutInfo.DISABLED_REASON_APP_CHANGED
+ + " OR " + KEY_DISABLED_REASON + ":"
+ + ShortcutInfo.DISABLED_REASON_UNKNOWN + ")";
+ public static final String QUERY_DISABLED_REASON_VERSION_LOWER =
+ KEY_DISABLED_REASON + ":" + ShortcutInfo.DISABLED_REASON_VERSION_LOWER;
+ public static final String QUERY_IS_NON_MANIFEST_VISIBLE =
+ "(" + QUERY_IS_NOT_MANIFEST + " " + QUERY_IS_VISIBLE_TO_PUBLISHER + " ("
+ + QUERY_IS_PINNED + " OR " + QUERY_IS_CACHED + " OR " + QUERY_IS_DYNAMIC + "))";
+ public static final String QUERY_IS_VISIBLE_CACHED_OR_PINNED =
+ "(" + QUERY_IS_VISIBLE_TO_PUBLISHER + " " + QUERY_IS_DYNAMIC
+ + " (" + QUERY_IS_CACHED + " OR " + QUERY_IS_PINNED + "))";
+ public static final String QUERY_IS_VISIBLE_PINNED_ONLY =
+ "(" + QUERY_IS_VISIBLE_TO_PUBLISHER + " " + QUERY_IS_PINNED + " " + QUERY_IS_NOT_CACHED
+ + " " + QUERY_IS_NOT_DYNAMIC + " " + QUERY_IS_NOT_MANIFEST + ")";
+ public static final String QUERY_HAS_BITMAP_PATH = KEY_FLAGS + ":" + HAS_BITMAP_PATH;
+ public static final String QUERY_HAS_STRING_RESOURCE = KEY_FLAGS + ":" + HAS_STRING_RESOURCE;
+ public static final String QUERY_HAS_NON_ZERO_RANK = KEY_FLAGS + ":" + HAS_NON_ZERO_RANK;
+ public static final String QUERY_IS_FLOATING_AND_HAS_RANK =
+ "(" + QUERY_IS_FLOATING + " " + QUERY_HAS_NON_ZERO_RANK + ")";
+
public AppSearchShortcutInfo(@NonNull GenericDocument document) {
super(document);
}
@@ -304,16 +408,16 @@
final Person[] persons = parsePerson(getPropertyDocumentArray(KEY_PERSON));
final String locusIdString = getPropertyString(KEY_LOCUS_ID);
final LocusId locusId = locusIdString == null ? null : new LocusId(locusIdString);
- final int rank = (int) getPropertyLong(KEY_RANK);
+ final int rank = Integer.parseInt(getPropertyString(KEY_RANK));
final int implicitRank = (int) getPropertyLong(KEY_IMPLICIT_RANK);
final byte[] extrasByte = getPropertyBytes(KEY_EXTRAS);
final PersistableBundle extras = transformToPersistableBundle(extrasByte);
- final int flags = parseFlags(getPropertyLongArray(KEY_FLAGS));
+ final int flags = parseFlags(getPropertyStringArray(KEY_FLAGS));
final int iconResId = (int) getPropertyLong(KEY_ICON_RES_ID);
final String iconResName = getPropertyString(KEY_ICON_RES_NAME);
final String iconUri = getPropertyString(KEY_ICON_URI);
final String bitmapPath = getPropertyString(KEY_BITMAP_PATH);
- final int disabledReason = (int) getPropertyLong(KEY_DISABLED_REASON);
+ final int disabledReason = Integer.parseInt(getPropertyString(KEY_DISABLED_REASON));
final ShortcutInfo si = new ShortcutInfo(
userId, getUri(), packageName, activity, icon, shortLabel, shortLabelResId,
shortLabelResName, longLabel, longLabelResId, longLabelResName, disabledMessage,
@@ -344,6 +448,9 @@
@VisibleForTesting
public static class Builder extends GenericDocument.Builder<Builder> {
+ private List<String> mFlags = new ArrayList<>(1);
+ private boolean mHasStringResource = false;
+
public Builder(String packageName, String id) {
super(/*namespace=*/ packageName, id, SCHEMA_TYPE);
}
@@ -386,8 +493,11 @@
* @hide
*/
@NonNull
- public Builder setShortLabelResId(@Nullable final int shortLabelResId) {
+ public Builder setShortLabelResId(final int shortLabelResId) {
setPropertyLong(KEY_SHORT_LABEL_RES_ID, shortLabelResId);
+ if (shortLabelResId != 0) {
+ mHasStringResource = true;
+ }
return this;
}
@@ -417,8 +527,11 @@
* @hide
*/
@NonNull
- public Builder setLongLabelResId(@Nullable final int longLabelResId) {
+ public Builder setLongLabelResId(final int longLabelResId) {
setPropertyLong(KEY_LONG_LABEL_RES_ID, longLabelResId);
+ if (longLabelResId != 0) {
+ mHasStringResource = true;
+ }
return this;
}
@@ -448,8 +561,11 @@
* @hide
*/
@NonNull
- public Builder setDisabledMessageResId(@Nullable final int disabledMessageResId) {
+ public Builder setDisabledMessageResId(final int disabledMessageResId) {
setPropertyLong(KEY_DISABLED_MESSAGE_RES_ID, disabledMessageResId);
+ if (disabledMessageResId != 0) {
+ mHasStringResource = true;
+ }
return this;
}
@@ -546,7 +662,10 @@
@NonNull
public Builder setRank(final int rank) {
Preconditions.checkArgument((0 <= rank), "Rank cannot be negative");
- setPropertyLong(KEY_RANK, rank);
+ setPropertyString(KEY_RANK, String.valueOf(rank));
+ if (rank != 0) {
+ mFlags.add(HAS_NON_ZERO_RANK);
+ }
return this;
}
@@ -574,7 +693,10 @@
* @hide
*/
public Builder setFlags(@ShortcutInfo.ShortcutFlags final int flags) {
- setPropertyLong(KEY_FLAGS, flattenFlags(flags));
+ final String[] flagArray = flattenFlags(flags);
+ if (flagArray != null && flagArray.length > 0) {
+ mFlags.addAll(Arrays.asList(flagArray));
+ }
return this;
}
@@ -603,6 +725,7 @@
public Builder setBitmapPath(@Nullable final String bitmapPath) {
if (!TextUtils.isEmpty(bitmapPath)) {
setPropertyString(KEY_BITMAP_PATH, bitmapPath);
+ mFlags.add(HAS_BITMAP_PATH);
}
return this;
}
@@ -621,7 +744,7 @@
* @hide
*/
public Builder setDisabledReason(@ShortcutInfo.DisabledReason final int disabledReason) {
- setPropertyLong(KEY_DISABLED_REASON, disabledReason);
+ setPropertyString(KEY_DISABLED_REASON, String.valueOf(disabledReason));
return this;
}
@@ -631,6 +754,10 @@
@NonNull
@Override
public AppSearchShortcutInfo build() {
+ if (mHasStringResource) {
+ mFlags.add(HAS_STRING_RESOURCE);
+ }
+ setPropertyString(KEY_FLAGS, mFlags.toArray(new String[0]));
return new AppSearchShortcutInfo(super.build());
}
}
@@ -682,20 +809,115 @@
}
}
- private static long[] flattenFlags(@ShortcutInfo.ShortcutFlags final int flags) {
- final List<Integer> flattenedFlags = new ArrayList<>();
- flattenedFlags.add(0);
+ private static String[] flattenFlags(@ShortcutInfo.ShortcutFlags final int flags) {
+ final List<String> flattenedFlags = new ArrayList<>();
for (int i = 0; i < 31; i++) {
final int mask = 1 << i;
- if ((flags & mask) != 0) {
- flattenedFlags.add(mask);
+ final String value = flagToString(flags, mask);
+ if (value != null) {
+ flattenedFlags.add(value);
}
}
- return flattenedFlags.stream().mapToLong(i -> i).toArray();
+ return flattenedFlags.toArray(new String[0]);
}
- private static int parseFlags(final long[] flags) {
- return (int) Arrays.stream(flags).reduce((p, v) -> p | v).getAsLong();
+ @Nullable
+ private static String flagToString(
+ @ShortcutInfo.ShortcutFlags final int flags, final int mask) {
+ switch (mask) {
+ case ShortcutInfo.FLAG_DYNAMIC:
+ return (flags & mask) != 0 ? IS_DYNAMIC : NOT_DYNAMIC;
+ case ShortcutInfo.FLAG_PINNED:
+ return (flags & mask) != 0 ? IS_PINNED : NOT_PINNED;
+ case ShortcutInfo.FLAG_HAS_ICON_RES:
+ return (flags & mask) != 0 ? HAS_ICON_RES : NO_ICON_RES;
+ case ShortcutInfo.FLAG_HAS_ICON_FILE:
+ return (flags & mask) != 0 ? HAS_ICON_FILE : NO_ICON_FILE;
+ case ShortcutInfo.FLAG_KEY_FIELDS_ONLY:
+ return (flags & mask) != 0 ? IS_KEY_FIELD_ONLY : NOT_KEY_FIELD_ONLY;
+ case ShortcutInfo.FLAG_MANIFEST:
+ return (flags & mask) != 0 ? IS_MANIFEST : NOT_MANIFEST;
+ case ShortcutInfo.FLAG_DISABLED:
+ return (flags & mask) != 0 ? IS_DISABLED : NOT_DISABLED;
+ case ShortcutInfo.FLAG_STRINGS_RESOLVED:
+ return (flags & mask) != 0 ? ARE_STRINGS_RESOLVED : NOT_STRINGS_RESOLVED;
+ case ShortcutInfo.FLAG_IMMUTABLE:
+ return (flags & mask) != 0 ? IS_IMMUTABLE : NOT_IMMUTABLE;
+ case ShortcutInfo.FLAG_ADAPTIVE_BITMAP:
+ return (flags & mask) != 0 ? HAS_ADAPTIVE_BITMAP : NO_ADAPTIVE_BITMAP;
+ case ShortcutInfo.FLAG_RETURNED_BY_SERVICE:
+ return (flags & mask) != 0 ? IS_RETURNED_BY_SERVICE : NOT_RETURNED_BY_SERVICE;
+ case ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE:
+ return (flags & mask) != 0 ? HAS_ICON_FILE_PENDING_SAVE : NO_ICON_FILE_PENDING_SAVE;
+ case ShortcutInfo.FLAG_SHADOW:
+ return (flags & mask) != 0 ? IS_SHADOW : NOT_SHADOW;
+ case ShortcutInfo.FLAG_LONG_LIVED:
+ return (flags & mask) != 0 ? IS_LONG_LIVED : NOT_LONG_LIVED;
+ case ShortcutInfo.FLAG_HAS_ICON_URI:
+ return (flags & mask) != 0 ? HAS_ICON_URI : NO_ICON_URI;
+ case ShortcutInfo.FLAG_CACHED_NOTIFICATIONS:
+ return (flags & mask) != 0 ? IS_CACHED_NOTIFICATION : NOT_CACHED_NOTIFICATION;
+ case ShortcutInfo.FLAG_CACHED_BUBBLES:
+ return (flags & mask) != 0 ? IS_CACHED_BUBBLE : NOT_CACHED_BUBBLE;
+ case ShortcutInfo.FLAG_CACHED_PEOPLE_TILE:
+ return (flags & mask) != 0 ? IS_CACHED_PEOPLE_TITLE : NOT_CACHED_PEOPLE_TITLE;
+ default:
+ return null;
+ }
+ }
+
+ private static int parseFlags(@Nullable final String[] flags) {
+ if (flags == null) {
+ return 0;
+ }
+ int ret = 0;
+ for (int i = 0; i < flags.length; i++) {
+ ret = ret | parseFlag(flags[i]);
+ }
+ return ret;
+ }
+
+ private static int parseFlag(final String value) {
+ switch (value) {
+ case IS_DYNAMIC:
+ return ShortcutInfo.FLAG_DYNAMIC;
+ case IS_PINNED:
+ return ShortcutInfo.FLAG_PINNED;
+ case HAS_ICON_RES:
+ return ShortcutInfo.FLAG_HAS_ICON_RES;
+ case HAS_ICON_FILE:
+ return ShortcutInfo.FLAG_HAS_ICON_FILE;
+ case IS_KEY_FIELD_ONLY:
+ return ShortcutInfo.FLAG_KEY_FIELDS_ONLY;
+ case IS_MANIFEST:
+ return ShortcutInfo.FLAG_MANIFEST;
+ case IS_DISABLED:
+ return ShortcutInfo.FLAG_DISABLED;
+ case ARE_STRINGS_RESOLVED:
+ return ShortcutInfo.FLAG_STRINGS_RESOLVED;
+ case IS_IMMUTABLE:
+ return ShortcutInfo.FLAG_IMMUTABLE;
+ case HAS_ADAPTIVE_BITMAP:
+ return ShortcutInfo.FLAG_ADAPTIVE_BITMAP;
+ case IS_RETURNED_BY_SERVICE:
+ return ShortcutInfo.FLAG_RETURNED_BY_SERVICE;
+ case HAS_ICON_FILE_PENDING_SAVE:
+ return ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE;
+ case IS_SHADOW:
+ return ShortcutInfo.FLAG_SHADOW;
+ case IS_LONG_LIVED:
+ return ShortcutInfo.FLAG_LONG_LIVED;
+ case HAS_ICON_URI:
+ return ShortcutInfo.FLAG_HAS_ICON_URI;
+ case IS_CACHED_NOTIFICATION:
+ return ShortcutInfo.FLAG_CACHED_NOTIFICATIONS;
+ case IS_CACHED_BUBBLE:
+ return ShortcutInfo.FLAG_CACHED_BUBBLES;
+ case IS_CACHED_PEOPLE_TITLE:
+ return ShortcutInfo.FLAG_CACHED_PEOPLE_TILE;
+ default:
+ return 0;
+ }
}
@NonNull
diff --git a/core/java/android/content/pm/DataLoaderParams.java b/core/java/android/content/pm/DataLoaderParams.java
index 93db1e1..f808cfd 100644
--- a/core/java/android/content/pm/DataLoaderParams.java
+++ b/core/java/android/content/pm/DataLoaderParams.java
@@ -17,20 +17,24 @@
package android.content.pm;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.content.ComponentName;
/**
- * This class represents the parameters used to configure a Data Loader.
+ * This class represents the parameters used to configure a DataLoader.
+ *
+ * {@see android.service.dataloader.DataLoaderService.DataLoader}
*/
public class DataLoaderParams {
@NonNull
private final DataLoaderParamsParcel mData;
/**
- * Creates and populates set of Data Loader parameters for Streaming installation.
+ * Creates and populates set of DataLoader parameters for Streaming installation.
*
- * @param componentName Data Loader component supporting Streaming installation.
- * @param arguments free form installation arguments
+ * @param componentName the component implementing a DataLoaderService that is responsible
+ * for providing data blocks while streaming.
+ * @param arguments free form installation arguments.
*/
public static final @NonNull DataLoaderParams forStreaming(@NonNull ComponentName componentName,
@NonNull String arguments) {
@@ -40,9 +44,12 @@
/**
* Creates and populates set of Data Loader parameters for Incremental installation.
*
- * @param componentName Data Loader component supporting Incremental installation.
+ * @param componentName DataLoaderService component supporting Incremental installation.
* @param arguments free form installation arguments
+ *
+ * @hide
*/
+ @SystemApi
public static final @NonNull DataLoaderParams forIncremental(
@NonNull ComponentName componentName, @NonNull String arguments) {
return new DataLoaderParams(DataLoaderType.INCREMENTAL, componentName, arguments);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 0be77e0..8b380b7 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -229,8 +229,7 @@
/**
* Type of DataLoader for this session. Will be one of
- * {@link #DATA_LOADER_TYPE_NONE}, {@link #DATA_LOADER_TYPE_STREAMING},
- * {@link #DATA_LOADER_TYPE_INCREMENTAL}.
+ * {@link #DATA_LOADER_TYPE_NONE}, {@link #DATA_LOADER_TYPE_STREAMING}.
* <p>
* See the individual types documentation for details.
*
@@ -359,7 +358,9 @@
* Streaming installation using Incremental FileSystem.
*
* @see #EXTRA_DATA_LOADER_TYPE
+ * @hide
*/
+ @SystemApi
public static final int DATA_LOADER_TYPE_INCREMENTAL = DataLoaderType.INCREMENTAL;
/**
@@ -1165,7 +1166,7 @@
}
/**
- * Adds a file to session. On commit this file will be pulled from dataLoader {@code
+ * Adds a file to session. On commit this file will be pulled from DataLoader {@code
* android.service.dataloader.DataLoaderService.DataLoader}.
*
* @param location target location for the file. Possible values:
@@ -1180,7 +1181,7 @@
* @param lengthBytes total size of the file being written.
* The system may clear various caches as needed to allocate
* this space.
- * @param metadata additional info use by dataLoader to pull data for the file.
+ * @param metadata additional info use by DataLoader to pull data for the file.
* @param signature additional file signature, e.g.
* <a href="https://source.android.com/security/apksigning/v4.html">APK Signature Scheme v4</a>
* @throws SecurityException if called after the session has been
@@ -2021,7 +2022,7 @@
/**
* Set the data loader params for the session.
- * This also switches installation into data provider mode and disallow direct writes into
+ * This also switches installation into data loading mode and disallow direct writes into
* staging folder.
*
* @see android.service.dataloader.DataLoaderService.DataLoader
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 21de365..bba2fd0 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2639,8 +2639,12 @@
public static final String FEATURE_SE_OMAPI_SD = "android.hardware.se.omapi.sd";
/**
- * Feature for {@link #getSystemAvailableFeatures} and
- * {@link #hasSystemFeature}: The device is compatible with Android’s security model.
+ * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device is
+ * compatible with Android’s security model.
+ *
+ * <p>See sections 2 and 9 in the
+ * <a href="https://source.android.com/compatibility/android-cdd">Android CDD</a> for more
+ * details.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SECURITY_MODEL_COMPATIBLE =
@@ -3497,14 +3501,6 @@
/**
* Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
- * The device supports translation of text-to-text in multiple languages via integration with
- * the system {@link android.service.translation.TranslationService translation provider}.
- */
- @SdkConstant(SdkConstantType.FEATURE)
- public static final String FEATURE_TRANSLATION = "android.software.translation";
-
- /**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
* The device implements headtracking suitable for a VR device.
*/
@SdkConstant(SdkConstantType.FEATURE)
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index e115597..55a6ab7 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -32,6 +32,7 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.pm.overlay.OverlayPaths;
+import android.content.pm.parsing.ParsingPackageRead;
import android.content.pm.parsing.component.ParsedMainComponent;
import android.os.BaseBundle;
import android.os.Debug;
@@ -53,7 +54,6 @@
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
-import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
@@ -310,6 +310,20 @@
return result;
}
+ public boolean isPackageEnabled(@NonNull ParsingPackageRead pkg) {
+ switch (this.enabled) {
+ case COMPONENT_ENABLED_STATE_ENABLED:
+ return true;
+ case COMPONENT_ENABLED_STATE_DISABLED:
+ case COMPONENT_ENABLED_STATE_DISABLED_USER:
+ case COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
+ return false;
+ default:
+ case COMPONENT_ENABLED_STATE_DEFAULT:
+ return pkg.isEnabled();
+ }
+ }
+
public boolean isEnabled(ComponentInfo componentInfo, int flags) {
return isEnabled(componentInfo.applicationInfo.enabled, componentInfo.enabled,
componentInfo.name, flags);
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index 275e81c..76712b5 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -148,7 +148,13 @@
public static final int FLAG_CACHED_ALL =
FLAG_CACHED_NOTIFICATIONS | FLAG_CACHED_BUBBLES | FLAG_CACHED_PEOPLE_TILE;
- /** @hide */
+ /**
+ * Bitmask-based flags indicating different states associated with the shortcut. Note that if
+ * new value is added here, consider adding also the corresponding string representation and
+ * queries in {@link AppSearchShortcutInfo}.
+ *
+ * @hide
+ */
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
FLAG_DYNAMIC,
FLAG_PINNED,
diff --git a/core/java/android/content/pm/verify/domain/TEST_MAPPING b/core/java/android/content/pm/verify/domain/TEST_MAPPING
index c6c9791..5fcf411 100644
--- a/core/java/android/content/pm/verify/domain/TEST_MAPPING
+++ b/core/java/android/content/pm/verify/domain/TEST_MAPPING
@@ -7,6 +7,12 @@
"include-filter": "com.android.server.pm.test.verify.domain"
}
]
+ },
+ {
+ "name": "CtsDomainVerificationDeviceTestCases"
+ },
+ {
+ "name": "CtsDomainVerificationHostTestCases"
}
]
}
diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java
index 93e5a0e..8912997 100644
--- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java
+++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java
@@ -102,9 +102,7 @@
/** {@hide} */
public boolean quickPickupSensorEnabled(int user) {
- return boolSettingDefaultOff(Settings.Secure.DOZE_QUICK_PICKUP_GESTURE, user)
- && !TextUtils.isEmpty(quickPickupSensorType())
- && !alwaysOnEnabled(user);
+ return !TextUtils.isEmpty(quickPickupSensorType()) && !alwaysOnEnabled(user);
}
/** {@hide} */
diff --git a/core/java/android/hardware/face/FaceSensorPropertiesInternal.java b/core/java/android/hardware/face/FaceSensorPropertiesInternal.java
index 44dffb2..9936b88 100644
--- a/core/java/android/hardware/face/FaceSensorPropertiesInternal.java
+++ b/core/java/android/hardware/face/FaceSensorPropertiesInternal.java
@@ -96,6 +96,7 @@
@Override
public String toString() {
- return "ID: " + sensorId + ", Strength: " + sensorStrength + ", Type: " + sensorType;
+ return "ID: " + sensorId + ", Strength: " + sensorStrength + ", Type: " + sensorType
+ + ", SupportsFaceDetection: " + supportsFaceDetection;
}
}
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 7b6e129..ab9e0df 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -1268,12 +1268,17 @@
return context.getString(
com.android.internal.R.string.fingerprint_error_security_update_required);
case FINGERPRINT_ERROR_VENDOR: {
- String[] msgArray = context.getResources().getStringArray(
- com.android.internal.R.array.fingerprint_error_vendor);
- if (vendorCode < msgArray.length) {
+ String[] msgArray = context.getResources().getStringArray(
+ com.android.internal.R.array.fingerprint_error_vendor);
+ if (vendorCode < msgArray.length) {
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
return msgArray[vendorCode];
+ } else {
+ return context.getString(
+ com.android.internal.R.string.fingerprint_error_unable_to_process);
}
}
+ }
}
Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode);
return null;
@@ -1302,12 +1307,17 @@
return context.getString(
com.android.internal.R.string.fingerprint_acquired_too_fast);
case FINGERPRINT_ACQUIRED_VENDOR: {
- String[] msgArray = context.getResources().getStringArray(
- com.android.internal.R.array.fingerprint_acquired_vendor);
- if (vendorCode < msgArray.length) {
+ String[] msgArray = context.getResources().getStringArray(
+ com.android.internal.R.array.fingerprint_acquired_vendor);
+ if (vendorCode < msgArray.length) {
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
return msgArray[vendorCode];
+ } else {
+ return context.getString(
+ com.android.internal.R.string.fingerprint_error_unable_to_process);
}
}
+ }
break;
case FINGERPRINT_ACQUIRED_START:
return null;
diff --git a/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl b/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
index b79d6e0..1551e07 100644
--- a/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
+++ b/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
@@ -24,6 +24,13 @@
* @hide
*/
oneway interface IUdfpsHbmListener {
+
+ /** HBM that applies to the whole screen. */
+ const int GLOBAL_HBM = 0;
+
+ /** HBM that only applies to a portion of the screen. */
+ const int LOCAL_HBM = 1;
+
/**
* UdfpsController will call this method when the HBM is enabled.
*
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 4743fee..336fbf2 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -22,7 +22,7 @@
import android.hardware.input.IInputDevicesChangedListener;
import android.hardware.input.ITabletModeChangedListener;
import android.hardware.input.TouchCalibration;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.hardware.input.IInputSensorEventListener;
import android.hardware.input.InputSensorInfo;
import android.hardware.lights.Light;
@@ -91,7 +91,7 @@
// Input device vibrator control.
void vibrate(int deviceId, in VibrationEffect effect, IBinder token);
- void vibrateCombined(int deviceId, in CombinedVibrationEffect effect, IBinder token);
+ void vibrateCombined(int deviceId, in CombinedVibration vibration, IBinder token);
void cancelVibrate(int deviceId, IBinder token);
int[] getVibratorIds(int deviceId);
boolean isVibrating(int deviceId);
diff --git a/core/java/android/hardware/input/InputDeviceVibrator.java b/core/java/android/hardware/input/InputDeviceVibrator.java
index a4817ae..d8150e4 100644
--- a/core/java/android/hardware/input/InputDeviceVibrator.java
+++ b/core/java/android/hardware/input/InputDeviceVibrator.java
@@ -20,11 +20,13 @@
import android.annotation.NonNull;
import android.app.ActivityThread;
import android.content.Context;
+import android.hardware.vibrator.IVibrator;
import android.os.Binder;
import android.os.IVibratorStateListener;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.os.VibratorInfo;
import android.util.ArrayMap;
import android.util.Log;
@@ -41,7 +43,7 @@
// mDeviceId represents InputDevice ID the vibrator belongs to
private final int mDeviceId;
- private final int mVibratorId;
+ private final VibratorInfo mVibratorInfo;
private final Binder mToken;
private final InputManager mInputManager;
@@ -52,7 +54,13 @@
InputDeviceVibrator(InputManager inputManager, int deviceId, int vibratorId) {
mInputManager = inputManager;
mDeviceId = deviceId;
- mVibratorId = vibratorId;
+ mVibratorInfo = new VibratorInfo.Builder(vibratorId)
+ .setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL)
+ // Set predefined support to empty as we know input devices do not support them.
+ .setSupportedEffects()
+ .setSupportedPrimitives()
+ .setSupportedBraking()
+ .build();
mToken = new Binder();
}
@@ -74,8 +82,8 @@
}
@Override
- public int getId() {
- return mVibratorId;
+ protected VibratorInfo getInfo() {
+ return mVibratorInfo;
}
@Override
@@ -159,7 +167,7 @@
@Override
public boolean hasAmplitudeControl() {
- return true;
+ return mVibratorInfo.hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL);
}
/**
@@ -175,4 +183,9 @@
public void cancel() {
mInputManager.cancelVibrate(mDeviceId, mToken);
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancel();
+ }
}
diff --git a/core/java/android/hardware/input/InputDeviceVibratorManager.java b/core/java/android/hardware/input/InputDeviceVibratorManager.java
index d843407..7caff72 100644
--- a/core/java/android/hardware/input/InputDeviceVibratorManager.java
+++ b/core/java/android/hardware/input/InputDeviceVibratorManager.java
@@ -19,7 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Binder;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.NullVibrator;
import android.os.VibrationAttributes;
import android.os.Vibrator;
@@ -125,7 +125,7 @@
}
@Override
- public void vibrate(int uid, String opPkg, @NonNull CombinedVibrationEffect effect,
+ public void vibrate(int uid, String opPkg, @NonNull CombinedVibration effect,
String reason, @Nullable VibrationAttributes attributes) {
mInputManager.vibrate(mDeviceId, effect, mToken);
}
@@ -134,4 +134,9 @@
public void cancel() {
mInputManager.cancelVibrate(mDeviceId, mToken);
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancel();
+ }
}
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index c83ccfa..b6d2eaf 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -37,7 +37,7 @@
import android.hardware.lights.LightsRequest;
import android.os.BlockUntrustedTouchesMode;
import android.os.Build;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.Handler;
import android.os.IBinder;
import android.os.IVibratorStateListener;
@@ -1470,7 +1470,7 @@
/*
* Perform combined vibration effect
*/
- void vibrate(int deviceId, CombinedVibrationEffect effect, IBinder token) {
+ void vibrate(int deviceId, CombinedVibration effect, IBinder token) {
try {
mIm.vibrateCombined(deviceId, effect, token);
} catch (RemoteException ex) {
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index 8f1e2de..7ef5bac 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -354,7 +354,7 @@
}
for (Entry<String, Integer> entry : ALGO_TO_REQUIRED_FIRST_SDK.entrySet()) {
- if (Build.VERSION.FIRST_SDK_INT >= entry.getValue()) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT >= entry.getValue()) {
enabledAlgos.add(entry.getKey());
}
}
diff --git a/core/java/android/os/BatteryStatsManager.java b/core/java/android/os/BatteryStatsManager.java
index e47478a..2c088e2 100644
--- a/core/java/android/os/BatteryStatsManager.java
+++ b/core/java/android/os/BatteryStatsManager.java
@@ -429,10 +429,9 @@
* @param uid Uid of this event. For the active state it represents the uid that was responsible
* for waking the radio, or -1 if the system was responsible for waking the radio.
* For inactive state, the UID should always be -1.
- * @throws RuntimeException if there are binder remote-invocation errors.
*/
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
- public void reportMobileRadioPowerState(boolean isActive, int uid) throws RuntimeException {
+ public void reportMobileRadioPowerState(boolean isActive, int uid) {
try {
mBatteryStats.noteMobileRadioPowerState(getDataConnectionPowerState(isActive),
SystemClock.elapsedRealtimeNanos(), uid);
@@ -448,10 +447,9 @@
* @param uid Uid of this event. For the active state it represents the uid that was responsible
* for waking the radio, or -1 if the system was responsible for waking the radio.
* For inactive state, the UID should always be -1.
- * @throws RuntimeException if there are binder remote-invocation errors.
*/
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
- public void reportWifiRadioPowerState(boolean isActive, int uid) throws RuntimeException {
+ public void reportWifiRadioPowerState(boolean isActive, int uid) {
try {
mBatteryStats.noteWifiRadioPowerState(getDataConnectionPowerState(isActive),
SystemClock.elapsedRealtimeNanos(), uid);
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 834ae33..7b8fdd7 100755
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -348,7 +348,7 @@
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@TestApi
- public static final int FIRST_SDK_INT = SystemProperties
+ public static final int DEVICE_INITIAL_SDK_INT = SystemProperties
.getInt("ro.product.first_api_level", 0);
/**
diff --git a/core/java/android/os/CombinedVibrationEffect.aidl b/core/java/android/os/CombinedVibration.aidl
similarity index 94%
rename from core/java/android/os/CombinedVibrationEffect.aidl
rename to core/java/android/os/CombinedVibration.aidl
index 330733c..91317bd 100644
--- a/core/java/android/os/CombinedVibrationEffect.aidl
+++ b/core/java/android/os/CombinedVibration.aidl
@@ -16,4 +16,4 @@
package android.os;
-parcelable CombinedVibrationEffect;
+parcelable CombinedVibration;
diff --git a/core/java/android/os/CombinedVibrationEffect.java b/core/java/android/os/CombinedVibration.java
similarity index 77%
rename from core/java/android/os/CombinedVibrationEffect.java
rename to core/java/android/os/CombinedVibration.java
index e068772..aff55af 100644
--- a/core/java/android/os/CombinedVibrationEffect.java
+++ b/core/java/android/os/CombinedVibration.java
@@ -27,56 +27,61 @@
import java.util.Objects;
/**
- * A CombinedVibrationEffect describes a haptic effect to be performed by one or more {@link
- * Vibrator Vibrators}.
+ * A CombinedVibration describes a combination of haptic effects to be performed by one or more
+ * {@link Vibrator Vibrators}.
*
* These effects may be any number of things, from single shot vibrations to complex waveforms.
+ *
* @see VibrationEffect
*/
@SuppressWarnings({"ParcelNotFinal", "ParcelCreator"}) // Parcel only extended here.
-public abstract class CombinedVibrationEffect implements Parcelable {
+public abstract class CombinedVibration implements Parcelable {
private static final int PARCEL_TOKEN_MONO = 1;
private static final int PARCEL_TOKEN_STEREO = 2;
private static final int PARCEL_TOKEN_SEQUENTIAL = 3;
/** Prevent subclassing from outside of the framework. */
- CombinedVibrationEffect() {
+ CombinedVibration() {
}
/**
- * Create a synced vibration effect.
+ * Create a vibration that plays a single effect in parallel on all vibrators.
*
- * A synced vibration effect should be performed by multiple vibrators at the same time.
+ * A parallel vibration that takes a single {@link VibrationEffect} to be performed by multiple
+ * vibrators at the same time.
*
* @param effect The {@link VibrationEffect} to perform.
- * @return The synced effect.
+ * @return The combined vibration representing the single effect to be played in all vibrators.
*/
@NonNull
- public static CombinedVibrationEffect createSynced(@NonNull VibrationEffect effect) {
- CombinedVibrationEffect combined = new Mono(effect);
+ public static CombinedVibration createParallel(@NonNull VibrationEffect effect) {
+ CombinedVibration combined = new Mono(effect);
combined.validate();
return combined;
}
/**
- * Start creating a synced vibration effect.
+ * Start creating a vibration that plays effects in parallel on one or more vibrators.
*
- * A synced vibration effect should be performed by multiple vibrators at the same time.
+ * A parallel vibration takes one or more {@link VibrationEffect VibrationEffects} associated to
+ * individual vibrators to be performed at the same time.
*
- * @see CombinedVibrationEffect.SyncedCombination
+ * @see CombinedVibration.ParallelCombination
*/
@NonNull
- public static SyncedCombination startSynced() {
- return new SyncedCombination();
+ public static ParallelCombination startParallel() {
+ return new ParallelCombination();
}
/**
- * Start creating a sequential vibration effect.
+ * Start creating a vibration that plays effects in sequence on one or more vibrators.
*
- * A sequential vibration effect should be performed by multiple vibrators in order.
+ * A sequential vibration takes one or more {@link CombinedVibration CombinedVibrations} to be
+ * performed by one or more vibrators in order. Each {@link CombinedVibration} starts only after
+ * the previous one is finished.
*
- * @see CombinedVibrationEffect.SequentialCombination
* @hide
+ * @see CombinedVibration.SequentialCombination
*/
@TestApi
@NonNull
@@ -92,7 +97,7 @@
/**
* Gets the estimated duration of the combined vibration in milliseconds.
*
- * <p>For synced combinations this means the maximum duration of any individual {@link
+ * <p>For parallel combinations this means the maximum duration of any individual {@link
* VibrationEffect}. For sequential combinations, this is a sum of each step and delays.
*
* <p>For combinations of effects without a defined end (e.g. a Waveform with a non-negative
@@ -112,15 +117,15 @@
public abstract boolean hasVibrator(int vibratorId);
/**
- * A combination of haptic effects that should be played in multiple vibrators in sync.
+ * A combination of haptic effects that should be played in multiple vibrators in parallel.
*
- * @see CombinedVibrationEffect#startSynced()
+ * @see CombinedVibration#startParallel()
*/
- public static final class SyncedCombination {
+ public static final class ParallelCombination {
private final SparseArray<VibrationEffect> mEffects = new SparseArray<>();
- SyncedCombination() {
+ ParallelCombination() {
}
/**
@@ -128,33 +133,33 @@
*
* @param vibratorId The id of the vibrator that should perform this effect.
* @param effect The effect this vibrator should play.
- * @return The {@link CombinedVibrationEffect.SyncedCombination} object to enable adding
+ * @return The {@link ParallelCombination} object to enable adding
* multiple effects in one chain.
* @see VibrationEffect#createOneShot(long, int)
*/
@NonNull
- public SyncedCombination addVibrator(int vibratorId, @NonNull VibrationEffect effect) {
+ public ParallelCombination addVibrator(int vibratorId, @NonNull VibrationEffect effect) {
mEffects.put(vibratorId, effect);
return this;
}
/**
- * Combine all of the added effects into a combined effect.
+ * Combine all of the added effects into a {@link CombinedVibration}.
*
- * The {@link CombinedVibrationEffect.SyncedCombination} object is still valid after this
+ * The {@link ParallelCombination} object is still valid after this
* call, so you can continue adding more effects to it and generating more
- * {@link CombinedVibrationEffect}s by calling this method again.
+ * {@link CombinedVibration}s by calling this method again.
*
- * @return The {@link CombinedVibrationEffect} resulting from combining the added effects to
- * be played in sync.
+ * @return The {@link CombinedVibration} resulting from combining the added effects to
+ * be played in parallel.
*/
@NonNull
- public CombinedVibrationEffect combine() {
+ public CombinedVibration combine() {
if (mEffects.size() == 0) {
throw new IllegalStateException(
"Combination must have at least one element to combine.");
}
- CombinedVibrationEffect combined = new Stereo(mEffects);
+ CombinedVibration combined = new Stereo(mEffects);
combined.validate();
return combined;
}
@@ -163,13 +168,13 @@
/**
* A combination of haptic effects that should be played in multiple vibrators in sequence.
*
- * @see CombinedVibrationEffect#startSequential()
* @hide
+ * @see CombinedVibration#startSequential()
*/
@TestApi
public static final class SequentialCombination {
- private final ArrayList<CombinedVibrationEffect> mEffects = new ArrayList<>();
+ private final ArrayList<CombinedVibration> mEffects = new ArrayList<>();
private final ArrayList<Integer> mDelays = new ArrayList<>();
SequentialCombination() {
@@ -178,11 +183,12 @@
/**
* Add a single vibration effect to be performed next.
*
- * Similar to {@link #addNext(int, VibrationEffect, int)}, but with no delay.
+ * Similar to {@link #addNext(int, VibrationEffect, int)}, but with no delay. The effect
+ * will start playing immediately after the previous vibration is finished.
*
* @param vibratorId The id of the vibrator that should perform this effect.
* @param effect The effect this vibrator should play.
- * @return The {@link CombinedVibrationEffect.SequentialCombination} object to enable adding
+ * @return The {@link CombinedVibration.SequentialCombination} object to enable adding
* multiple effects in one chain.
*/
@NonNull
@@ -193,47 +199,56 @@
/**
* Add a single vibration effect to be performed next.
*
+ * The delay is applied immediately after the previous vibration is finished. The effect
+ * will start playing after the delay.
+ *
* @param vibratorId The id of the vibrator that should perform this effect.
* @param effect The effect this vibrator should play.
* @param delay The amount of time, in milliseconds, to wait between playing the prior
- * effect and this one.
- * @return The {@link CombinedVibrationEffect.SequentialCombination} object to enable adding
+ * vibration and this one, starting at the time the previous vibration in
+ * this sequence is finished.
+ * @return The {@link CombinedVibration.SequentialCombination} object to enable adding
* multiple effects in one chain.
*/
@NonNull
public SequentialCombination addNext(int vibratorId, @NonNull VibrationEffect effect,
int delay) {
return addNext(
- CombinedVibrationEffect.startSynced().addVibrator(vibratorId, effect).combine(),
+ CombinedVibration.startParallel().addVibrator(vibratorId, effect).combine(),
delay);
}
/**
* Add a combined vibration effect to be performed next.
*
- * Similar to {@link #addNext(CombinedVibrationEffect, int)}, but with no delay.
+ * Similar to {@link #addNext(CombinedVibration, int)}, but with no delay. The effect will
+ * start playing immediately after the previous vibration is finished.
*
* @param effect The combined effect to be performed next.
- * @return The {@link CombinedVibrationEffect.SequentialCombination} object to enable adding
+ * @return The {@link CombinedVibration.SequentialCombination} object to enable adding
* multiple effects in one chain.
* @see VibrationEffect#createOneShot(long, int)
*/
@NonNull
- public SequentialCombination addNext(@NonNull CombinedVibrationEffect effect) {
+ public SequentialCombination addNext(@NonNull CombinedVibration effect) {
return addNext(effect, /* delay= */ 0);
}
/**
- * Add a one shot vibration effect to be performed by the specified vibrator.
+ * Add a combined vibration effect to be performed next.
+ *
+ * The delay is applied immediately after the previous vibration is finished. The vibration
+ * will start playing after the delay.
*
* @param effect The combined effect to be performed next.
* @param delay The amount of time, in milliseconds, to wait between playing the prior
- * effect and this one.
- * @return The {@link CombinedVibrationEffect.SequentialCombination} object to enable adding
+ * vibration and this one, starting at the time the previous vibration in this
+ * sequence is finished.
+ * @return The {@link CombinedVibration.SequentialCombination} object to enable adding
* multiple effects in one chain.
*/
@NonNull
- public SequentialCombination addNext(@NonNull CombinedVibrationEffect effect, int delay) {
+ public SequentialCombination addNext(@NonNull CombinedVibration effect, int delay) {
if (effect instanceof Sequential) {
Sequential sequentialEffect = (Sequential) effect;
int firstEffectIndex = mDelays.size();
@@ -250,32 +265,33 @@
/**
* Combine all of the added effects in sequence.
*
- * The {@link CombinedVibrationEffect.SequentialCombination} object is still valid after
+ * The {@link CombinedVibration.SequentialCombination} object is still valid after
* this call, so you can continue adding more effects to it and generating more {@link
- * CombinedVibrationEffect}s by calling this method again.
+ * CombinedVibration}s by calling this method again.
*
- * @return The {@link CombinedVibrationEffect} resulting from combining the added effects to
+ * @return The {@link CombinedVibration} resulting from combining the added effects to
* be played in sequence.
*/
@NonNull
- public CombinedVibrationEffect combine() {
+ public CombinedVibration combine() {
if (mEffects.size() == 0) {
throw new IllegalStateException(
"Combination must have at least one element to combine.");
}
- CombinedVibrationEffect combined = new Sequential(mEffects, mDelays);
+ CombinedVibration combined = new Sequential(mEffects, mDelays);
combined.validate();
return combined;
}
}
/**
- * Represents a single {@link VibrationEffect} that should be executed in all vibrators in sync.
+ * Represents a single {@link VibrationEffect} that should be played in all vibrators at the
+ * same time.
*
* @hide
*/
@TestApi
- public static final class Mono extends CombinedVibrationEffect {
+ public static final class Mono extends CombinedVibration {
private final VibrationEffect mEffect;
Mono(Parcel in) {
@@ -357,12 +373,13 @@
}
/**
- * Represents a list of {@link VibrationEffect}s that should be executed in sync.
+ * Represents a set of {@link VibrationEffect VibrationEffects} associated to individual
+ * vibrators that should be played at the same time.
*
* @hide
*/
@TestApi
- public static final class Stereo extends CombinedVibrationEffect {
+ public static final class Stereo extends CombinedVibration {
/** Mapping vibrator ids to effects. */
private final SparseArray<VibrationEffect> mEffects;
@@ -383,7 +400,7 @@
}
}
- /** Effects to be performed in sync, where each key represents the vibrator id. */
+ /** Effects to be performed in parallel, where each key represents the vibrator id. */
@NonNull
public SparseArray<VibrationEffect> getEffects() {
return mEffects;
@@ -489,13 +506,14 @@
}
/**
- * Represents a list of {@link VibrationEffect}s that should be executed in sequence.
+ * Represents a list of {@link CombinedVibration CombinedVibrations} that should be played in
+ * sequence.
*
* @hide
*/
@TestApi
- public static final class Sequential extends CombinedVibrationEffect {
- private final List<CombinedVibrationEffect> mEffects;
+ public static final class Sequential extends CombinedVibration {
+ private final List<CombinedVibration> mEffects;
private final List<Integer> mDelays;
Sequential(Parcel in) {
@@ -504,11 +522,11 @@
mDelays = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
mDelays.add(in.readInt());
- mEffects.add(CombinedVibrationEffect.CREATOR.createFromParcel(in));
+ mEffects.add(CombinedVibration.CREATOR.createFromParcel(in));
}
}
- Sequential(@NonNull List<CombinedVibrationEffect> effects,
+ Sequential(@NonNull List<CombinedVibration> effects,
@NonNull List<Integer> delays) {
mEffects = new ArrayList<>(effects);
mDelays = new ArrayList<>(delays);
@@ -516,7 +534,7 @@
/** Effects to be performed in sequence. */
@NonNull
- public List<CombinedVibrationEffect> getEffects() {
+ public List<CombinedVibration> getEffects() {
return mEffects;
}
@@ -532,7 +550,7 @@
long durations = 0;
final int effectCount = mEffects.size();
for (int i = 0; i < effectCount; i++) {
- CombinedVibrationEffect effect = mEffects.get(i);
+ CombinedVibration effect = mEffects.get(i);
long duration = effect.getDuration();
if (duration == Long.MAX_VALUE) {
// If any duration is repeating, this combination duration is also repeating.
@@ -570,7 +588,7 @@
}
}
for (int i = 0; i < effectCount; i++) {
- CombinedVibrationEffect effect = mEffects.get(i);
+ CombinedVibration effect = mEffects.get(i);
if (effect instanceof Sequential) {
throw new IllegalArgumentException(
"There should be no nested sequential effects in a combined effect");
@@ -644,10 +662,10 @@
}
@NonNull
- public static final Parcelable.Creator<CombinedVibrationEffect> CREATOR =
- new Parcelable.Creator<CombinedVibrationEffect>() {
+ public static final Parcelable.Creator<CombinedVibration> CREATOR =
+ new Parcelable.Creator<CombinedVibration>() {
@Override
- public CombinedVibrationEffect createFromParcel(Parcel in) {
+ public CombinedVibration createFromParcel(Parcel in) {
int token = in.readInt();
if (token == PARCEL_TOKEN_MONO) {
return new Mono(in);
@@ -662,8 +680,8 @@
}
@Override
- public CombinedVibrationEffect[] newArray(int size) {
- return new CombinedVibrationEffect[size];
+ public CombinedVibration[] newArray(int size) {
+ return new CombinedVibration[size];
}
};
}
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 40c658f..a06a857 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -22,6 +22,8 @@
import static android.os.ParcelFileDescriptor.MODE_READ_WRITE;
import static android.os.ParcelFileDescriptor.MODE_TRUNCATE;
import static android.os.ParcelFileDescriptor.MODE_WRITE_ONLY;
+import static android.system.OsConstants.EINVAL;
+import static android.system.OsConstants.ENOSYS;
import static android.system.OsConstants.F_OK;
import static android.system.OsConstants.O_ACCMODE;
import static android.system.OsConstants.O_APPEND;
@@ -441,7 +443,19 @@
final StructStat st_in = Os.fstat(in);
final StructStat st_out = Os.fstat(out);
if (S_ISREG(st_in.st_mode) && S_ISREG(st_out.st_mode)) {
- return copyInternalSendfile(in, out, count, signal, executor, listener);
+ try {
+ return copyInternalSendfile(in, out, count, signal, executor, listener);
+ } catch (ErrnoException e) {
+ if (e.errno == EINVAL || e.errno == ENOSYS) {
+ // sendfile(2) will fail in at least any of the following conditions:
+ // 1. |in| doesn't support mmap(2)
+ // 2. |out| was opened with O_APPEND
+ // We fallback to userspace copy if that fails
+ return copyInternalUserspace(in, out, count, signal, executor,
+ listener);
+ }
+ throw e;
+ }
} else if (S_ISFIFO(st_in.st_mode) || S_ISFIFO(st_out.st_mode)) {
return copyInternalSplice(in, out, count, signal, executor, listener);
}
diff --git a/core/java/android/os/IHintManager.aidl b/core/java/android/os/IHintManager.aidl
new file mode 100644
index 0000000..661b95a
--- /dev/null
+++ b/core/java/android/os/IHintManager.aidl
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.os.IHintSession;
+
+/** {@hide} */
+interface IHintManager {
+ /**
+ * Creates a {@link Session} for the given set of threads and associates to a binder token.
+ */
+ IHintSession createHintSession(in IBinder token, in int[] tids, long durationNanos);
+
+ /**
+ * Get preferred rate limit in nano second.
+ */
+ long getHintSessionPreferredRate();
+}
diff --git a/core/java/android/os/CombinedVibrationEffect.aidl b/core/java/android/os/IHintSession.aidl
similarity index 62%
copy from core/java/android/os/CombinedVibrationEffect.aidl
copy to core/java/android/os/IHintSession.aidl
index 330733c..09bc4cc 100644
--- a/core/java/android/os/CombinedVibrationEffect.aidl
+++ b/core/java/android/os/IHintSession.aidl
@@ -1,11 +1,12 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Copyright 2021, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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,
@@ -16,4 +17,9 @@
package android.os;
-parcelable CombinedVibrationEffect;
+/** {@hide} */
+oneway interface IHintSession {
+ void updateTargetWorkDuration(long targetDurationNanos);
+ void reportActualWorkDuration(in long[] actualDurationNanos, in long[] timeStampNanos);
+ void close();
+}
diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl
index 2052883..9368b68 100644
--- a/core/java/android/os/IRecoverySystem.aidl
+++ b/core/java/android/os/IRecoverySystem.aidl
@@ -30,6 +30,6 @@
boolean requestLskf(in String packageName, in IntentSender sender);
boolean clearLskf(in String packageName);
boolean isLskfCaptured(in String packageName);
- boolean rebootWithLskfAssumeSlotSwitch(in String packageName, in String reason);
- boolean rebootWithLskf(in String packageName, in String reason, in boolean slotSwitch);
+ int rebootWithLskfAssumeSlotSwitch(in String packageName, in String reason);
+ int rebootWithLskf(in String packageName, in String reason, in boolean slotSwitch);
}
diff --git a/core/java/android/os/IVibratorManagerService.aidl b/core/java/android/os/IVibratorManagerService.aidl
index f9e2947..a0d6ce1 100644
--- a/core/java/android/os/IVibratorManagerService.aidl
+++ b/core/java/android/os/IVibratorManagerService.aidl
@@ -16,7 +16,7 @@
package android.os;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.IVibratorStateListener;
import android.os.VibrationAttributes;
import android.os.VibratorInfo;
@@ -29,8 +29,8 @@
boolean registerVibratorStateListener(int vibratorId, in IVibratorStateListener listener);
boolean unregisterVibratorStateListener(int vibratorId, in IVibratorStateListener listener);
boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
- in CombinedVibrationEffect effect, in VibrationAttributes attributes);
- void vibrate(int uid, String opPkg, in CombinedVibrationEffect effect,
+ in CombinedVibration vibration, in VibrationAttributes attributes);
+ void vibrate(int uid, String opPkg, in CombinedVibration vibration,
in VibrationAttributes attributes, String reason, IBinder token);
- void cancelVibrate(IBinder token);
+ void cancelVibrate(int usageFilter, IBinder token);
}
diff --git a/core/java/android/os/NullVibrator.java b/core/java/android/os/NullVibrator.java
index 6bb0165..7859b5c 100644
--- a/core/java/android/os/NullVibrator.java
+++ b/core/java/android/os/NullVibrator.java
@@ -54,4 +54,8 @@
@Override
public void cancel() {
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ }
}
diff --git a/core/java/android/os/PerformanceHintManager.java b/core/java/android/os/PerformanceHintManager.java
new file mode 100644
index 0000000..6791844
--- /dev/null
+++ b/core/java/android/os/PerformanceHintManager.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemService;
+import android.content.Context;
+
+import com.android.internal.util.Preconditions;
+
+import java.io.Closeable;
+import java.util.ArrayList;
+
+/** The PerformanceHintManager allows apps to send performance hint to system. */
+@SystemService(Context.PERFORMANCE_HINT_SERVICE)
+public final class PerformanceHintManager {
+ private static final String TAG = "PerformanceHintManager";
+ private final IHintManager mService;
+ // HAL preferred update rate
+ private final long mPreferredRate;
+
+ /** @hide */
+ public PerformanceHintManager(IHintManager service) {
+ mService = service;
+ try {
+ mPreferredRate = mService.getHintSessionPreferredRate();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Creates a {@link Session} for the given set of threads and sets their initial target work
+ * duration.
+ *
+ * @param tids The list of threads to be associated with this session. They must be part of
+ * this process' thread group.
+ * @param initialTargetWorkDurationNanos The desired duration in nanoseconds for the new
+ * session.
+ * @return the new session if it is supported on this device, null if hint session is not
+ * supported on this device.
+ */
+ @Nullable
+ public Session createHintSession(@NonNull int[] tids, long initialTargetWorkDurationNanos) {
+ try {
+ IBinder token = new Binder();
+ IHintSession session = mService.createHintSession(token, tids,
+ initialTargetWorkDurationNanos);
+ if (session == null) return null;
+ return new Session(session, sNanoClock, mPreferredRate,
+ initialTargetWorkDurationNanos);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Get preferred update rate information for this device.
+ *
+ * @return the preferred update rate supported by device software.
+ */
+ public long getPreferredUpdateRateNanos() {
+ return mPreferredRate;
+ }
+
+ /**
+ * A Session represents a group of threads with an inter-related workload such that hints for
+ * their performance should be considered as a unit. The threads in a given session should be
+ * long-life and not created or destroyed dynamically.
+ *
+ * <p>Each session is expected to have a periodic workload with a target duration for each
+ * cycle. The cycle duration is likely greater than the target work duration to allow other
+ * parts of the pipeline to run within the available budget. For example, a renderer thread may
+ * work at 60hz in order to produce frames at the display's frame but have a target work
+ * duration of only 6ms.</p>
+ *
+ * <p>Any call in this class will change its internal data, so you must do your own thread
+ * safety to protect from racing.</p>
+ *
+ * <p>Note that the target work duration can be {@link #updateTargetWorkDuration(long) updated}
+ * if workloads change.</p>
+ *
+ * <p>After each cycle of work, the client is expected to
+ * {@link #reportActualWorkDuration(long) report} the actual time taken to complete.</p>
+ *
+ * <p>All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.</p>
+ */
+ public static class Session implements Closeable {
+ private final IHintSession mSession;
+ private final NanoClock mElapsedRealtimeClock;
+ // Target duration for choosing update rate
+ private long mTargetDurationInNanos;
+ // HAL preferred update rate
+ private long mPreferredRate;
+ // Last update timestamp
+ private long mLastUpdateTimeStamp = -1L;
+ // Cached samples
+ private final ArrayList<Long> mActualDurationNanos;
+ private final ArrayList<Long> mTimeStampNanos;
+
+ /** @hide */
+ public Session(IHintSession session, NanoClock elapsedRealtimeClock, long preferredRate,
+ long durationNanos) {
+ mSession = session;
+ mElapsedRealtimeClock = elapsedRealtimeClock;
+ mTargetDurationInNanos = durationNanos;
+ mPreferredRate = preferredRate;
+ mActualDurationNanos = new ArrayList<Long>();
+ mTimeStampNanos = new ArrayList<Long>();
+ mLastUpdateTimeStamp = mElapsedRealtimeClock.nanos();
+ }
+
+ /**
+ * Updates this session's target duration for each cycle of work.
+ *
+ * @param targetDurationNanos the new desired duration in nanoseconds
+ */
+ public void updateTargetWorkDuration(long targetDurationNanos) {
+ Preconditions.checkArgumentPositive(targetDurationNanos, "the hint target duration"
+ + " should be positive.");
+ try {
+ mSession.updateTargetWorkDuration(targetDurationNanos);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ mTargetDurationInNanos = targetDurationNanos;
+ /**
+ * Most of the workload is target_duration dependent, so now clear the cached samples
+ * as they are most likely obsolete.
+ */
+ mActualDurationNanos.clear();
+ mTimeStampNanos.clear();
+ mLastUpdateTimeStamp = mElapsedRealtimeClock.nanos();
+ }
+
+ /**
+ * Reports the actual duration for the last cycle of work.
+ *
+ * <p>The system will attempt to adjust the core placement of the threads within the thread
+ * group and/or the frequency of the core on which they are run to bring the actual duration
+ * close to the target duration.</p>
+ *
+ * @param actualDurationNanos how long the thread group took to complete its last task in
+ * nanoseconds
+ */
+ public void reportActualWorkDuration(long actualDurationNanos) {
+ Preconditions.checkArgumentPositive(actualDurationNanos, "the actual duration should"
+ + " be positive.");
+ final long now = mElapsedRealtimeClock.nanos();
+ mActualDurationNanos.add(actualDurationNanos);
+ mTimeStampNanos.add(now);
+
+ /**
+ * Use current sample to determine the rate limit. We can pick a shorter rate limit
+ * if any sample underperformed, however, it could be the lower level system is slow
+ * to react. So here we explicitly choose the rate limit with the latest sample.
+ */
+ long rateLimit =
+ actualDurationNanos > mTargetDurationInNanos ? mPreferredRate
+ : 10 * mPreferredRate;
+
+ if (now - mLastUpdateTimeStamp <= rateLimit) {
+ return;
+ }
+ Preconditions.checkState(mActualDurationNanos.size() == mTimeStampNanos.size());
+ final int size = mActualDurationNanos.size();
+ long[] actualDurationArray = new long[size];
+ long[] timeStampArray = new long[size];
+ for (int i = 0; i < size; i++) {
+ actualDurationArray[i] = mActualDurationNanos.get(i);
+ timeStampArray[i] = mTimeStampNanos.get(i);
+ }
+ try {
+ mSession.reportActualWorkDuration(actualDurationArray, timeStampArray);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ mActualDurationNanos.clear();
+ mTimeStampNanos.clear();
+ mLastUpdateTimeStamp = now;
+ }
+
+ /**
+ * Ends the current hint session.
+ *
+ * <p>Once called, you should not call anything else on this object.</p>
+ */
+ public void close() {
+ try {
+ mSession.close();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * The interface is to make the FakeClock for testing.
+ * @hide
+ */
+ public interface NanoClock {
+ /** Gets the current nanosecond instant of the clock. */
+ long nanos();
+ }
+
+ private static final NanoClock sNanoClock = new NanoClock() {
+ public long nanos() {
+ return SystemClock.elapsedRealtimeNanos();
+ }
+ };
+}
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 43184ea..a42448c 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -20,6 +20,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -155,6 +156,65 @@
private final IRecoverySystem mService;
/**
+ * The error codes for reboots initiated by resume on reboot clients.
+ * @hide
+ */
+ @IntDef(prefix = { "RESUME_ON_REBOOT_REBOOT_ERROR_" }, value = {
+ RESUME_ON_REBOOT_REBOOT_ERROR_NONE,
+ RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED,
+ RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME,
+ RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED,
+ RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH,
+ RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE})
+ public @interface ResumeOnRebootRebootErrorCode {}
+
+ /**
+ * The preparation of resume on reboot succeeds. Don't expose it because a successful reboot
+ * should just reboot the device.
+ * @hide
+ */
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_NONE = 0;
+
+ /**
+ * The resume on reboot fails due to an unknown reason.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED = 1000;
+
+ /**
+ * The resume on reboot fails because the package name of the client is invalid, e.g. null
+ * packageName, name contains invalid characters, etc.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME = 2000;
+
+ /**
+ * The resume on reboot fails because the Lock Screen Knowledge Factor hasn't been captured.
+ * This error is also reported if the client attempts to reboot without preparing RoR.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED = 3000;
+
+ /**
+ * The resume on reboot fails because the client expects a different boot slot for the next boot
+ * on A/B devices.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH = 4000;
+
+ /**
+ * The resume on reboot fails because the resume on reboot provider, e.g. HAL / server based,
+ * fails to arm/store the escrow key.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE = 5000;
+
+ /**
* Interface definition for a callback to be invoked regularly as
* verification proceeds.
*/
@@ -723,7 +783,8 @@
}
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
// OTA is the sole user, who expects a slot switch.
- if (!rs.rebootWithLskfAssumeSlotSwitch(context.getPackageName(), reason)) {
+ if (rs.rebootWithLskfAssumeSlotSwitch(context.getPackageName(), reason)
+ != RESUME_ON_REBOOT_REBOOT_ERROR_NONE) {
throw new IOException("system not prepared to apply update");
}
}
@@ -752,19 +813,19 @@
* @param context the Context to use.
* @param reason the reboot reason to give to the {@link PowerManager}
* @param slotSwitch true if the caller expects the slot to be switched on A/B devices.
- * @throws IOException if the reboot couldn't proceed because the device wasn't ready for an
- * unattended reboot.
+ *
+ * @return 0 on success, and a non-zero error code if the reboot couldn't proceed because the
+ * device wasn't ready for an unattended reboot.
+ * @throws IOException on remote exceptions from the RecoverySystemService
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
android.Manifest.permission.REBOOT})
- public static void rebootAndApply(@NonNull Context context,
+ public static @ResumeOnRebootRebootErrorCode int rebootAndApply(@NonNull Context context,
@NonNull String reason, boolean slotSwitch) throws IOException {
RecoverySystem rs = context.getSystemService(RecoverySystem.class);
- if (!rs.rebootWithLskf(context.getPackageName(), reason, slotSwitch)) {
- throw new IOException("system not prepared to apply update");
- }
+ return rs.rebootWithLskf(context.getPackageName(), reason, slotSwitch);
}
/**
@@ -1399,8 +1460,8 @@
* Calls the recovery system service to reboot and apply update.
*
*/
- private boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch)
- throws IOException {
+ private @ResumeOnRebootRebootErrorCode int rebootWithLskf(String packageName, String reason,
+ boolean slotSwitch) throws IOException {
try {
return mService.rebootWithLskf(packageName, reason, slotSwitch);
} catch (RemoteException e) {
@@ -1414,8 +1475,8 @@
* expects a slot switch for A/B devices.
*
*/
- private boolean rebootWithLskfAssumeSlotSwitch(String packageName, String reason)
- throws IOException {
+ private @ResumeOnRebootRebootErrorCode int rebootWithLskfAssumeSlotSwitch(String packageName,
+ String reason) throws IOException {
try {
return mService.rebootWithLskfAssumeSlotSwitch(packageName, reason);
} catch (RemoteException e) {
diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java
index 219912c..fd8948c 100644
--- a/core/java/android/os/SystemVibrator.java
+++ b/core/java/android/os/SystemVibrator.java
@@ -28,7 +28,6 @@
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.Executor;
@@ -50,6 +49,9 @@
private final ArrayMap<OnVibratorStateChangedListener, AllVibratorsStateListener>
mRegisteredListeners = new ArrayMap<>();
+ private final Object mLock = new Object();
+ private AllVibratorsInfo mVibratorInfo;
+
@UnsupportedAppUsage
public SystemVibrator(Context context) {
super(context);
@@ -58,6 +60,25 @@
}
@Override
+ protected VibratorInfo getInfo() {
+ synchronized (mLock) {
+ if (mVibratorInfo != null) {
+ return mVibratorInfo;
+ }
+ if (mVibratorManager == null) {
+ Log.w(TAG, "Failed to retrieve vibrator info; no vibrator manager.");
+ return VibratorInfo.EMPTY_VIBRATOR_INFO;
+ }
+ int[] vibratorIds = mVibratorManager.getVibratorIds();
+ VibratorInfo[] vibratorInfos = new VibratorInfo[vibratorIds.length];
+ for (int i = 0; i < vibratorIds.length; i++) {
+ vibratorInfos[i] = mVibratorManager.getVibrator(vibratorIds[i]).getInfo();
+ }
+ return mVibratorInfo = new AllVibratorsInfo(vibratorInfos);
+ }
+ }
+
+ @Override
public boolean hasVibrator() {
if (mVibratorManager == null) {
Log.w(TAG, "Failed to check if vibrator exists; no vibrator manager.");
@@ -144,20 +165,7 @@
@Override
public boolean hasAmplitudeControl() {
- if (mVibratorManager == null) {
- Log.w(TAG, "Failed to check vibrator has amplitude control; no vibrator manager.");
- return false;
- }
- int[] vibratorIds = mVibratorManager.getVibratorIds();
- if (vibratorIds.length == 0) {
- return false;
- }
- for (int vibratorId : vibratorIds) {
- if (!mVibratorManager.getVibrator(vibratorId).hasAmplitudeControl()) {
- return false;
- }
- }
- return true;
+ return getInfo().hasAmplitudeControl();
}
@Override
@@ -168,7 +176,7 @@
return false;
}
VibrationAttributes attr = new VibrationAttributes.Builder(attributes, effect).build();
- CombinedVibrationEffect combinedEffect = CombinedVibrationEffect.createSynced(effect);
+ CombinedVibration combinedEffect = CombinedVibration.createParallel(effect);
return mVibratorManager.setAlwaysOnEffect(uid, opPkg, alwaysOnId, combinedEffect, attr);
}
@@ -179,75 +187,11 @@
Log.w(TAG, "Failed to vibrate; no vibrator manager.");
return;
}
- CombinedVibrationEffect combinedEffect = CombinedVibrationEffect.createSynced(effect);
+ CombinedVibration combinedEffect = CombinedVibration.createParallel(effect);
mVibratorManager.vibrate(uid, opPkg, combinedEffect, reason, attributes);
}
@Override
- public int[] areEffectsSupported(@VibrationEffect.EffectType int... effectIds) {
- int[] supported = new int[effectIds.length];
- if (mVibratorManager == null) {
- Log.w(TAG, "Failed to check supported effects; no vibrator manager.");
- Arrays.fill(supported, Vibrator.VIBRATION_EFFECT_SUPPORT_NO);
- return supported;
- }
- int[] vibratorIds = mVibratorManager.getVibratorIds();
- if (vibratorIds.length == 0) {
- Arrays.fill(supported, Vibrator.VIBRATION_EFFECT_SUPPORT_NO);
- return supported;
- }
- int[][] vibratorSupportMap = new int[vibratorIds.length][effectIds.length];
- for (int i = 0; i < vibratorIds.length; i++) {
- vibratorSupportMap[i] = mVibratorManager.getVibrator(
- vibratorIds[i]).areEffectsSupported(effectIds);
- }
- Arrays.fill(supported, Vibrator.VIBRATION_EFFECT_SUPPORT_YES);
- for (int effectIdx = 0; effectIdx < effectIds.length; effectIdx++) {
- for (int vibratorIdx = 0; vibratorIdx < vibratorIds.length; vibratorIdx++) {
- int effectSupported = vibratorSupportMap[vibratorIdx][effectIdx];
- if (effectSupported == Vibrator.VIBRATION_EFFECT_SUPPORT_NO) {
- supported[effectIdx] = Vibrator.VIBRATION_EFFECT_SUPPORT_NO;
- break;
- } else if (effectSupported == Vibrator.VIBRATION_EFFECT_SUPPORT_UNKNOWN) {
- supported[effectIdx] = Vibrator.VIBRATION_EFFECT_SUPPORT_UNKNOWN;
- }
- }
- }
- return supported;
- }
-
- @Override
- public boolean[] arePrimitivesSupported(
- @NonNull @VibrationEffect.Composition.PrimitiveType int... primitiveIds) {
- boolean[] supported = new boolean[primitiveIds.length];
- if (mVibratorManager == null) {
- Log.w(TAG, "Failed to check supported primitives; no vibrator manager.");
- Arrays.fill(supported, false);
- return supported;
- }
- int[] vibratorIds = mVibratorManager.getVibratorIds();
- if (vibratorIds.length == 0) {
- Arrays.fill(supported, false);
- return supported;
- }
- boolean[][] vibratorSupportMap = new boolean[vibratorIds.length][primitiveIds.length];
- for (int i = 0; i < vibratorIds.length; i++) {
- vibratorSupportMap[i] = mVibratorManager.getVibrator(
- vibratorIds[i]).arePrimitivesSupported(primitiveIds);
- }
- Arrays.fill(supported, true);
- for (int primitiveIdx = 0; primitiveIdx < primitiveIds.length; primitiveIdx++) {
- for (int vibratorIdx = 0; vibratorIdx < vibratorIds.length; vibratorIdx++) {
- if (!vibratorSupportMap[vibratorIdx][primitiveIdx]) {
- supported[primitiveIdx] = false;
- break;
- }
- }
- }
- return supported;
- }
-
- @Override
public void cancel() {
if (mVibratorManager == null) {
Log.w(TAG, "Failed to cancel vibrate; no vibrator manager.");
@@ -256,6 +200,15 @@
mVibratorManager.cancel();
}
+ @Override
+ public void cancel(int usageFilter) {
+ if (mVibratorManager == null) {
+ Log.w(TAG, "Failed to cancel vibrate; no vibrator manager.");
+ return;
+ }
+ mVibratorManager.cancel(usageFilter);
+ }
+
/**
* Tries to unregister individual {@link android.os.Vibrator.OnVibratorStateChangedListener}
* that were left registered to vibrators after failures to register them to all vibrators.
@@ -295,6 +248,58 @@
}
}
+ /**
+ * Represents all the vibrators information as a single {@link VibratorInfo}.
+ *
+ * <p>This uses the first vibrator on the list as the default one for all hardware spec, but
+ * uses an intersection of all vibrators to decide the capabilities and effect/primitive
+ * support.
+ */
+ private static class AllVibratorsInfo extends VibratorInfo {
+ private final VibratorInfo[] mVibratorInfos;
+
+ AllVibratorsInfo(VibratorInfo[] vibrators) {
+ super(/* id= */ -1, capabilitiesIntersection(vibrators),
+ vibrators.length > 0 ? vibrators[0] : VibratorInfo.EMPTY_VIBRATOR_INFO);
+ mVibratorInfos = vibrators;
+ }
+
+ @Override
+ public int isEffectSupported(int effectId) {
+ int supported = Vibrator.VIBRATION_EFFECT_SUPPORT_YES;
+ for (VibratorInfo info : mVibratorInfos) {
+ int effectSupported = info.isEffectSupported(effectId);
+ if (effectSupported == Vibrator.VIBRATION_EFFECT_SUPPORT_NO) {
+ return effectSupported;
+ } else if (effectSupported == Vibrator.VIBRATION_EFFECT_SUPPORT_UNKNOWN) {
+ supported = effectSupported;
+ }
+ }
+ return supported;
+ }
+
+ @Override
+ public boolean isPrimitiveSupported(int primitiveId) {
+ for (VibratorInfo info : mVibratorInfos) {
+ if (!info.isPrimitiveSupported(primitiveId)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static int capabilitiesIntersection(VibratorInfo[] infos) {
+ if (infos.length == 0) {
+ return 0;
+ }
+ int intersection = ~0;
+ for (VibratorInfo info : infos) {
+ intersection &= info.getCapabilities();
+ }
+ return intersection;
+ }
+ }
+
/** Listener for all vibrators state change. */
private static class AllVibratorsStateListener {
private final Object mLock = new Object();
diff --git a/core/java/android/os/SystemVibratorManager.java b/core/java/android/os/SystemVibratorManager.java
index 5d81902..c33603d 100644
--- a/core/java/android/os/SystemVibratorManager.java
+++ b/core/java/android/os/SystemVibratorManager.java
@@ -117,7 +117,7 @@
@Override
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
- @Nullable CombinedVibrationEffect effect, @Nullable VibrationAttributes attributes) {
+ @Nullable CombinedVibration effect, @Nullable VibrationAttributes attributes) {
if (mService == null) {
Log.w(TAG, "Failed to set always-on effect; no vibrator manager service.");
return false;
@@ -131,7 +131,7 @@
}
@Override
- public void vibrate(int uid, String opPkg, @NonNull CombinedVibrationEffect effect,
+ public void vibrate(int uid, String opPkg, @NonNull CombinedVibration effect,
String reason, @Nullable VibrationAttributes attributes) {
if (mService == null) {
Log.w(TAG, "Failed to vibrate; no vibrator manager service.");
@@ -146,12 +146,21 @@
@Override
public void cancel() {
+ cancelVibration(/* usageFilter= */ -1);
+ }
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancelVibration(usageFilter);
+ }
+
+ private void cancelVibration(int usageFilter) {
if (mService == null) {
Log.w(TAG, "Failed to cancel vibration; no vibrator manager service.");
return;
}
try {
- mService.cancelVibrate(mToken);
+ mService.cancelVibrate(usageFilter, mToken);
} catch (RemoteException e) {
Log.w(TAG, "Failed to cancel vibration.", e);
}
@@ -185,8 +194,8 @@
}
@Override
- public int getId() {
- return mVibratorInfo.getId();
+ protected VibratorInfo getInfo() {
+ return mVibratorInfo;
}
@Override
@@ -200,86 +209,34 @@
}
@Override
- public float getResonantFrequency() {
- return mVibratorInfo.getResonantFrequency();
- }
-
- @Override
- public float getQFactor() {
- return mVibratorInfo.getQFactor();
- }
-
- @NonNull
- @Override
- public int[] areEffectsSupported(@NonNull int... effectIds) {
- int[] supported = new int[effectIds.length];
- for (int i = 0; i < effectIds.length; i++) {
- supported[i] = mVibratorInfo.isEffectSupported(effectIds[i]);
- }
- return supported;
- }
-
- @Override
- public boolean[] arePrimitivesSupported(
- @NonNull @VibrationEffect.Composition.PrimitiveType int... primitiveIds) {
- boolean[] supported = new boolean[primitiveIds.length];
- for (int i = 0; i < primitiveIds.length; i++) {
- supported[i] = mVibratorInfo.isPrimitiveSupported(primitiveIds[i]);
- }
- return supported;
- }
-
- @Override
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
@Nullable VibrationEffect effect, @Nullable AudioAttributes attributes) {
- if (mService == null) {
- Log.w(TAG, "Failed to set always-on effect on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return false;
- }
- try {
- VibrationAttributes attr = new VibrationAttributes.Builder(
- attributes, effect).build();
- CombinedVibrationEffect combined = CombinedVibrationEffect.startSynced()
- .addVibrator(mVibratorInfo.getId(), effect)
- .combine();
- return mService.setAlwaysOnEffect(uid, opPkg, alwaysOnId, combined, attr);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set always-on effect on vibrator " + mVibratorInfo.getId());
- }
- return false;
+ VibrationAttributes attr = new VibrationAttributes.Builder(
+ attributes, effect).build();
+ CombinedVibration combined = CombinedVibration.startParallel()
+ .addVibrator(mVibratorInfo.getId(), effect)
+ .combine();
+ return SystemVibratorManager.this.setAlwaysOnEffect(uid, opPkg, alwaysOnId, combined,
+ attr);
}
@Override
public void vibrate(int uid, String opPkg, @NonNull VibrationEffect vibe, String reason,
@NonNull VibrationAttributes attributes) {
- if (mService == null) {
- Log.w(TAG, "Failed to vibrate on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return;
- }
- try {
- CombinedVibrationEffect combined = CombinedVibrationEffect.startSynced()
- .addVibrator(mVibratorInfo.getId(), vibe)
- .combine();
- mService.vibrate(uid, opPkg, combined, attributes, reason, mToken);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to vibrate.", e);
- }
+ CombinedVibration combined = CombinedVibration.startParallel()
+ .addVibrator(mVibratorInfo.getId(), vibe)
+ .combine();
+ SystemVibratorManager.this.vibrate(uid, opPkg, combined, reason, attributes);
}
@Override
public void cancel() {
- if (mService == null) {
- Log.w(TAG, "Failed to cancel vibration on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return;
- }
- try {
- mService.cancelVibrate(mToken);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to cancel vibration on vibrator " + mVibratorInfo.getId(), e);
- }
+ SystemVibratorManager.this.cancel();
+ }
+
+ @Override
+ public void cancel(int usageFilter) {
+ SystemVibratorManager.this.cancel(usageFilter);
}
@Override
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 2119e7b..4a6216e 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -326,16 +326,15 @@
}
/**
- * Returns the uid that is composed from the userHandle and the appId.
+ * Returns the uid representing the given appId for this UserHandle.
*
- * @param userHandle the UserHandle to compose the uid
* @param appId the AppId to compose the uid
- * @return the uid that is composed from the userHandle and the appId
+ * @return the uid representing the given appId for this UserHandle
* @hide
*/
@SystemApi
- public static int getUid(@NonNull UserHandle userHandle, @AppIdInt int appId) {
- return getUid(userHandle.getIdentifier(), appId);
+ public int getUid(@AppIdInt int appId) {
+ return getUid(getIdentifier(), appId);
}
/**
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index a0f70c8..2876775 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -17,6 +17,7 @@
package android.os;
import android.annotation.CallbackExecutor;
+import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -26,12 +27,13 @@
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
+import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
import android.util.Log;
+import android.util.Range;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
import java.util.concurrent.Executor;
/**
@@ -156,6 +158,11 @@
return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM;
}
+ /** @hide */
+ protected VibratorInfo getInfo() {
+ return VibratorInfo.EMPTY_VIBRATOR_INFO;
+ }
+
/**
* Get the default vibration intensity for haptic feedback.
*
@@ -190,7 +197,7 @@
* service, or -1 this service is not attached to any physical vibrator.
*/
public int getId() {
- return -1;
+ return getInfo().getId();
}
/**
@@ -208,14 +215,26 @@
public abstract boolean hasAmplitudeControl();
/**
+ * Check whether the vibrator has independent frequency control.
+ *
+ * @return True if the hardware can control the frequency of the vibrations, otherwise false.
+ * @hide
+ */
+ public boolean hasFrequencyControl() {
+ // We currently can only control frequency of the vibration using the compose PWLE method.
+ return getInfo().hasCapability(
+ IVibrator.CAP_FREQUENCY_CONTROL | IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
+ }
+
+ /**
* Gets the resonant frequency of the vibrator.
*
* @return the resonant frequency of the vibrator, or {@link Float#NaN NaN} if it's unknown or
- * this vibrator is a composite of multiple physical devices.
+ * this vibrator is a composite of multiple physical devices.
* @hide
*/
public float getResonantFrequency() {
- return Float.NaN;
+ return getInfo().getResonantFrequency();
}
/**
@@ -226,7 +245,44 @@
* @hide
*/
public float getQFactor() {
- return Float.NaN;
+ return getInfo().getQFactor();
+ }
+
+ /**
+ * Return a range of relative frequency values supported by the vibrator.
+ *
+ * <p>These values can be used to create waveforms that controls the vibration frequency via
+ * {@link VibrationEffect.WaveformBuilder}.
+ *
+ * @return A range of relative frequency values supported. The range will always contain the
+ * value 0, representing the device resonant frequency. Devices without frequency control will
+ * return the range [0,0]. Devices with frequency control will always return a range containing
+ * the safe range [-1, 1].
+ * @hide
+ */
+ public Range<Float> getRelativeFrequencyRange() {
+ return getInfo().getFrequencyRange();
+ }
+
+ /**
+ * Return the maximum amplitude the vibrator can play at given relative frequency.
+ *
+ * <p>Devices without frequency control will return 1 for the input zero (resonant frequency),
+ * and 0 to any other input.
+ *
+ * <p>Devices with frequency control will return the supported value, for input in
+ * {@link #getRelativeFrequencyRange()}, and 0 for any other input.
+ *
+ * <p>These values can be used to create waveforms that plays vibrations outside the resonant
+ * frequency via {@link VibrationEffect.WaveformBuilder}.
+ *
+ * @return a value in [0,1] representing the maximum amplitude the device can play at given
+ * relative frequency.
+ * @hide
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getMaximumAmplitude(float relativeFrequency) {
+ return getInfo().getMaxAmplitude(relativeFrequency);
}
/**
@@ -414,9 +470,12 @@
@VibrationEffectSupport
public int[] areEffectsSupported(
@NonNull @VibrationEffect.EffectType int... effectIds) {
- final int[] support = new int[effectIds.length];
- Arrays.fill(support, VIBRATION_EFFECT_SUPPORT_NO);
- return support;
+ VibratorInfo info = getInfo();
+ int[] supported = new int[effectIds.length];
+ for (int i = 0; i < effectIds.length; i++) {
+ supported[i] = info.isEffectSupported(effectIds[i]);
+ }
+ return supported;
}
/**
@@ -468,7 +527,12 @@
@NonNull
public boolean[] arePrimitivesSupported(
@NonNull @VibrationEffect.Composition.PrimitiveType int... primitiveIds) {
- return new boolean[primitiveIds.length];
+ VibratorInfo info = getInfo();
+ boolean[] supported = new boolean[primitiveIds.length];
+ for (int i = 0; i < primitiveIds.length; i++) {
+ supported[i] = info.isPrimitiveSupported(primitiveIds[i]);
+ }
+ return supported;
}
/**
@@ -494,6 +558,16 @@
public abstract void cancel();
/**
+ * Cancel specific types of ongoing vibrations.
+ *
+ * @param usageFilter The type of vibration to be cancelled, represented as a bitwise
+ * combination of {@link VibrationAttributes.Usage} values.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.VIBRATE)
+ public abstract void cancel(int usageFilter);
+
+ /**
* Check whether the vibrator is vibrating.
*
* @return True if the hardware is vibrating, otherwise false.
diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java
index 671daa0..c7d66f0 100644
--- a/core/java/android/os/VibratorInfo.java
+++ b/core/java/android/os/VibratorInfo.java
@@ -38,9 +38,12 @@
*
* @hide
*/
-public final class VibratorInfo implements Parcelable {
+public class VibratorInfo implements Parcelable {
private static final String TAG = "VibratorInfo";
+ /** @hide */
+ public static final VibratorInfo EMPTY_VIBRATOR_INFO = new VibratorInfo.Builder(-1).build();
+
private final int mId;
private final long mCapabilities;
@Nullable
@@ -74,6 +77,23 @@
mFrequencyMapping = frequencyMapping;
}
+ protected VibratorInfo(int id, int capabilities, VibratorInfo baseVibrator) {
+ mId = id;
+ mCapabilities = capabilities;
+ mSupportedEffects = baseVibrator.mSupportedEffects == null ? null :
+ baseVibrator.mSupportedEffects.clone();
+ mSupportedBraking = baseVibrator.mSupportedBraking == null ? null :
+ baseVibrator.mSupportedBraking.clone();
+ mSupportedPrimitives = baseVibrator.mSupportedPrimitives == null ? null :
+ baseVibrator.mSupportedPrimitives.clone();
+ mQFactor = baseVibrator.mQFactor;
+ mFrequencyMapping = new FrequencyMapping(baseVibrator.mFrequencyMapping.mMinFrequencyHz,
+ baseVibrator.mFrequencyMapping.mResonantFrequencyHz,
+ baseVibrator.mFrequencyMapping.mFrequencyResolutionHz,
+ baseVibrator.mFrequencyMapping.mSuggestedSafeRangeHz,
+ baseVibrator.mFrequencyMapping.mMaxAmplitudes);
+ }
+
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mId);
@@ -145,6 +165,7 @@
* Returns a default value to be applied to composed PWLE effects for braking.
*
* @return a supported braking value, one of android.hardware.vibrator.Braking.*
+ * @hide
*/
public int getDefaultBraking() {
if (mSupportedBraking != null) {
@@ -265,6 +286,10 @@
return mFrequencyMapping.toHertz(relativeFrequency);
}
+ protected long getCapabilities() {
+ return mCapabilities;
+ }
+
private String[] getCapabilitiesNames() {
List<String> names = new ArrayList<>();
if (hasCapability(IVibrator.CAP_ON_CALLBACK)) {
@@ -370,7 +395,7 @@
* <p>The mapping is defined linearly by the following points:
*
* <ol>
- * <li>{@code toHertz(relativeMinFrequency} = minFrequency
+ * <li>{@code toHertz(relativeMinFrequency) = minFrequency}
* <li>{@code toHertz(-1) = resonantFrequency - safeRange / 2}
* <li>{@code toHertz(0) = resonantFrequency}
* <li>{@code toHertz(1) = resonantFrequency + safeRange / 2}
@@ -555,6 +580,75 @@
};
}
+ /** @hide */
+ public static final class Builder {
+ private final int mId;
+ private int mCapabilities = 0;
+ private int[] mSupportedEffects = null;
+ private int[] mSupportedBraking = null;
+ private int[] mSupportedPrimitives = null;
+ private float mQFactor = Float.NaN;
+ private FrequencyMapping mFrequencyMapping =
+ new FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
+
+ /** A builder class for a {@link VibratorInfo}. */
+ public Builder(int id) {
+ mId = id;
+ }
+
+ /** Configure the vibrator capabilities with a combination of IVibrator.CAP_* values. */
+ @NonNull
+ public Builder setCapabilities(int capabilities) {
+ mCapabilities = capabilities;
+ return this;
+ }
+
+ /** Configure the effects supported with {@link android.hardware.vibrator.Effect} values. */
+ @NonNull
+ public Builder setSupportedEffects(int... supportedEffects) {
+ mSupportedEffects = supportedEffects;
+ return this;
+ }
+
+ /** Configure braking supported with {@link android.hardware.vibrator.Braking} values. */
+ @NonNull
+ public Builder setSupportedBraking(int... supportedBraking) {
+ mSupportedBraking = supportedBraking;
+ return this;
+ }
+
+ /**
+ * Configure the primitives supported with
+ * {@link android.hardware.vibrator.CompositePrimitive} values.
+ */
+ @NonNull
+ public Builder setSupportedPrimitives(int... supportedPrimitives) {
+ mSupportedPrimitives = supportedPrimitives;
+ return this;
+ }
+
+ /** Configure the vibrator quality factor. */
+ @NonNull
+ public Builder setQFactor(float qFactor) {
+ mQFactor = qFactor;
+ return this;
+ }
+
+ /** Configure the vibrator frequency information like resonant frequency and bandwidth. */
+ @NonNull
+ public Builder setFrequencyMapping(FrequencyMapping frequencyMapping) {
+ mFrequencyMapping = frequencyMapping;
+ return this;
+ }
+
+ /** Build the configured {@link VibratorInfo}. */
+ @NonNull
+ public VibratorInfo build() {
+ return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
+ mSupportedPrimitives, mQFactor, mFrequencyMapping);
+ }
+ }
+
@NonNull
public static final Creator<VibratorInfo> CREATOR =
new Creator<VibratorInfo>() {
diff --git a/core/java/android/os/VibratorManager.java b/core/java/android/os/VibratorManager.java
index 5a01814..01cece3 100644
--- a/core/java/android/os/VibratorManager.java
+++ b/core/java/android/os/VibratorManager.java
@@ -69,7 +69,7 @@
public abstract Vibrator getVibrator(int vibratorId);
/**
- * Returns the system default Vibrator service.
+ * Returns the default Vibrator for the device.
*/
@NonNull
public abstract Vibrator getDefaultVibrator();
@@ -81,7 +81,7 @@
*/
@RequiresPermission(android.Manifest.permission.VIBRATE_ALWAYS_ON)
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
- @Nullable CombinedVibrationEffect effect, @Nullable VibrationAttributes attributes) {
+ @Nullable CombinedVibration effect, @Nullable VibrationAttributes attributes) {
Log.w(TAG, "Always-on effects aren't supported");
return false;
}
@@ -90,14 +90,14 @@
* Vibrate with a given combination of effects.
*
* <p>
- * Pass in a {@link CombinedVibrationEffect} representing a combination of {@link
+ * Pass in a {@link CombinedVibration} representing a combination of {@link
* VibrationEffect VibrationEffects} to be played on one or more vibrators.
* </p>
*
* @param effect a combination of effects to be performed by one or more vibrators.
*/
@RequiresPermission(android.Manifest.permission.VIBRATE)
- public final void vibrate(@NonNull CombinedVibrationEffect effect) {
+ public final void vibrate(@NonNull CombinedVibration effect) {
vibrate(effect, null);
}
@@ -105,7 +105,7 @@
* Vibrate with a given combination of effects.
*
* <p>
- * Pass in a {@link CombinedVibrationEffect} representing a combination of {@link
+ * Pass in a {@link CombinedVibration} representing a combination of {@link
* VibrationEffect} to be played on one or more vibrators.
* </p>
*
@@ -116,19 +116,19 @@
* incoming calls.
*/
@RequiresPermission(android.Manifest.permission.VIBRATE)
- public final void vibrate(@NonNull CombinedVibrationEffect effect,
+ public final void vibrate(@NonNull CombinedVibration effect,
@Nullable VibrationAttributes attributes) {
vibrate(Process.myUid(), mPackageName, effect, null, attributes);
}
/**
- * Like {@link #vibrate(CombinedVibrationEffect, VibrationAttributes)}, but allows the
+ * Like {@link #vibrate(CombinedVibration, VibrationAttributes)}, but allows the
* caller to specify the vibration is owned by someone else and set reason for vibration.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.VIBRATE)
- public abstract void vibrate(int uid, String opPkg, @NonNull CombinedVibrationEffect effect,
+ public abstract void vibrate(int uid, String opPkg, @NonNull CombinedVibration effect,
String reason, @Nullable VibrationAttributes attributes);
/**
@@ -136,4 +136,14 @@
*/
@RequiresPermission(android.Manifest.permission.VIBRATE)
public abstract void cancel();
+
+ /**
+ * Cancel specific types of ongoing vibrations.
+ *
+ * @param usageFilter The type of vibration to be cancelled, represented as a bitwise
+ * combination of {@link VibrationAttributes.Usage} values.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.VIBRATE)
+ public abstract void cancel(int usageFilter);
}
diff --git a/core/java/android/permission/AdminPermissionControlParams.java b/core/java/android/permission/AdminPermissionControlParams.java
index 49507220..3eeaa5f 100644
--- a/core/java/android/permission/AdminPermissionControlParams.java
+++ b/core/java/android/permission/AdminPermissionControlParams.java
@@ -56,7 +56,8 @@
*/
public AdminPermissionControlParams(@NonNull String granteePackageName,
@NonNull String permission,
- int grantState, boolean canAdminGrantSensorsPermissions) {
+ @DevicePolicyManager.PermissionGrantState int grantState,
+ boolean canAdminGrantSensorsPermissions) {
Preconditions.checkStringNotEmpty(granteePackageName, "Package name must not be empty.");
Preconditions.checkStringNotEmpty(permission, "Permission must not be empty.");
checkArgument(grantState == PERMISSION_GRANT_STATE_GRANTED
@@ -112,7 +113,7 @@
}
/** Returns the grant state */
- public int getGrantState() {
+ public @DevicePolicyManager.PermissionGrantState int getGrantState() {
return mGrantState;
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c97f097..9450994 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2790,13 +2790,12 @@
// Settings.Global and is not annotated as @Readable.
// Notice that a key string that is not defined in any of the Settings.* classes will
// still be regarded as readable.
- // TODO(b/175024829): provide a register method.
- if (!Settings.isInSystemServer() && !isSystemOrPrivilegedApp()
+ if (!isCallerExemptFromReadableRestriction()
&& mAllFields.contains(name) && !mReadableFields.contains(name)) {
throw new SecurityException(
- "Settings key: <" + name + "> is not readable. From S+, new public "
- + "settings keys need to be annotated with @Readable unless they are "
- + "annotated with @hide.");
+ "Settings key: <" + name + "> is not readable. From S+, settings keys "
+ + "annotated with @hide are restricted to system_server and system "
+ + "apps only, unless they are annotated with @Readable.");
}
final boolean isSelf = (userHandle == UserHandle.myUserId());
int currentGeneration = -1;
@@ -2972,7 +2971,10 @@
}
}
- private static boolean isSystemOrPrivilegedApp() {
+ private static boolean isCallerExemptFromReadableRestriction() {
+ if (Settings.isInSystemServer()) {
+ return true;
+ }
if (UserHandle.getAppId(Binder.getCallingUid()) < Process.FIRST_APPLICATION_UID) {
return true;
}
@@ -2981,7 +2983,9 @@
return false;
}
final ApplicationInfo applicationInfo = application.getApplicationInfo();
- return applicationInfo.isSystemApp() || applicationInfo.isPrivilegedApp()
+ final boolean isTestOnly =
+ (applicationInfo.flags & ApplicationInfo.FLAG_TEST_ONLY) != 0;
+ return isTestOnly || applicationInfo.isSystemApp() || applicationInfo.isPrivilegedApp()
|| applicationInfo.isSignedWithPlatformKey();
}
@@ -8535,13 +8539,16 @@
"one_handed_tutorial_show_count";
/**
- * Indicates whether transform is enabled.
+ * Indicates whether ui translation is enabled.
* <p>
* Type: int (0 for false, 1 for true)
*
* @hide
*/
- public static final String TRANSFORM_ENABLED = "transform_enabled";
+ @SystemApi
+ @Readable
+ @SuppressLint("NoSettingsProvider")
+ public static final String UI_TRANSLATION_ENABLED = "ui_translation_enabled";
/**
* The current night mode that has been selected by the user. Owned
@@ -9925,6 +9932,14 @@
"clipboard_show_access_notifications";
/**
+ * If nonzero, nas has not been updated to reflect new changes.
+ * @hide
+ */
+ @Readable
+ public static final String NAS_SETTINGS_UPDATED = "nas_settings_updated";
+
+
+ /**
* These entries are considered common between the personal and the managed profile,
* since the managed profile doesn't get to change them.
*/
@@ -13315,23 +13330,27 @@
"adb_allowed_connection_time";
/**
- * Scaling factor for normal window animations. Setting to 0 will
- * disable window animations.
+ * Scaling factor for normal window animations.
+ *
+ * The value is a float. Setting to 0.0f will disable window animations.
*/
@Readable
public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
/**
- * Scaling factor for activity transition animations. Setting to 0 will
- * disable window animations.
+ * Scaling factor for activity transition animations.
+ *
+ * The value is a float. Setting to 0.0f will disable window animations.
*/
@Readable
public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
/**
* Scaling factor for Animator-based animations. This affects both the
- * start delay and duration of all such animations. Setting to 0 will
- * cause animations to end immediately. The default value is 1.
+ * start delay and duration of all such animations.
+ *
+ * The value is a float. Setting to 0.0f will cause animations to end immediately.
+ * The default value is 1.0f.
*/
@Readable
public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
@@ -14708,6 +14727,15 @@
public static final String POWER_BUTTON_VERY_LONG_PRESS =
"power_button_very_long_press";
+ /**
+ * Overrides internal R.integer.config_keyChordPowerVolumeUp.
+ * Allowable values detailed in frameworks/base/core/res/res/values/config.xml.
+ * Used by PhoneWindowManager.
+ * @hide
+ */
+ @Readable
+ public static final String KEY_CHORD_POWER_VOLUME_UP =
+ "key_chord_power_volume_up";
/**
* Keyguard should be on the left hand side of the screen, for wide screen layouts.
diff --git a/core/java/android/rotationresolver/RotationResolverInternal.java b/core/java/android/rotationresolver/RotationResolverInternal.java
index 1f1a66c..57910cb 100644
--- a/core/java/android/rotationresolver/RotationResolverInternal.java
+++ b/core/java/android/rotationresolver/RotationResolverInternal.java
@@ -44,6 +44,7 @@
*
* @param callback the callback that will be called when the result is computed or an
* error is captured. {@link RotationResolverCallbackInternal}
+ * @param packageName the package name of the fore ground activity.
* @param proposedRotation the screen rotation that is proposed by the system.
* @param currentRotation the current screen rotation.
* @param timeoutMillis the timeout in millisecond for the query. If the query doesn't get
@@ -53,8 +54,10 @@
* @param cancellationSignal a cancellation signal that notifies the rotation resolver manger
*/
public abstract void resolveRotation(@NonNull RotationResolverCallbackInternal callback,
- @Surface.Rotation int proposedRotation, @Surface.Rotation int currentRotation,
- @DurationMillisLong long timeoutMillis, @NonNull CancellationSignal cancellationSignal);
+ String packageName, @Surface.Rotation int proposedRotation,
+ @Surface.Rotation int currentRotation, @DurationMillisLong long timeoutMillis,
+ @NonNull CancellationSignal cancellationSignal);
+
/**
* Internal interfaces for the rotation resolver callback.
diff --git a/core/java/android/service/dataloader/DataLoaderService.java b/core/java/android/service/dataloader/DataLoaderService.java
index 3ad80d3..63ec252 100644
--- a/core/java/android/service/dataloader/DataLoaderService.java
+++ b/core/java/android/service/dataloader/DataLoaderService.java
@@ -39,24 +39,35 @@
import java.util.Collection;
/**
- * The base class for implementing data loader service to control data loaders. Expecting
- * Installation Session to bind to a children class of this.
+ * The base class for implementing a data loader service.
+ * <p>
+ * After calling commit() on the install session, the DataLoaderService is started and bound to
+ * provide the actual data bytes for the streaming session.
+ * The service will automatically be rebound until the streaming session has enough data to
+ * proceed with the installation.
+ *
+ * @see android.content.pm.DataLoaderParams
+ * @see android.content.pm.PackageInstaller.SessionParams#setDataLoaderParams
*/
public abstract class DataLoaderService extends Service {
private static final String TAG = "DataLoaderService";
private final DataLoaderBinderService mBinder = new DataLoaderBinderService();
/**
- * Managed DataLoader interface. Each instance corresponds to a single installation session.
+ * DataLoader interface. Each instance corresponds to a single installation session.
*/
public interface DataLoader {
/**
* A virtual constructor.
*
* @param dataLoaderParams parameters set in the installation session
- * @param connector FS API wrapper
- * @return True if initialization of a Data Loader was successful. False will be reported to
- * PackageManager and fail the installation
+ * {@link android.content.pm.PackageInstaller.SessionParams#setDataLoaderParams}
+ * @param connector Wrapper providing access to the installation image.
+ * @return true if initialization of a DataLoader was successful. False will notify the
+ * Installer {@link android.content.pm.PackageInstaller#STATUS_PENDING_STREAMING} and
+ * interrupt the session commit. The Installer is supposed to make sure DataLoader can
+ * proceed and then commit the session
+ * {@link android.content.pm.PackageInstaller.Session#commit}.
*/
boolean onCreate(@NonNull DataLoaderParams dataLoaderParams,
@NonNull FileSystemConnector connector);
@@ -64,10 +75,35 @@
/**
* Prepare installation image. After this method succeeds installer will validate the files
* and continue installation.
+ * The method should block until the files are prepared for installation.
+ * This can take up to session lifetime (~day). If the session lifetime is exceeded then
+ * any attempts to write new data will fail.
*
- * @param addedFiles list of files created in this installation session.
- * @param removedFiles list of files removed in this installation session.
- * @return false if unable to create and populate all addedFiles.
+ * Example implementation:
+ * <code>
+ * String localPath = "/data/local/tmp/base.apk";
+ * session.addFile(LOCATION_DATA_APP, "base", 123456, localPath.getBytes(UTF_8), null);
+ * ...
+ * // onPrepareImage
+ * for (InstallationFile file : addedFiles) {
+ * String localPath = new String(file.getMetadata(), UTF_8);
+ * File source = new File(localPath);
+ * ParcelFileDescriptor fd = ParcelFileDescriptor.open(source, MODE_READ_ONLY);
+ * try {
+ * mConnector.writeData(file.getName(), 0, fd.getStatSize(), fd);
+ * } finally {
+ * IoUtils.closeQuietly(fd);
+ * }
+ * }
+ * </code>
+ * It is recommended to stream data into installation session directly from source, e.g.
+ * cloud data storage, to save local disk space.
+ *
+ * @param addedFiles list of files created in this installation session
+ * {@link android.content.pm.PackageInstaller.Session#addFile}
+ * @param removedFiles list of files removed in this installation session
+ * {@link android.content.pm.PackageInstaller.Session#removeFile}
+ * @return false if unable to create and populate all addedFiles. Installation will fail.
*/
boolean onPrepareImage(@NonNull Collection<InstallationFile> addedFiles,
@NonNull Collection<String> removedFiles);
@@ -75,8 +111,7 @@
/**
* DataLoader factory method.
- *
- * @return An instance of a DataLoader.
+ * An installation session uses it to create an instance of DataLoader.
*/
public @Nullable DataLoader onCreateDataLoader(@NonNull DataLoaderParams dataLoaderParams) {
return null;
@@ -142,7 +177,7 @@
}
/**
- * Used by the DataLoaderService implementations.
+ * Provides access to the installation image.
*/
public static final class FileSystemConnector {
/**
@@ -157,7 +192,8 @@
/**
* Write data to an installation file from an arbitrary FD.
*
- * @param name name of file previously added to the installation session.
+ * @param name name of file previously added to the installation session
+ * {@link InstallationFile#getName()}.
* @param offsetBytes offset into the file to begin writing at, or 0 to start at the
* beginning of the file.
* @param lengthBytes total size of the file being written, used to preallocate the
diff --git a/core/java/android/service/displayhash/DisplayHashParams.java b/core/java/android/service/displayhash/DisplayHashParams.java
index 6a176a33..fcce91a 100644
--- a/core/java/android/service/displayhash/DisplayHashParams.java
+++ b/core/java/android/service/displayhash/DisplayHashParams.java
@@ -46,11 +46,6 @@
private final Size mBufferSize;
/**
- * Whether the content captured will use filtering when scaling.
- */
- private final boolean mBufferScaleWithFiltering;
-
- /**
* Whether the content will be captured in grayscale or color.
*/
private final boolean mGrayscaleBuffer;
@@ -61,7 +56,6 @@
public static final class Builder {
@Nullable
private Size mBufferSize;
- private boolean mBufferScaleWithFiltering;
private boolean mGrayscaleBuffer;
/**
@@ -80,15 +74,6 @@
}
/**
- * Whether the content captured will use filtering when scaling.
- */
- @NonNull
- public Builder setBufferScaleWithFiltering(boolean value) {
- mBufferScaleWithFiltering = value;
- return this;
- }
-
- /**
* Whether the content will be captured in grayscale or color.
*/
@NonNull
@@ -100,13 +85,13 @@
/** Builds the instance. This builder should not be touched after calling this! */
@NonNull
public DisplayHashParams build() {
- return new DisplayHashParams(mBufferSize, mBufferScaleWithFiltering, mGrayscaleBuffer);
+ return new DisplayHashParams(mBufferSize, mGrayscaleBuffer);
}
}
- // Code below generated by codegen v1.0.22.
+ // Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -127,8 +112,6 @@
* buffer given to the {@link DisplayHasherService#onGenerateDisplayHash(byte[], HardwareBuffer,
* Rect, String, DisplayHashResultCallback)} will be stretched based on the value set here.
* If {@code null}, the buffer size will not be changed.
- * @param bufferScaleWithFiltering
- * Whether the content captured will use filtering when scaling.
* @param grayscaleBuffer
* Whether the content will be captured in grayscale or color.
* @hide
@@ -136,10 +119,8 @@
@DataClass.Generated.Member
public DisplayHashParams(
@Nullable Size bufferSize,
- boolean bufferScaleWithFiltering,
boolean grayscaleBuffer) {
this.mBufferSize = bufferSize;
- this.mBufferScaleWithFiltering = bufferScaleWithFiltering;
this.mGrayscaleBuffer = grayscaleBuffer;
// onConstructed(); // You can define this method to get a callback
@@ -157,14 +138,6 @@
}
/**
- * Whether the content captured will use filtering when scaling.
- */
- @DataClass.Generated.Member
- public boolean isBufferScaleWithFiltering() {
- return mBufferScaleWithFiltering;
- }
-
- /**
* Whether the content will be captured in grayscale or color.
*/
@DataClass.Generated.Member
@@ -180,7 +153,6 @@
return "DisplayHashParams { " +
"bufferSize = " + mBufferSize + ", " +
- "bufferScaleWithFiltering = " + mBufferScaleWithFiltering + ", " +
"grayscaleBuffer = " + mGrayscaleBuffer +
" }";
}
@@ -192,8 +164,7 @@
// void parcelFieldName(Parcel dest, int flags) { ... }
byte flg = 0;
- if (mBufferScaleWithFiltering) flg |= 0x2;
- if (mGrayscaleBuffer) flg |= 0x4;
+ if (mGrayscaleBuffer) flg |= 0x2;
if (mBufferSize != null) flg |= 0x1;
dest.writeByte(flg);
if (mBufferSize != null) dest.writeSize(mBufferSize);
@@ -211,12 +182,10 @@
// static FieldType unparcelFieldName(Parcel in) { ... }
byte flg = in.readByte();
- boolean bufferScaleWithFiltering = (flg & 0x2) != 0;
- boolean grayscaleBuffer = (flg & 0x4) != 0;
+ boolean grayscaleBuffer = (flg & 0x2) != 0;
Size bufferSize = (flg & 0x1) == 0 ? null : (Size) in.readSize();
this.mBufferSize = bufferSize;
- this.mBufferScaleWithFiltering = bufferScaleWithFiltering;
this.mGrayscaleBuffer = grayscaleBuffer;
// onConstructed(); // You can define this method to get a callback
@@ -237,10 +206,10 @@
};
@DataClass.Generated(
- time = 1615565493989L,
- codegenVersion = "1.0.22",
+ time = 1617735166254L,
+ codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/service/displayhash/DisplayHashParams.java",
- inputSignatures = "private final @android.annotation.Nullable android.util.Size mBufferSize\nprivate final boolean mBufferScaleWithFiltering\nprivate final boolean mGrayscaleBuffer\nclass DisplayHashParams extends java.lang.Object implements [android.os.Parcelable]\nprivate @android.annotation.Nullable android.util.Size mBufferSize\nprivate boolean mBufferScaleWithFiltering\nprivate boolean mGrayscaleBuffer\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams.Builder setBufferSize(int,int)\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams.Builder setBufferScaleWithFiltering(boolean)\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams.Builder setGrayscaleBuffer(boolean)\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams build()\nclass Builder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genAidl=true, genToString=true, genParcelable=true, genHiddenConstructor=true)")
+ inputSignatures = "private final @android.annotation.Nullable android.util.Size mBufferSize\nprivate final boolean mGrayscaleBuffer\nclass DisplayHashParams extends java.lang.Object implements [android.os.Parcelable]\nprivate @android.annotation.Nullable android.util.Size mBufferSize\nprivate boolean mGrayscaleBuffer\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams.Builder setBufferSize(int,int)\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams.Builder setGrayscaleBuffer(boolean)\npublic @android.annotation.NonNull android.service.displayhash.DisplayHashParams build()\nclass Builder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genAidl=true, genToString=true, genParcelable=true, genHiddenConstructor=true)")
@Deprecated
private void __metadata() {}
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
index 5d718440..c87407e 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
@@ -98,7 +98,10 @@
intent.setPackage(packageName);
List<ResolveInfo> resolveInfos =
context.getPackageManager().queryIntentServices(intent,
- PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA);
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.MATCH_DEFAULT_ONLY
+ | PackageManager.GET_META_DATA);
return resolveInfos.isEmpty() ? null : resolveInfos.get(0).serviceInfo;
}
diff --git a/core/java/android/service/resumeonreboot/OWNERS b/core/java/android/service/resumeonreboot/OWNERS
new file mode 100644
index 0000000..3a127d5
--- /dev/null
+++ b/core/java/android/service/resumeonreboot/OWNERS
@@ -0,0 +1,2 @@
+xunchang@google.com
+zhaojiac@google.com
diff --git a/core/java/android/service/resumeonreboot/ResumeOnRebootService.java b/core/java/android/service/resumeonreboot/ResumeOnRebootService.java
index ad49ffd..247d9c4 100644
--- a/core/java/android/service/resumeonreboot/ResumeOnRebootService.java
+++ b/core/java/android/service/resumeonreboot/ResumeOnRebootService.java
@@ -59,11 +59,9 @@
* </service>
* </pre>
*
- * //TODO: Replace this with public link when available.
- *
* @hide
* @see
- * <a href="https://goto.google.com/server-based-ror">https://goto.google.com/server-based-ror</a>
+ * <a href="https://source.android.com/devices/tech/ota/resume-on-reboot">https://source.android.com/devices/tech/ota/resume-on-reboot</a>
*/
@SystemApi
public abstract class ResumeOnRebootService extends Service {
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index 09452828..199ecb3 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -86,6 +86,12 @@
// accessibility from hanging
private static final long REQUEST_PREPARER_TIMEOUT_MS = 500;
+ // Callbacks should have the same configuration of the flags below to allow satisfying a pending
+ // node request on prefetch
+ private static final int FLAGS_AFFECTING_REPORTED_DATA =
+ AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
+ | AccessibilityNodeInfo.FLAG_REPORT_VIEW_IDS;
+
private final ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
new ArrayList<AccessibilityNodeInfo>();
@@ -114,6 +120,9 @@
private AddNodeInfosForViewId mAddNodeInfosForViewId;
@GuardedBy("mLock")
+ private ArrayList<Message> mPendingFindNodeByIdMessages;
+
+ @GuardedBy("mLock")
private int mNumActiveRequestPreparers;
@GuardedBy("mLock")
private List<MessageHolder> mMessagesWaitingForRequestPreparer;
@@ -128,6 +137,7 @@
mViewRootImpl = viewRootImpl;
mPrefetcher = new AccessibilityNodePrefetcher();
mA11yManager = mViewRootImpl.mContext.getSystemService(AccessibilityManager.class);
+ mPendingFindNodeByIdMessages = new ArrayList<>();
}
private void scheduleMessage(Message message, int interrogatingPid, long interrogatingTid,
@@ -177,7 +187,11 @@
args.arg4 = arguments;
message.obj = args;
- scheduleMessage(message, interrogatingPid, interrogatingTid, CONSIDER_REQUEST_PREPARERS);
+ synchronized (mLock) {
+ mPendingFindNodeByIdMessages.add(message);
+ scheduleMessage(message, interrogatingPid, interrogatingTid,
+ CONSIDER_REQUEST_PREPARERS);
+ }
}
/**
@@ -315,6 +329,9 @@
}
private void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) {
+ synchronized (mLock) {
+ mPendingFindNodeByIdMessages.remove(message);
+ }
final int flags = message.arg1;
SomeArgs args = (SomeArgs) message.obj;
@@ -329,22 +346,69 @@
args.recycle();
- List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
- infos.clear();
+ View requestedView = null;
+ AccessibilityNodeInfo requestedNode = null;
try {
if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
return;
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
- final View root = findViewByAccessibilityId(accessibilityViewId);
- if (root != null && isShown(root)) {
- mPrefetcher.prefetchAccessibilityNodeInfos(
- root, virtualDescendantId, flags, infos, arguments);
+ requestedView = findViewByAccessibilityId(accessibilityViewId);
+ if (requestedView != null && isShown(requestedView)) {
+ requestedNode = populateAccessibilityNodeInfoForView(
+ requestedView, arguments, virtualDescendantId);
}
} finally {
- updateInfosForViewportAndReturnFindNodeResult(
- infos, callback, interactionId, spec, interactiveRegion);
+ updateInfoForViewportAndReturnFindNodeResult(
+ requestedNode == null ? null : AccessibilityNodeInfo.obtain(requestedNode),
+ callback, interactionId, spec, interactiveRegion);
}
+ ArrayList<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
+ infos.clear();
+ mPrefetcher.prefetchAccessibilityNodeInfos(requestedView,
+ requestedNode == null ? null : AccessibilityNodeInfo.obtain(requestedNode),
+ virtualDescendantId, flags, infos);
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+ updateInfosForViewPort(infos, spec, interactiveRegion);
+ final SatisfiedFindAccessibilityNodeByAccessibilityIdRequest satisfiedRequest =
+ getSatisfiedRequestInPrefetch(
+ requestedNode == null ? null : requestedNode, infos, flags);
+
+ if (satisfiedRequest != null && satisfiedRequest.mSatisfiedRequestNode != requestedNode) {
+ infos.remove(satisfiedRequest.mSatisfiedRequestNode);
+ }
+
+ returnPrefetchResult(interactionId, infos, callback);
+
+ if (satisfiedRequest != null) {
+ returnFindNodeResult(satisfiedRequest);
+ }
+ }
+
+ private AccessibilityNodeInfo populateAccessibilityNodeInfoForView(
+ View view, Bundle arguments, int virtualViewId) {
+ AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
+ // Determine if we'll be populating extra data
+ final String extraDataRequested = (arguments == null) ? null
+ : arguments.getString(EXTRA_DATA_REQUESTED_KEY);
+ AccessibilityNodeInfo root = null;
+ if (provider == null) {
+ root = view.createAccessibilityNodeInfo();
+ if (root != null) {
+ if (extraDataRequested != null) {
+ view.addExtraDataToAccessibilityNodeInfo(root, extraDataRequested, arguments);
+ }
+ }
+ } else {
+ root = provider.createAccessibilityNodeInfo(virtualViewId);
+ if (root != null) {
+ if (extraDataRequested != null) {
+ provider.addExtraDataToAccessibilityNodeInfo(
+ virtualViewId, root, extraDataRequested, arguments);
+ }
+ }
+ }
+ return root;
}
public void findAccessibilityNodeInfosByViewIdClientThread(long accessibilityNodeId,
@@ -403,6 +467,7 @@
mAddNodeInfosForViewId.reset();
}
} finally {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
updateInfosForViewportAndReturnFindNodeResult(
infos, callback, interactionId, spec, interactiveRegion);
}
@@ -485,6 +550,7 @@
}
}
} finally {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
updateInfosForViewportAndReturnFindNodeResult(
infos, callback, interactionId, spec, interactiveRegion);
}
@@ -576,6 +642,7 @@
}
}
} finally {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
updateInfoForViewportAndReturnFindNodeResult(
focused, callback, interactionId, spec, interactiveRegion);
}
@@ -630,6 +697,7 @@
}
}
} finally {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
updateInfoForViewportAndReturnFindNodeResult(
next, callback, interactionId, spec, interactiveRegion);
}
@@ -786,33 +854,6 @@
}
}
- private void applyAppScaleAndMagnificationSpecIfNeeded(List<AccessibilityNodeInfo> infos,
- MagnificationSpec spec) {
- if (infos == null) {
- return;
- }
- final float applicationScale = mViewRootImpl.mAttachInfo.mApplicationScale;
- if (shouldApplyAppScaleAndMagnificationSpec(applicationScale, spec)) {
- final int infoCount = infos.size();
- for (int i = 0; i < infoCount; i++) {
- AccessibilityNodeInfo info = infos.get(i);
- applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
- }
- }
- }
-
- private void adjustIsVisibleToUserIfNeeded(List<AccessibilityNodeInfo> infos,
- Region interactiveRegion) {
- if (interactiveRegion == null || infos == null) {
- return;
- }
- final int infoCount = infos.size();
- for (int i = 0; i < infoCount; i++) {
- AccessibilityNodeInfo info = infos.get(i);
- adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
- }
- }
-
private void adjustIsVisibleToUserIfNeeded(AccessibilityNodeInfo info,
Region interactiveRegion) {
if (interactiveRegion == null || info == null) {
@@ -833,17 +874,6 @@
return false;
}
- private void adjustBoundsInScreenIfNeeded(List<AccessibilityNodeInfo> infos) {
- if (infos == null || shouldBypassAdjustBoundsInScreen()) {
- return;
- }
- final int infoCount = infos.size();
- for (int i = 0; i < infoCount; i++) {
- final AccessibilityNodeInfo info = infos.get(i);
- adjustBoundsInScreenIfNeeded(info);
- }
- }
-
private void adjustBoundsInScreenIfNeeded(AccessibilityNodeInfo info) {
if (info == null || shouldBypassAdjustBoundsInScreen()) {
return;
@@ -891,17 +921,6 @@
return screenMatrix == null || screenMatrix.isIdentity();
}
- private void associateLeashedParentIfNeeded(List<AccessibilityNodeInfo> infos) {
- if (infos == null || shouldBypassAssociateLeashedParent()) {
- return;
- }
- final int infoCount = infos.size();
- for (int i = 0; i < infoCount; i++) {
- final AccessibilityNodeInfo info = infos.get(i);
- associateLeashedParentIfNeeded(info);
- }
- }
-
private void associateLeashedParentIfNeeded(AccessibilityNodeInfo info) {
if (info == null || shouldBypassAssociateLeashedParent()) {
return;
@@ -975,18 +994,59 @@
return (appScale != 1.0f || (spec != null && !spec.isNop()));
}
+ private void updateInfosForViewPort(List<AccessibilityNodeInfo> infos, MagnificationSpec spec,
+ Region interactiveRegion) {
+ for (int i = 0; i < infos.size(); i++) {
+ updateInfoForViewPort(infos.get(i), spec, interactiveRegion);
+ }
+ }
+
+ private void updateInfoForViewPort(AccessibilityNodeInfo info, MagnificationSpec spec,
+ Region interactiveRegion) {
+ associateLeashedParentIfNeeded(info);
+ applyScreenMatrixIfNeeded(info);
+ adjustBoundsInScreenIfNeeded(info);
+ // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
+ // then impact the visibility result, we need to adjust visibility before apply scale.
+ adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
+ applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
+ }
+
private void updateInfosForViewportAndReturnFindNodeResult(List<AccessibilityNodeInfo> infos,
IAccessibilityInteractionConnectionCallback callback, int interactionId,
MagnificationSpec spec, Region interactiveRegion) {
+ if (infos != null) {
+ updateInfosForViewPort(infos, spec, interactiveRegion);
+ }
+ returnFindNodesResult(infos, callback, interactionId);
+ }
+
+ private void returnFindNodeResult(AccessibilityNodeInfo info,
+ IAccessibilityInteractionConnectionCallback callback,
+ int interactionId) {
try {
- mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
- associateLeashedParentIfNeeded(infos);
- applyScreenMatrixIfNeeded(infos);
- adjustBoundsInScreenIfNeeded(infos);
- // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
- // then impact the visibility result, we need to adjust visibility before apply scale.
- adjustIsVisibleToUserIfNeeded(infos, interactiveRegion);
- applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
+ callback.setFindAccessibilityNodeInfoResult(info, interactionId);
+ } catch (RemoteException re) {
+ /* ignore - the other side will time out */
+ }
+ }
+
+ private void returnFindNodeResult(SatisfiedFindAccessibilityNodeByAccessibilityIdRequest
+ satisfiedRequest) {
+ try {
+ final AccessibilityNodeInfo info = satisfiedRequest.mSatisfiedRequestNode;
+ final IAccessibilityInteractionConnectionCallback callback =
+ satisfiedRequest.mSatisfiedRequestCallback;
+ final int interactionId = satisfiedRequest.mSatisfiedRequestInteractionId;
+ callback.setFindAccessibilityNodeInfoResult(info, interactionId);
+ } catch (RemoteException re) {
+ /* ignore - the other side will time out */
+ }
+ }
+
+ private void returnFindNodesResult(List<AccessibilityNodeInfo> infos,
+ IAccessibilityInteractionConnectionCallback callback, int interactionId) {
+ try {
callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
if (infos != null) {
infos.clear();
@@ -996,22 +1056,74 @@
}
}
+ private SatisfiedFindAccessibilityNodeByAccessibilityIdRequest getSatisfiedRequestInPrefetch(
+ AccessibilityNodeInfo requestedNode, List<AccessibilityNodeInfo> infos, int flags) {
+ SatisfiedFindAccessibilityNodeByAccessibilityIdRequest satisfiedRequest = null;
+ synchronized (mLock) {
+ for (int i = 0; i < mPendingFindNodeByIdMessages.size(); i++) {
+ final Message pendingMessage = mPendingFindNodeByIdMessages.get(i);
+ final int pendingFlags = pendingMessage.arg1;
+ if ((pendingFlags & FLAGS_AFFECTING_REPORTED_DATA)
+ != (flags & FLAGS_AFFECTING_REPORTED_DATA)) {
+ continue;
+ }
+ SomeArgs args = (SomeArgs) pendingMessage.obj;
+ final int accessibilityViewId = args.argi1;
+ final int virtualDescendantId = args.argi2;
+
+ final AccessibilityNodeInfo satisfiedRequestNode = nodeWithIdFromList(requestedNode,
+ infos, AccessibilityNodeInfo.makeNodeId(
+ accessibilityViewId, virtualDescendantId));
+
+ if (satisfiedRequestNode != null) {
+ mHandler.removeMessages(
+ PrivateHandler.MSG_FIND_ACCESSIBILITY_NODE_INFO_BY_ACCESSIBILITY_ID,
+ pendingMessage.obj);
+ final IAccessibilityInteractionConnectionCallback satisfiedRequestCallback =
+ (IAccessibilityInteractionConnectionCallback) args.arg1;
+ final int satisfiedRequestInteractionId = args.argi3;
+ satisfiedRequest = new SatisfiedFindAccessibilityNodeByAccessibilityIdRequest(
+ satisfiedRequestNode, satisfiedRequestCallback,
+ satisfiedRequestInteractionId);
+ args.recycle();
+ break;
+ }
+ }
+ mPendingFindNodeByIdMessages.clear();
+ return satisfiedRequest;
+ }
+ }
+
+ private AccessibilityNodeInfo nodeWithIdFromList(AccessibilityNodeInfo requestedNode,
+ List<AccessibilityNodeInfo> infos, long nodeId) {
+ if (requestedNode != null && requestedNode.getSourceNodeId() == nodeId) {
+ return requestedNode;
+ }
+ for (int j = 0; j < infos.size(); j++) {
+ AccessibilityNodeInfo info = infos.get(j);
+ if (info.getSourceNodeId() == nodeId) {
+ return info;
+ }
+ }
+ return null;
+ }
+
+ private void returnPrefetchResult(int interactionId, List<AccessibilityNodeInfo> infos,
+ IAccessibilityInteractionConnectionCallback callback) {
+ if (infos.size() > 0) {
+ try {
+ callback.setPrefetchAccessibilityNodeInfoResult(infos, interactionId);
+ } catch (RemoteException re) {
+ /* ignore - other side isn't too bothered if this doesn't arrive */
+ }
+ }
+ }
+
private void updateInfoForViewportAndReturnFindNodeResult(AccessibilityNodeInfo info,
IAccessibilityInteractionConnectionCallback callback, int interactionId,
MagnificationSpec spec, Region interactiveRegion) {
- try {
- mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
- associateLeashedParentIfNeeded(info);
- applyScreenMatrixIfNeeded(info);
- adjustBoundsInScreenIfNeeded(info);
- // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
- // then impact the visibility result, we need to adjust visibility before apply scale.
- adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
- applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
- callback.setFindAccessibilityNodeInfoResult(info, interactionId);
- } catch (RemoteException re) {
- /* ignore - the other side will time out */
- }
+ updateInfoForViewPort(info, spec, interactiveRegion);
+ returnFindNodeResult(info, callback, interactionId);
}
private boolean handleClickableSpanActionUiThread(
@@ -1054,56 +1166,45 @@
private final ArrayList<View> mTempViewList = new ArrayList<View>();
- public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int fetchFlags,
- List<AccessibilityNodeInfo> outInfos, Bundle arguments) {
+ public void prefetchAccessibilityNodeInfos(View view, AccessibilityNodeInfo root,
+ int virtualViewId, int fetchFlags, List<AccessibilityNodeInfo> outInfos) {
+ if (root == null) {
+ return;
+ }
AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
- // Determine if we'll be populating extra data
- final String extraDataRequested = (arguments == null) ? null
- : arguments.getString(EXTRA_DATA_REQUESTED_KEY);
if (provider == null) {
- AccessibilityNodeInfo root = view.createAccessibilityNodeInfo();
- if (root != null) {
- if (extraDataRequested != null) {
- view.addExtraDataToAccessibilityNodeInfo(
- root, extraDataRequested, arguments);
- }
- outInfos.add(root);
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
- prefetchPredecessorsOfRealNode(view, outInfos);
- }
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
- prefetchSiblingsOfRealNode(view, outInfos);
- }
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
- prefetchDescendantsOfRealNode(view, outInfos);
- }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+ prefetchPredecessorsOfRealNode(view, outInfos);
+ }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
+ prefetchSiblingsOfRealNode(view, outInfos);
+ }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+ prefetchDescendantsOfRealNode(view, outInfos);
}
} else {
- final AccessibilityNodeInfo root =
- provider.createAccessibilityNodeInfo(virtualViewId);
- if (root != null) {
- if (extraDataRequested != null) {
- provider.addExtraDataToAccessibilityNodeInfo(
- virtualViewId, root, extraDataRequested, arguments);
- }
- outInfos.add(root);
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
- prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
- }
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
- prefetchSiblingsOfVirtualNode(root, view, provider, outInfos);
- }
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
- prefetchDescendantsOfVirtualNode(root, provider, outInfos);
- }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+ prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
+ }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
+ prefetchSiblingsOfVirtualNode(root, view, provider, outInfos);
+ }
+ if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+ prefetchDescendantsOfVirtualNode(root, provider, outInfos);
}
}
if (ENFORCE_NODE_TREE_CONSISTENT) {
- enforceNodeTreeConsistent(outInfos);
+ enforceNodeTreeConsistent(root, outInfos);
}
}
- private void enforceNodeTreeConsistent(List<AccessibilityNodeInfo> nodes) {
+ private boolean shouldStopPrefetching(List prefetchededInfos) {
+ return mHandler.hasUserInteractiveMessagesWaiting()
+ || prefetchededInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE;
+ }
+
+ private void enforceNodeTreeConsistent(
+ AccessibilityNodeInfo root, List<AccessibilityNodeInfo> nodes) {
LongSparseArray<AccessibilityNodeInfo> nodeMap =
new LongSparseArray<AccessibilityNodeInfo>();
final int nodeCount = nodes.size();
@@ -1114,7 +1215,6 @@
// If the nodes are a tree it does not matter from
// which node we start to search for the root.
- AccessibilityNodeInfo root = nodeMap.valueAt(0);
AccessibilityNodeInfo parent = root;
while (parent != null) {
root = parent;
@@ -1181,9 +1281,11 @@
private void prefetchPredecessorsOfRealNode(View view,
List<AccessibilityNodeInfo> outInfos) {
+ if (shouldStopPrefetching(outInfos)) {
+ return;
+ }
ViewParent parent = view.getParentForAccessibility();
- while (parent instanceof View
- && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ while (parent instanceof View && !shouldStopPrefetching(outInfos)) {
View parentView = (View) parent;
AccessibilityNodeInfo info = parentView.createAccessibilityNodeInfo();
if (info != null) {
@@ -1195,6 +1297,9 @@
private void prefetchSiblingsOfRealNode(View current,
List<AccessibilityNodeInfo> outInfos) {
+ if (shouldStopPrefetching(outInfos)) {
+ return;
+ }
ViewParent parent = current.getParentForAccessibility();
if (parent instanceof ViewGroup) {
ViewGroup parentGroup = (ViewGroup) parent;
@@ -1204,7 +1309,7 @@
parentGroup.addChildrenForAccessibility(children);
final int childCount = children.size();
for (int i = 0; i < childCount; i++) {
- if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (shouldStopPrefetching(outInfos)) {
return;
}
View child = children.get(i);
@@ -1232,7 +1337,7 @@
private void prefetchDescendantsOfRealNode(View root,
List<AccessibilityNodeInfo> outInfos) {
- if (!(root instanceof ViewGroup)) {
+ if (shouldStopPrefetching(outInfos) || !(root instanceof ViewGroup)) {
return;
}
HashMap<View, AccessibilityNodeInfo> addedChildren =
@@ -1243,7 +1348,7 @@
root.addChildrenForAccessibility(children);
final int childCount = children.size();
for (int i = 0; i < childCount; i++) {
- if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (shouldStopPrefetching(outInfos)) {
return;
}
View child = children.get(i);
@@ -1268,7 +1373,7 @@
} finally {
children.clear();
}
- if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (!shouldStopPrefetching(outInfos)) {
for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) {
View addedChild = entry.getKey();
AccessibilityNodeInfo virtualRoot = entry.getValue();
@@ -1290,7 +1395,7 @@
long parentNodeId = root.getParentNodeId();
int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
while (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (shouldStopPrefetching(outInfos)) {
return;
}
final int virtualDescendantId =
@@ -1335,7 +1440,7 @@
if (parent != null) {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
- if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (shouldStopPrefetching(outInfos)) {
return;
}
final long childNodeId = parent.getChildId(i);
@@ -1360,7 +1465,7 @@
final int initialOutInfosSize = outInfos.size();
final int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
- if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (shouldStopPrefetching(outInfos)) {
return;
}
final long childNodeId = root.getChildId(i);
@@ -1370,7 +1475,7 @@
outInfos.add(child);
}
}
- if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+ if (!shouldStopPrefetching(outInfos)) {
final int addedChildCount = outInfos.size() - initialOutInfosSize;
for (int i = 0; i < addedChildCount; i++) {
AccessibilityNodeInfo child = outInfos.get(initialOutInfosSize + i);
@@ -1479,6 +1584,10 @@
boolean hasAccessibilityCallback(Message message) {
return message.what < FIRST_NO_ACCESSIBILITY_CALLBACK_MSG ? true : false;
}
+
+ boolean hasUserInteractiveMessagesWaiting() {
+ return hasMessagesOrCallbacks();
+ }
}
private final class AddNodeInfosForViewId implements Predicate<View> {
@@ -1515,4 +1624,19 @@
mInterrogatingTid = interrogatingTid;
}
}
+
+ private static class SatisfiedFindAccessibilityNodeByAccessibilityIdRequest {
+ final AccessibilityNodeInfo mSatisfiedRequestNode;
+ final IAccessibilityInteractionConnectionCallback mSatisfiedRequestCallback;
+ final int mSatisfiedRequestInteractionId;
+
+ SatisfiedFindAccessibilityNodeByAccessibilityIdRequest(
+ AccessibilityNodeInfo satisfiedRequestNode,
+ IAccessibilityInteractionConnectionCallback satisfiedRequestCallback,
+ int satisfiedRequestInteractionId) {
+ mSatisfiedRequestNode = satisfiedRequestNode;
+ mSatisfiedRequestCallback = satisfiedRequestCallback;
+ mSatisfiedRequestInteractionId = satisfiedRequestInteractionId;
+ }
+ }
}
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index 5c65c65..7b3a8a6 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -737,7 +737,7 @@
}
mFrameInfo.setVsync(intendedFrameTimeNanos, frameTimeNanos, vsyncEventData.id,
- vsyncEventData.frameDeadline);
+ vsyncEventData.frameDeadline, startNanos);
mFrameScheduled = false;
mLastFrameTimeNanos = frameTimeNanos;
mLastVsyncEventData = vsyncEventData;
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index bf152cb..c87db65 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -1070,6 +1070,11 @@
if (mDisplayInfo.userDisabledHdrTypes.length == 0) {
return mDisplayInfo.hdrCapabilities;
}
+
+ if (mDisplayInfo.hdrCapabilities == null) {
+ return null;
+ }
+
ArraySet<Integer> enabledTypesSet = new ArraySet<>();
for (int supportedType : mDisplayInfo.hdrCapabilities.getSupportedHdrTypes()) {
boolean typeDisabled = false;
@@ -1083,6 +1088,7 @@
enabledTypesSet.add(supportedType);
}
}
+
int[] enabledTypes = new int[enabledTypesSet.size()];
int index = 0;
for (int enabledType : enabledTypesSet) {
@@ -1107,6 +1113,9 @@
public int[] getReportedHdrTypes() {
synchronized (mLock) {
updateDisplayInfoLocked();
+ if (mDisplayInfo.hdrCapabilities == null) {
+ return new int[0];
+ }
return mDisplayInfo.hdrCapabilities.getSupportedHdrTypes();
}
}
@@ -1120,7 +1129,11 @@
public boolean isHdr() {
synchronized (mLock) {
updateDisplayInfoLocked();
- return !(getHdrCapabilities().getSupportedHdrTypes().length == 0);
+ HdrCapabilities hdrCapabilities = getHdrCapabilities();
+ if (hdrCapabilities == null) {
+ return false;
+ }
+ return !(hdrCapabilities.getSupportedHdrTypes().length == 0);
}
}
diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java
index eb49e52..9cdf91a 100644
--- a/core/java/android/view/FrameMetrics.java
+++ b/core/java/android/view/FrameMetrics.java
@@ -242,18 +242,19 @@
int PERFORM_TRAVERSALS_START = 7;
int DRAW_START = 8;
int FRAME_DEADLINE = 9;
- int SYNC_QUEUED = 10;
- int SYNC_START = 11;
- int ISSUE_DRAW_COMMANDS_START = 12;
- int SWAP_BUFFERS = 13;
- int FRAME_COMPLETED = 14;
- int DEQUEUE_BUFFER_DURATION = 15;
- int QUEUE_BUFFER_DURATION = 16;
- int GPU_COMPLETED = 17;
- int SWAP_BUFFERS_COMPLETED = 18;
- int DISPLAY_PRESENT_TIME = 19;
+ int FRAME_START_TIME = 10;
+ int SYNC_QUEUED = 11;
+ int SYNC_START = 12;
+ int ISSUE_DRAW_COMMANDS_START = 13;
+ int SWAP_BUFFERS = 14;
+ int FRAME_COMPLETED = 15;
+ int DEQUEUE_BUFFER_DURATION = 16;
+ int QUEUE_BUFFER_DURATION = 17;
+ int GPU_COMPLETED = 18;
+ int SWAP_BUFFERS_COMPLETED = 19;
+ int DISPLAY_PRESENT_TIME = 20;
- int FRAME_STATS_COUNT = 20; // must always be last and in sync with
+ int FRAME_STATS_COUNT = 21; // must always be last and in sync with
// FrameInfoIndex::NumIndexes in libs/hwui/FrameInfo.h
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index d0a3e4b..0f032e9 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -786,29 +786,60 @@
void setDisplayHashThrottlingEnabled(boolean enable);
/**
- * Registers a listener for a {@link android.window.WindowContext} to handle configuration
- * changes from the server side.
+ * Attaches a {@link android.window.WindowContext} to the DisplayArea specified by {@code type},
+ * {@code displayId} and {@code options}.
* <p>
* Note that this API should be invoked after calling
* {@link android.window.WindowTokenClient#attachContext(Context)}
- * </p>
+ * </p><p>
+ * Generally, this API is used for initializing a {@link android.window.WindowContext}
+ * before obtaining a valid {@link com.android.server.wm.WindowToken}. A WindowToken is usually
+ * generated when calling {@link android.view.WindowManager#addView(View, LayoutParams)}, or
+ * obtained from {@link android.view.WindowManager.LayoutParams#token}.
+ * </p><p>
+ * In some cases, the WindowToken is passed from the server side because it is managed by the
+ * system server. {@link #attachWindowContextToWindowToken(IBinder, IBinder)} could be used in
+ * this case to attach the WindowContext to the WindowToken.</p>
*
- * @param clientToken the window context's token
+ * @param clientToken {@link android.window.WindowContext#getWindowContextToken()
+ * the WindowContext's token}
* @param type Window type of the window context
* @param displayId The display associated with the window context
* @param options A bundle used to pass window-related options and choose the right DisplayArea
*
- * @return {@code true} if the listener was registered successfully.
+ * @return {@code true} if the WindowContext is attached to the DisplayArea successfully.
*/
- boolean registerWindowContextListener(IBinder clientToken, int type, int displayId,
+ boolean attachWindowContextToDisplayArea(IBinder clientToken, int type, int displayId,
in Bundle options);
/**
- * Unregisters a listener which registered with {@link #registerWindowContextListener()}.
+ * Attaches a {@link android.window.WindowContext} to a {@code WindowToken}.
+ * <p>
+ * This API is used when we hold a valid WindowToken and want to associate with the token and
+ * receive its configuration updates.
+ * </p><p>
+ * Note that this API should be invoked after calling
+ * {@link android.window.WindowTokenClient#attachContext(Context)}
+ * </p>
+ *
+ * @param clientToken {@link android.window.WindowContext#getWindowContextToken()
+ * the WindowContext's token}
+ * @param token the WindowToken to attach
+ *
+ * @throws IllegalArgumentException if the {@code clientToken} have not been attached to
+ * the server or the WindowContext's type doesn't match WindowToken {@code token}'s type.
+ *
+ * @see #attachWindowContextToDisplayArea(IBinder, int, int, Bundle)
+ */
+ void attachWindowContextToWindowToken(IBinder clientToken, IBinder token);
+
+ /**
+ * Detaches {@link android.window.WindowContext} from the window manager node it's currently
+ * attached to. It is no-op if the WindowContext is not attached to a window manager node.
*
* @param clientToken the window context's token
*/
- void unregisterWindowContextListener(IBinder clientToken);
+ void detachWindowContextFromWindowContainer(IBinder clientToken);
/**
* Registers a listener, which is to be called whenever cross-window blur is enabled/disabled.
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index fafb885..3b1c8ec 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -169,7 +169,6 @@
SOURCE_CLASS_NONE,
SOURCE_CLASS_BUTTON,
SOURCE_CLASS_POINTER,
- SOURCE_CLASS_POINTER,
SOURCE_CLASS_TRACKBALL,
SOURCE_CLASS_POSITION,
SOURCE_CLASS_JOYSTICK
@@ -813,7 +812,9 @@
* {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
*
* @return The vibrator service associated with the device, never null.
+ * @deprecated Use {@link #getVibratorManager()} to retrieve the default device vibrator.
*/
+ @Deprecated
public Vibrator getVibrator() {
synchronized (mMotionRanges) {
if (mVibrator == null) {
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 85a4f203..e450061 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -185,8 +185,6 @@
private static native void nativeSetGameContentType(IBinder displayToken, boolean on);
private static native void nativeSetDisplayPowerMode(
IBinder displayToken, int mode);
- private static native void nativeDeferTransactionUntil(long transactionObj, long nativeObject,
- long barrierObject, long frame);
private static native void nativeReparent(long transactionObj, long nativeObject,
long newParentNativeObject);
@@ -3028,21 +3026,6 @@
}
/**
- * @hide
- */
- @UnsupportedAppUsage
- public Transaction deferTransactionUntil(SurfaceControl sc, SurfaceControl barrier,
- long frameNumber) {
- if (frameNumber < 0) {
- return this;
- }
- checkPreconditions(sc);
- nativeDeferTransactionUntil(mNativeObject, sc.mNativeObject, barrier.mNativeObject,
- frameNumber);
- return this;
- }
-
- /**
* Re-parents a given layer to a new parent. Children inherit transform (position, scaling)
* crop, visibility, and Z-ordering from their parents, as if the children were pixels within the
* parent Surface.
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index dd5c954..d6b5a2c 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -9285,6 +9285,11 @@
* parentView.addView(reusableView);
* </pre>
*
+ * <p>NOTE: If this view is a descendant of an {@link android.widget.AdapterView}, the system
+ * may reset its autofill id when this view is recycled. If the autofill ids need to be stable,
+ * they should be set again in
+ * {@link android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)}.
+ *
* @param id an autofill ID that is unique in the {@link android.app.Activity} hosting the view,
* or {@code null} to reset it. Usually it's an id previously allocated to another view (and
* obtained through {@link #getAutofillId()}), or a new value obtained through
@@ -9321,6 +9326,30 @@
}
/**
+ * Forces a reset of the autofill ids of the subtree rooted at this view. Like calling
+ * {@link #setAutofillId(AutofillId) setAutofillId(null)} for each view, but works even if the
+ * views are attached to a window.
+ *
+ * <p>This is useful if the views are being recycled, since an autofill id should uniquely
+ * identify a particular piece of content.
+ *
+ * @hide
+ */
+ public void resetSubtreeAutofillIds() {
+ if (mAutofillViewId == NO_ID) {
+ return;
+ }
+ if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
+ Log.v(CONTENT_CAPTURE_LOG_TAG, "resetAutofillId() for " + mAutofillViewId);
+ } else if (Log.isLoggable(AUTOFILL_LOG_TAG, Log.VERBOSE)) {
+ Log.v(AUTOFILL_LOG_TAG, "resetAutofillId() for " + mAutofillViewId);
+ }
+ mAutofillId = null;
+ mAutofillViewId = NO_ID;
+ mPrivateFlags3 &= ~PFLAG3_AUTOFILLID_EXPLICITLY_SET;
+ }
+
+ /**
* Describes the autofill type of this view, so an
* {@link android.service.autofill.AutofillService} can create the proper {@link AutofillValue}
* when autofilling the view.
@@ -30843,8 +30872,10 @@
* {@link android.view.translation.Translator} to translate the requests. All the
* {@link ViewTranslationRequest}s must be added when the traversal is done.
*
- * <p> The default implementation will call {@link View#onCreateTranslationRequest} to build
- * {@link ViewTranslationRequest} if the view should be translated. </p>
+ * <p> The default implementation calls {@link View#onCreateTranslationRequest} to build
+ * {@link ViewTranslationRequest} if the view should be translated. The view is marked as having
+ * {@link #setHasTransientState(boolean) transient state} so that recycling of views doesn't
+ * prevent the system from attaching the response to it.</p>
*
* @param viewIds a map for the view's {@link AutofillId} and its virtual child ids or
* {@code null} if the view doesn't have virtual child that should be translated. The virtual
@@ -30865,6 +30896,14 @@
ViewTranslationRequest request = onCreateTranslationRequest(supportedFormats);
if (request != null && request.getKeys().size() > 0) {
requests.add(request);
+ if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
+ Log.v(CONTENT_CAPTURE_LOG_TAG, "Calling setHasTransientState(true) for "
+ + autofillId);
+ }
+ // TODO: Add a default ViewTranslationCallback for View that resets this in
+ // onClearTranslation(). Also update the javadoc for this method to mention
+ // that.
+ setHasTransientState(true);
}
} else {
onCreateTranslationRequests(viewIds.get(autofillId), supportedFormats, request -> {
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 5b695f4..04e2cde 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3773,6 +3773,17 @@
/** @hide */
@Override
+ public void resetSubtreeAutofillIds() {
+ super.resetSubtreeAutofillIds();
+ View[] children = mChildren;
+ final int childCount = mChildrenCount;
+ for (int i = 0; i < childCount; i++) {
+ children[i].resetSubtreeAutofillIds();
+ }
+ }
+
+ /** @hide */
+ @Override
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfoInternal(info);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 4b56fd7..cca8257 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -921,6 +921,30 @@
default void setForceCrossWindowBlurDisabled(boolean disable) {
}
+ /**
+ * @hide
+ */
+ static String transitTypeToString(@TransitionType int type) {
+ switch (type) {
+ case TRANSIT_NONE: return "NONE";
+ case TRANSIT_OPEN: return "OPEN";
+ case TRANSIT_CLOSE: return "CLOSE";
+ case TRANSIT_TO_FRONT: return "TO_FRONT";
+ case TRANSIT_TO_BACK: return "TO_BACK";
+ case TRANSIT_RELAUNCH: return "RELAUNCH";
+ case TRANSIT_CHANGE: return "CHANGE";
+ case TRANSIT_KEYGUARD_GOING_AWAY: return "KEYGUARD_GOING_AWAY";
+ case TRANSIT_KEYGUARD_OCCLUDE: return "KEYGUARD_OCCLUDE";
+ case TRANSIT_KEYGUARD_UNOCCLUDE: return "KEYGUARD_UNOCCLUDE";
+ case TRANSIT_FIRST_CUSTOM: return "FIRST_CUSTOM";
+ default:
+ if (type > TRANSIT_FIRST_CUSTOM) {
+ return "FIRST_CUSTOM+" + (type - TRANSIT_FIRST_CUSTOM);
+ }
+ return "UNKNOWN(" + type + ")";
+ }
+ }
+
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
/**
* X position for this window. With the default gravity it is ignored.
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index e641577..df67740 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -130,6 +130,10 @@
private Message mSameThreadMessage;
+ private int mInteractionIdWaitingForPrefetchResult = -1;
+ private int mConnectionIdWaitingForPrefetchResult;
+ private String[] mPackageNamesForNextPrefetchResult;
+
/**
* @return The client for the current thread.
*/
@@ -494,25 +498,27 @@
Binder.restoreCallingIdentity(identityToken);
}
if (packageNames != null) {
- List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
- interactionId);
+ AccessibilityNodeInfo info =
+ getFindAccessibilityNodeInfoResultAndClear(interactionId);
if (mAccessibilityManager != null
&& mAccessibilityManager.isAccessibilityTracingEnabled()) {
logTrace(connection, "findAccessibilityNodeInfoByAccessibilityId",
- "InteractionId:" + interactionId + ";Result: " + infos
- + ";connectionId=" + connectionId + ";accessibilityWindowId="
- + accessibilityWindowId + ";accessibilityNodeId="
- + accessibilityNodeId + ";bypassCache=" + bypassCache
- + ";prefetchFlags=" + prefetchFlags + ";arguments=" + arguments);
+ "InteractionId:" + interactionId + ";Result: " + info
+ + ";connectionId=" + connectionId
+ + ";accessibilityWindowId="
+ + accessibilityWindowId + ";accessibilityNodeId="
+ + accessibilityNodeId + ";bypassCache=" + bypassCache
+ + ";prefetchFlags=" + prefetchFlags
+ + ";arguments=" + arguments);
}
- finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
+ if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_MASK) != 0
+ && info != null) {
+ setInteractionWaitingForPrefetchResult(interactionId, connectionId,
+ packageNames);
+ }
+ finalizeAndCacheAccessibilityNodeInfo(info, connectionId,
bypassCache, packageNames);
- if (infos != null && !infos.isEmpty()) {
- for (int i = 1; i < infos.size(); i++) {
- infos.get(i).recycle();
- }
- return infos.get(0);
- }
+ return info;
}
} else {
if (DEBUG) {
@@ -526,6 +532,15 @@
return null;
}
+ private void setInteractionWaitingForPrefetchResult(int interactionId, int connectionId,
+ String[] packageNames) {
+ synchronized (mInstanceLock) {
+ mInteractionIdWaitingForPrefetchResult = interactionId;
+ mConnectionIdWaitingForPrefetchResult = connectionId;
+ mPackageNamesForNextPrefetchResult = packageNames;
+ }
+ }
+
private static String idToString(int accessibilityWindowId, long accessibilityNodeId) {
return accessibilityWindowId + "/"
+ AccessibilityNodeInfo.idToString(accessibilityNodeId);
@@ -924,6 +939,46 @@
}
/**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setPrefetchAccessibilityNodeInfoResult(@NonNull List<AccessibilityNodeInfo> infos,
+ int interactionId) {
+ int interactionIdWaitingForPrefetchResultCopy = -1;
+ int connectionIdWaitingForPrefetchResultCopy = -1;
+ String[] packageNamesForNextPrefetchResultCopy = null;
+
+ if (infos.isEmpty()) {
+ return;
+ }
+
+ synchronized (mInstanceLock) {
+ if (mInteractionIdWaitingForPrefetchResult == interactionId) {
+ interactionIdWaitingForPrefetchResultCopy = mInteractionIdWaitingForPrefetchResult;
+ connectionIdWaitingForPrefetchResultCopy =
+ mConnectionIdWaitingForPrefetchResult;
+ if (mPackageNamesForNextPrefetchResult != null) {
+ packageNamesForNextPrefetchResultCopy =
+ new String[mPackageNamesForNextPrefetchResult.length];
+ for (int i = 0; i < mPackageNamesForNextPrefetchResult.length; i++) {
+ packageNamesForNextPrefetchResultCopy[i] =
+ mPackageNamesForNextPrefetchResult[i];
+ }
+ }
+ }
+ }
+
+ if (interactionIdWaitingForPrefetchResultCopy == interactionId) {
+ finalizeAndCacheAccessibilityNodeInfos(
+ infos, connectionIdWaitingForPrefetchResultCopy, false,
+ packageNamesForNextPrefetchResultCopy);
+ } else if (DEBUG) {
+ Log.w(LOG_TAG, "Prefetching for interaction with id " + interactionId + " dropped "
+ + infos.size() + " nodes");
+ }
+ }
+
+ /**
* Gets the result of a request to perform an accessibility action.
*
* @param interactionId The interaction id to match the result with the request.
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
index 049bb31..231e75a 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
@@ -47,6 +47,15 @@
int interactionId);
/**
+ * Sets the result of a prefetch request that returns {@link AccessibilityNodeInfo}s.
+ *
+ * @param root The {@link AccessibilityNodeInfo} for which the prefetching is based off of.
+ * @param infos The result {@link AccessibilityNodeInfo}s.
+ */
+ void setPrefetchAccessibilityNodeInfoResult(
+ in List<AccessibilityNodeInfo> infos, int interactionId);
+
+ /**
* Sets the result of a request to perform an accessibility action.
*
* @param Whether the action was performed.
diff --git a/core/java/android/view/translation/TranslationManager.java b/core/java/android/view/translation/TranslationManager.java
index b89488b..b61eab9 100644
--- a/core/java/android/view/translation/TranslationManager.java
+++ b/core/java/android/view/translation/TranslationManager.java
@@ -18,12 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.RequiresFeature;
import android.annotation.SystemService;
import android.annotation.WorkerThread;
import android.app.PendingIntent;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
@@ -53,7 +51,6 @@
* the server {@link android.service.translation.TranslationService} </p>
*/
@SystemService(Context.TRANSLATION_MANAGER_SERVICE)
-@RequiresFeature(PackageManager.FEATURE_TRANSLATION)
public final class TranslationManager {
private static final String TAG = "TranslationManager";
diff --git a/core/java/android/view/translation/UiTranslationController.java b/core/java/android/view/translation/UiTranslationController.java
index 53e354f..f4fdf35 100644
--- a/core/java/android/view/translation/UiTranslationController.java
+++ b/core/java/android/view/translation/UiTranslationController.java
@@ -388,7 +388,7 @@
private void sendTranslationRequest(Translator translator,
List<ViewTranslationRequest> requests) {
if (requests.size() == 0) {
- Log.wtf(TAG, "No ViewTranslationRequest was collected.");
+ Log.w(TAG, "No ViewTranslationRequest was collected.");
return;
}
final TranslationRequest request = new TranslationRequest.Builder()
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 94a0790..eb16cef 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -6425,6 +6425,7 @@
if (lp != null && mRecycler.shouldRecycleViewType(lp.viewType)) {
views.add(child);
child.setAccessibilityDelegate(null);
+ child.resetSubtreeAutofillIds();
if (listener != null) {
// Pretend they went through the scrap heap
listener.onMovedToScrapHeap(child);
@@ -7365,10 +7366,12 @@
private void clearScrapForRebind(View view) {
view.clearAccessibilityFocus();
view.setAccessibilityDelegate(null);
+ view.resetSubtreeAutofillIds();
}
private void removeDetachedView(View child, boolean animate) {
child.setAccessibilityDelegate(null);
+ child.resetSubtreeAutofillIds();
AbsListView.this.removeDetachedView(child, animate);
}
}
diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java
index 42d7535..9eebf06 100644
--- a/core/java/android/widget/AnalogClock.java
+++ b/core/java/android/widget/AnalogClock.java
@@ -212,6 +212,9 @@
mDial = icon.loadDrawable(getContext());
mDialWidth = mDial.getIntrinsicWidth();
mDialHeight = mDial.getIntrinsicHeight();
+ if (mDialTintInfo.mHasTintList || mDialTintInfo.mHasTintBlendMode) {
+ mDial = mDialTintInfo.apply(mDial);
+ }
mChanged = true;
invalidate();
@@ -283,6 +286,9 @@
@RemotableViewMethod
public void setHourHand(@NonNull Icon icon) {
mHourHand = icon.loadDrawable(getContext());
+ if (mHourHandTintInfo.mHasTintList || mHourHandTintInfo.mHasTintBlendMode) {
+ mHourHand = mHourHandTintInfo.apply(mHourHand);
+ }
mChanged = true;
invalidate();
@@ -357,6 +363,9 @@
@RemotableViewMethod
public void setMinuteHand(@NonNull Icon icon) {
mMinuteHand = icon.loadDrawable(getContext());
+ if (mMinuteHandTintInfo.mHasTintList || mMinuteHandTintInfo.mHasTintBlendMode) {
+ mMinuteHand = mMinuteHandTintInfo.apply(mMinuteHand);
+ }
mChanged = true;
invalidate();
@@ -434,6 +443,9 @@
@RemotableViewMethod
public void setSecondHand(@Nullable Icon icon) {
mSecondHand = icon == null ? null : icon.loadDrawable(getContext());
+ if (mSecondHandTintInfo.mHasTintList || mSecondHandTintInfo.mHasTintBlendMode) {
+ mSecondHand = mSecondHandTintInfo.apply(mSecondHand);
+ }
mSecondsTick.run();
mChanged = true;
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index ae426d2..50fca04 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -626,20 +626,14 @@
// assume rotations of increments of 90 degrees
float x = mTmpPoints[10] - mTmpPoints[8];
float width = right - left;
- float vecX = 0f;
- if (width > 0) {
- vecX = dampStretchVector(Math.max(-1f, Math.min(1f, x / width)));
- }
+ float vecX = dampStretchVector(Math.max(-1f, Math.min(1f, x / width)));
float y = mTmpPoints[11] - mTmpPoints[9];
float height = bottom - top;
- float vecY = 0f;
- if (height > 0) {
- vecY = dampStretchVector(Math.max(-1f, Math.min(1f, y / height)));
- }
+ float vecY = dampStretchVector(Math.max(-1f, Math.min(1f, y / height)));
- boolean hasStretchVectors = Float.compare(vecX, 0) != 0 || Float.compare(vecY, 0) != 0;
- if (right > left && bottom > top && mWidth > 0 && mHeight > 0 && hasStretchVectors) {
+ boolean hasValidVectors = Float.isFinite(vecX) && Float.isFinite(vecY);
+ if (right > left && bottom > top && mWidth > 0 && mHeight > 0 && hasValidVectors) {
renderNode.stretch(
left,
top,
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 48e25c51..166411e 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -6635,7 +6635,9 @@
}
updateSelection(event);
- if (mTextView.hasSelection() && mEndHandle != null) {
+ if (mTextView.hasSelection() && mEndHandle != null &&
+ isDragAcceleratorActive()
+ ) {
mEndHandle.updateMagnifier(event);
}
break;
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 23915e0..105c714 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -762,11 +762,11 @@
if (canOverscroll) {
int consumed = 0;
if (deltaX < 0 && mEdgeGlowRight.getDistance() != 0f) {
- consumed = Math.round(getHeight()
+ consumed = Math.round(getWidth()
* mEdgeGlowRight.onPullDistance((float) deltaX / getWidth(),
displacement));
} else if (deltaX > 0 && mEdgeGlowLeft.getDistance() != 0f) {
- consumed = Math.round(-getHeight()
+ consumed = Math.round(-getWidth()
* mEdgeGlowLeft.onPullDistance((float) -deltaX / getWidth(),
1 - displacement));
}
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index c72eed4..18dd799 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -30,6 +30,7 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.BLASTBufferQueue;
import android.graphics.Insets;
import android.graphics.Outline;
import android.graphics.Paint;
@@ -938,6 +939,7 @@
// The surface we allocate for the magnifier content + shadow.
private final SurfaceSession mSurfaceSession;
private final SurfaceControl mSurfaceControl;
+ private final BLASTBufferQueue mBBQ;
private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
private final Surface mSurface;
// The renderer used for the allocated surface.
@@ -1004,15 +1006,15 @@
final int surfaceHeight = mContentHeight + 2 * mOffsetY;
mSurfaceSession = new SurfaceSession();
mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
- .setFormat(PixelFormat.TRANSLUCENT)
- .setBufferSize(surfaceWidth, surfaceHeight)
.setName("magnifier surface")
.setFlags(SurfaceControl.HIDDEN)
+ .setBLASTLayer()
.setParent(parentSurfaceControl)
.setCallsite("InternalPopupWindow")
.build();
- mSurface = new Surface();
- mSurface.copyFrom(mSurfaceControl);
+ mBBQ = new BLASTBufferQueue("magnifier surface", mSurfaceControl,
+ surfaceWidth, surfaceHeight, PixelFormat.TRANSLUCENT);
+ mSurface = mBBQ.createSurface();
// Setup the RenderNode tree. The root has two children, one containing the bitmap
// and one containing the overlay. We use a separate render node for the overlay
@@ -1071,9 +1073,8 @@
}
if (mContentHeight < contentHeight) {
// Grows the surface height as necessary.
- new SurfaceControl.Transaction().setBufferSize(
- mSurfaceControl, mContentWidth, contentHeight).apply();
- mSurface.copyFrom(mSurfaceControl);
+ mBBQ.update(mSurfaceControl, mContentWidth, contentHeight,
+ PixelFormat.TRANSLUCENT);
mRenderer.setSurface(mSurface);
final Outline outline = new Outline();
@@ -1268,6 +1269,7 @@
// Destroy the renderer. This will not proceed until pending frame callbacks complete.
mRenderer.destroy();
mSurface.destroy();
+ mBBQ.destroy();
new SurfaceControl.Transaction().remove(mSurfaceControl).apply();
mSurfaceSession.kill();
mHandler.removeCallbacks(mMagnifierUpdater);
@@ -1334,9 +1336,6 @@
if (!mSurface.isValid()) {
return;
}
- // Show or move the window at the content draw frame.
- mTransaction.deferTransactionUntil(mSurfaceControl, mSurfaceControl,
- frame);
if (updateWindowPosition) {
mTransaction.setPosition(mSurfaceControl, pendingX, pendingY);
}
@@ -1345,7 +1344,8 @@
.show(mSurfaceControl);
}
- mTransaction.apply();
+ // Show or move the window at the content draw frame.
+ mBBQ.mergeWithNextTransaction(mTransaction, frame);
};
if (!mIsFishEyeStyle) {
// The new style magnifier doesn't need the light/shadow.
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index f49aa74..b13cfc0 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.annotation.ColorRes;
import android.annotation.DimenRes;
@@ -228,6 +229,7 @@
private static final int SET_ON_CHECKED_CHANGE_RESPONSE_TAG = 29;
private static final int NIGHT_MODE_REFLECTION_ACTION_TAG = 30;
private static final int SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG = 31;
+ private static final int ATTRIBUTE_REFLECTION_ACTION_TAG = 32;
/** @hide **/
@IntDef(prefix = "MARGIN_", value = {
@@ -253,6 +255,19 @@
/** The value will apply to the marginEnd. */
public static final int MARGIN_END = 5;
+ @IntDef(prefix = "VALUE_TYPE_", value = {
+ VALUE_TYPE_RAW,
+ VALUE_TYPE_COMPLEX_UNIT,
+ VALUE_TYPE_RESOURCE,
+ VALUE_TYPE_ATTRIBUTE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface ValueType {}
+ static final int VALUE_TYPE_RAW = 1;
+ static final int VALUE_TYPE_COMPLEX_UNIT = 2;
+ static final int VALUE_TYPE_RESOURCE = 3;
+ static final int VALUE_TYPE_ATTRIBUTE = 4;
+
/** @hide **/
@IntDef(flag = true, value = {
FLAG_REAPPLY_DISALLOWED,
@@ -1918,6 +1933,88 @@
}
}
+ private final class AttributeReflectionAction extends BaseReflectionAction {
+
+ static final int DIMEN_RESOURCE = 1;
+ static final int COLOR_RESOURCE = 2;
+ static final int STRING_RESOURCE = 3;
+
+ private final int mResourceType;
+ private final int mAttrId;
+
+ AttributeReflectionAction(@IdRes int viewId, String methodName, int parameterType,
+ int resourceType, int attrId) {
+ super(viewId, methodName, parameterType);
+ this.mResourceType = resourceType;
+ this.mAttrId = attrId;
+ }
+
+ AttributeReflectionAction(Parcel in) {
+ super(in);
+ this.mResourceType = in.readInt();
+ this.mAttrId = in.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(this.mResourceType);
+ dest.writeInt(this.mAttrId);
+ }
+
+ @Override
+ protected @NonNull Object getParameterValue(View view) throws ActionException {
+ try {
+ TypedArray typedArray = view.getContext().obtainStyledAttributes(
+ new int[]{this.mAttrId});
+ try {
+ if (typedArray.getType(0) == TypedValue.TYPE_NULL) {
+ throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId)
+ + " is not defined");
+ }
+ switch (this.mResourceType) {
+ case DIMEN_RESOURCE:
+ if (this.type == BaseReflectionAction.INT) {
+ return typedArray.getDimensionPixelSize(0, 0);
+ }
+ return typedArray.getDimension(0, 0);
+ case COLOR_RESOURCE:
+ switch (this.type) {
+ case BaseReflectionAction.INT:
+ return typedArray.getColor(0, 0);
+ case BaseReflectionAction.COLOR_STATE_LIST:
+ return typedArray.getColorStateList(0);
+ default:
+ throw new ActionException(
+ "Color attribute 0x" + Integer.toHexString(this.mAttrId)
+ + " must be used as int or ColorStateList");
+ }
+ case STRING_RESOURCE:
+ String value = typedArray.getString(0);
+ if (value == null) {
+ throw new ActionException("Attribute 0x"
+ + Integer.toHexString(this.mAttrId)
+ + " is not a defined or is not a string");
+ }
+ return value;
+ default:
+ // Note: This can only be an implementation error.
+ throw new ActionException(
+ "Unknown resource type: " + this.mResourceType);
+ }
+ } finally {
+ typedArray.recycle();
+ }
+ } catch (Throwable t) {
+ throw new ActionException(t);
+ }
+ }
+
+ @Override
+ public int getActionTag() {
+ return ATTRIBUTE_REFLECTION_ACTION_TAG;
+ }
+ }
private final class ComplexUnitDimensionReflectionAction extends BaseReflectionAction {
private final float mValue;
@@ -2792,7 +2889,7 @@
static final int LAYOUT_HEIGHT = 9;
final int mProperty;
- final boolean mIsDimen;
+ final int mValueType;
final int mValue;
/**
@@ -2805,33 +2902,36 @@
@ComplexDimensionUnit int units) {
this.viewId = viewId;
this.mProperty = property;
- this.mIsDimen = false;
+ this.mValueType = VALUE_TYPE_COMPLEX_UNIT;
this.mValue = TypedValue.createComplexDimension(value, units);
}
/**
* @param viewId ID of the view alter
* @param property which layout parameter to alter
- * @param dimen new dimension with the value of the layout parameter
+ * @param value value to set.
+ * @param valueType must be one of {@link #VALUE_TYPE_COMPLEX_UNIT},
+ * {@link #VALUE_TYPE_RESOURCE}, {@link #VALUE_TYPE_ATTRIBUTE} or
+ * {@link #VALUE_TYPE_RAW}.
*/
- LayoutParamAction(@IdRes int viewId, int property, @DimenRes int dimen) {
+ LayoutParamAction(@IdRes int viewId, int property, int value, @ValueType int valueType) {
this.viewId = viewId;
this.mProperty = property;
- this.mIsDimen = true;
- this.mValue = dimen;
+ this.mValueType = valueType;
+ this.mValue = value;
}
public LayoutParamAction(Parcel parcel) {
viewId = parcel.readInt();
mProperty = parcel.readInt();
- mIsDimen = parcel.readBoolean();
+ mValueType = parcel.readInt();
mValue = parcel.readInt();
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(viewId);
dest.writeInt(mProperty);
- dest.writeBoolean(mIsDimen);
+ dest.writeInt(mValueType);
dest.writeInt(mValue);
}
@@ -2897,25 +2997,57 @@
}
private int getPixelOffset(View target) {
- if (mIsDimen) {
- if (mValue == 0) {
- return 0;
+ try {
+ switch (mValueType) {
+ case VALUE_TYPE_ATTRIBUTE:
+ TypedArray typedArray = target.getContext().obtainStyledAttributes(
+ new int[]{this.mValue});
+ try {
+ return typedArray.getDimensionPixelOffset(0, 0);
+ } finally {
+ typedArray.recycle();
+ }
+ case VALUE_TYPE_RESOURCE:
+ if (mValue == 0) {
+ return 0;
+ }
+ return target.getResources().getDimensionPixelOffset(mValue);
+ case VALUE_TYPE_COMPLEX_UNIT:
+ return TypedValue.complexToDimensionPixelOffset(mValue,
+ target.getResources().getDisplayMetrics());
+ default:
+ return mValue;
}
- return target.getResources().getDimensionPixelOffset(mValue);
+ } catch (Throwable t) {
+ throw new ActionException(t);
}
- return TypedValue.complexToDimensionPixelOffset(mValue,
- target.getResources().getDisplayMetrics());
}
private int getPixelSize(View target) {
- if (mIsDimen) {
- if (mValue == 0) {
- return 0;
+ try {
+ switch (mValueType) {
+ case VALUE_TYPE_ATTRIBUTE:
+ TypedArray typedArray = target.getContext().obtainStyledAttributes(
+ new int[]{this.mValue});
+ try {
+ return typedArray.getDimensionPixelSize(0, 0);
+ } finally {
+ typedArray.recycle();
+ }
+ case VALUE_TYPE_RESOURCE:
+ if (mValue == 0) {
+ return 0;
+ }
+ return target.getResources().getDimensionPixelSize(mValue);
+ case VALUE_TYPE_COMPLEX_UNIT:
+ return TypedValue.complexToDimensionPixelSize(mValue,
+ target.getResources().getDisplayMetrics());
+ default:
+ return mValue;
}
- return target.getResources().getDimensionPixelSize(mValue);
+ } catch (Throwable t) {
+ throw new ActionException(t);
}
- return TypedValue.complexToDimensionPixelSize(mValue,
- target.getResources().getDisplayMetrics());
}
@Override
@@ -3170,33 +3302,35 @@
private static class SetViewOutlinePreferredRadiusAction extends Action {
- private final boolean mIsDimen;
+ @ValueType
+ private final int mValueType;
private final int mValue;
- SetViewOutlinePreferredRadiusAction(@IdRes int viewId, @DimenRes int dimenResId) {
+ SetViewOutlinePreferredRadiusAction(@IdRes int viewId, int value,
+ @ValueType int valueType) {
this.viewId = viewId;
- this.mIsDimen = true;
- this.mValue = dimenResId;
+ this.mValueType = valueType;
+ this.mValue = value;
}
SetViewOutlinePreferredRadiusAction(
@IdRes int viewId, float radius, @ComplexDimensionUnit int units) {
this.viewId = viewId;
- this.mIsDimen = false;
+ this.mValueType = VALUE_TYPE_COMPLEX_UNIT;
this.mValue = TypedValue.createComplexDimension(radius, units);
}
SetViewOutlinePreferredRadiusAction(Parcel in) {
viewId = in.readInt();
- mIsDimen = in.readBoolean();
+ mValueType = in.readInt();
mValue = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(viewId);
- dest.writeBoolean(mIsDimen);
+ dest.writeInt(mValueType);
dest.writeInt(mValue);
}
@@ -3206,14 +3340,32 @@
final View target = root.findViewById(viewId);
if (target == null) return;
- float radius;
- if (mIsDimen) {
- radius = mValue == 0 ? 0 : target.getResources().getDimension(mValue);
- } else {
- radius = TypedValue.complexToDimensionPixelSize(mValue,
- target.getResources().getDisplayMetrics());
+ try {
+ float radius;
+ switch (mValueType) {
+ case VALUE_TYPE_ATTRIBUTE:
+ TypedArray typedArray = target.getContext().obtainStyledAttributes(
+ new int[]{mValue});
+ try {
+ radius = typedArray.getDimension(0, 0);
+ } finally {
+ typedArray.recycle();
+ }
+ break;
+ case VALUE_TYPE_RESOURCE:
+ radius = mValue == 0 ? 0 : target.getResources().getDimension(mValue);
+ break;
+ case VALUE_TYPE_COMPLEX_UNIT:
+ radius = TypedValue.complexToDimension(mValue,
+ target.getResources().getDisplayMetrics());
+ break;
+ default:
+ radius = mValue;
+ }
+ target.setOutlineProvider(new RemoteViewOutlineProvider(radius));
+ } catch (Throwable t) {
+ throw new ActionException(t);
}
- target.setOutlineProvider(new RemoteViewOutlineProvider(radius));
}
@Override
@@ -3613,6 +3765,8 @@
return new NightModeReflectionAction(parcel);
case SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG:
return new SetRemoteCollectionItemListAdapterAction(parcel);
+ case ATTRIBUTE_REFLECTION_ACTION_TAG:
+ return new AttributeReflectionAction(parcel);
default:
throw new ActionException("Tag " + tag + " not found");
}
@@ -4348,7 +4502,20 @@
*/
public void setViewLayoutMarginDimen(@IdRes int viewId, @MarginType int type,
@DimenRes int dimen) {
- addAction(new LayoutParamAction(viewId, type, dimen));
+ addAction(new LayoutParamAction(viewId, type, dimen, VALUE_TYPE_RESOURCE));
+ }
+
+ /**
+ * Equivalent to calling {@link MarginLayoutParams#setMarginEnd}.
+ * Only works if the {@link View#getLayoutParams()} supports margins.
+ *
+ * @param viewId The id of the view to change
+ * @param type The margin being set e.g. {@link #MARGIN_END}
+ * @param attr a dimension attribute to apply to the margin.
+ */
+ public void setViewLayoutMarginAttr(@IdRes int viewId, @MarginType int type,
+ @AttrRes int attr) {
+ addAction(new LayoutParamAction(viewId, type, attr, VALUE_TYPE_ATTRIBUTE));
}
/**
@@ -4393,7 +4560,19 @@
* @param widthDimen the dimension resource for the view's width
*/
public void setViewLayoutWidthDimen(@IdRes int viewId, @DimenRes int widthDimen) {
- addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen));
+ addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen,
+ VALUE_TYPE_RESOURCE));
+ }
+
+ /**
+ * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#width} with
+ * the value of the given attribute in the current theme.
+ *
+ * @param widthAttr the dimension attribute for the view's width
+ */
+ public void setViewLayoutWidthAttr(@IdRes int viewId, @AttrRes int widthAttr) {
+ addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthAttr,
+ VALUE_TYPE_ATTRIBUTE));
}
/**
@@ -4420,7 +4599,19 @@
* @param heightDimen a dimen resource to read the height from.
*/
public void setViewLayoutHeightDimen(@IdRes int viewId, @DimenRes int heightDimen) {
- addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen));
+ addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen,
+ VALUE_TYPE_RESOURCE));
+ }
+
+ /**
+ * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#height} with
+ * the value of the given attribute in the current theme.
+ *
+ * @param heightAttr a dimen attribute to read the height from.
+ */
+ public void setViewLayoutHeightAttr(@IdRes int viewId, @AttrRes int heightAttr) {
+ addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightAttr,
+ VALUE_TYPE_ATTRIBUTE));
}
/**
@@ -4441,7 +4632,15 @@
* {@code resId}.
*/
public void setViewOutlinePreferredRadiusDimen(@IdRes int viewId, @DimenRes int resId) {
- addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId));
+ addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId, VALUE_TYPE_RESOURCE));
+ }
+
+ /**
+ * Sets an OutlineProvider on the view whose corner radius is a dimension attribute with
+ * {@code attrId}.
+ */
+ public void setViewOutlinePreferredRadiusAttr(@IdRes int viewId, @AttrRes int attrId) {
+ addAction(new SetViewOutlinePreferredRadiusAction(viewId, attrId, VALUE_TYPE_ATTRIBUTE));
}
/**
@@ -4523,6 +4722,23 @@
}
/**
+ * Call a method taking one int, a size in pixels, on a view in the layout for this
+ * RemoteViews.
+ *
+ * The dimension will be resolved from the theme attribute at the time the
+ * {@link RemoteViews} is (re-)applied.
+ *
+ * @param viewId The id of the view on which to call the method.
+ * @param methodName The name of the method to call.
+ * @param dimenAttr The attribute to resolve and pass as argument to the method.
+ */
+ public void setIntDimenAttr(@IdRes int viewId, @NonNull String methodName,
+ @AttrRes int dimenAttr) {
+ addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT,
+ ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr));
+ }
+
+ /**
* Call a method taking one int, a color, on a view in the layout for this RemoteViews.
*
* The Color will be resolved from the resources at the time the {@link RemoteViews} is (re-)
@@ -4541,6 +4757,22 @@
/**
* Call a method taking one int, a color, on a view in the layout for this RemoteViews.
*
+ * The Color will be resolved from the theme attribute at the time the {@link RemoteViews} is
+ * (re-)applied.
+ *
+ * @param viewId The id of the view on which to call the method.
+ * @param methodName The name of the method to call.
+ * @param colorAttribute The theme attribute to resolve and pass as argument to the method.
+ */
+ public void setColorAttr(@IdRes int viewId, @NonNull String methodName,
+ @AttrRes int colorAttribute) {
+ addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT,
+ AttributeReflectionAction.COLOR_RESOURCE, colorAttribute));
+ }
+
+ /**
+ * Call a method taking one int, a color, on a view in the layout for this RemoteViews.
+ *
* @param viewId The id of the view on which to call the method.
* @param methodName The name of the method to call.
* @param notNight The value to pass to the method when the view's configuration is set to
@@ -4618,6 +4850,23 @@
}
/**
+ * Call a method taking one ColorStateList on a view in the layout for this RemoteViews.
+ *
+ * The ColorStateList will be resolved from the theme attribute at the time the
+ * {@link RemoteViews} is (re-)applied.
+ *
+ * @param viewId The id of the view on which to call the method.
+ * @param methodName The name of the method to call.
+ * @param colorAttr The theme attribute to resolve and pass as argument to the method.
+ */
+ public void setColorStateListAttr(@IdRes int viewId, @NonNull String methodName,
+ @AttrRes int colorAttr) {
+ addAction(new AttributeReflectionAction(viewId, methodName,
+ BaseReflectionAction.COLOR_STATE_LIST, ResourceReflectionAction.COLOR_RESOURCE,
+ colorAttr));
+ }
+
+ /**
* Call a method taking one long on a view in the layout for this RemoteViews.
*
* @param viewId The id of the view on which to call the method.
@@ -4676,6 +4925,23 @@
}
/**
+ * Call a method taking one float, a size in pixels, on a view in the layout for this
+ * RemoteViews.
+ *
+ * The dimension will be resolved from the theme attribute at the time the {@link RemoteViews}
+ * is (re-)applied.
+ *
+ * @param viewId The id of the view on which to call the method.
+ * @param methodName The name of the method to call.
+ * @param dimenAttr The attribute to resolve and pass as argument to the method.
+ */
+ public void setFloatDimenAttr(@IdRes int viewId, @NonNull String methodName,
+ @AttrRes int dimenAttr) {
+ addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.FLOAT,
+ ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr));
+ }
+
+ /**
* Call a method taking one double on a view in the layout for this RemoteViews.
*
* @param viewId The id of the view on which to call the method.
@@ -4738,6 +5004,24 @@
}
/**
+ * Call a method taking one CharSequence on a view in the layout for this RemoteViews.
+ *
+ * The CharSequence will be resolved from the theme attribute at the time the
+ * {@link RemoteViews} is (re-)applied.
+ *
+ * @param viewId The id of the view on which to call the method.
+ * @param methodName The name of the method to call.
+ * @param stringAttribute The attribute to resolve and pass as argument to the method.
+ */
+ public void setCharSequenceAttr(@IdRes int viewId, @NonNull String methodName,
+ @AttrRes int stringAttribute) {
+ addAction(
+ new AttributeReflectionAction(viewId, methodName,
+ BaseReflectionAction.CHAR_SEQUENCE,
+ AttributeReflectionAction.STRING_RESOURCE, stringAttribute));
+ }
+
+ /**
* Call a method taking one Uri on a view in the layout for this RemoteViews.
*
* @param viewId The id of the view on which to call the method.
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 3b35b6df..f151527 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -23,6 +23,7 @@
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.view.WindowManager.transitTypeToString;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -205,7 +206,7 @@
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append("{t=" + mType + " f=" + Integer.toHexString(mFlags)
+ sb.append("{t=" + transitTypeToString(mType) + " f=" + Integer.toHexString(mFlags)
+ " ro=" + mRootOffset + " c=[");
for (int i = 0; i < mChanges.size(); ++i) {
if (i > 0) {
diff --git a/core/java/android/window/WindowContext.java b/core/java/android/window/WindowContext.java
index 375f4cf..901625b 100644
--- a/core/java/android/window/WindowContext.java
+++ b/core/java/android/window/WindowContext.java
@@ -57,6 +57,8 @@
*
* @param base Base {@link Context} for this new instance.
* @param type Window type to be used with this context.
+ * @param options A bundle used to pass window-related options.
+ *
* @hide
*/
public WindowContext(@NonNull Context base, int type, @Nullable Bundle options) {
@@ -72,11 +74,12 @@
}
/**
- * Registers this {@link WindowContext} with {@link com.android.server.wm.WindowManagerService}
- * to receive configuration changes of the associated {@link WindowManager} node.
+ * Attaches this {@link WindowContext} to the {@link com.android.server.wm.DisplayArea}
+ * specified by {@code mType}, {@link #getDisplayId() display ID} and {@code mOptions}
+ * to receive configuration changes.
*/
- public void registerWithServer() {
- mController.registerListener(mType, getDisplayId(), mOptions);
+ public void attachToDisplayArea() {
+ mController.attachToDisplayArea(mType, getDisplayId(), mOptions);
}
@Override
@@ -96,7 +99,7 @@
/** Used for test to invoke because we can't invoke finalize directly. */
@VisibleForTesting
public void release() {
- mController.unregisterListenerIfNeeded();
+ mController.detachIfNeeded();
destroy();
}
diff --git a/core/java/android/window/WindowContextController.java b/core/java/android/window/WindowContextController.java
index 6143414..88584f4 100644
--- a/core/java/android/window/WindowContextController.java
+++ b/core/java/android/window/WindowContextController.java
@@ -29,22 +29,29 @@
import com.android.internal.annotations.VisibleForTesting;
/**
- * The controller to manage {@link WindowContext} listener, such as registering and unregistering
- * the listener.
+ * The controller to manage {@link WindowContext}, such as attaching to a window manager node or
+ * detaching from the current attached node. The user must call
+ * {@link #attachToDisplayArea(int, int, Bundle)}, call {@link #attachToWindowToken(IBinder)}
+ * after that if necessary, and then call {@link #detachIfNeeded()} for release.
*
* @hide
*/
public class WindowContextController {
private final IWindowManager mWms;
+ /**
+ * {@code true} to indicate that the {@code mToken} is associated with a
+ * {@link com.android.server.wm.DisplayArea}. Note that {@code mToken} is able to attach a
+ * WindowToken after this flag sets to {@code true}.
+ */
@VisibleForTesting
- public boolean mListenerRegistered;
+ public boolean mAttachedToDisplayArea;
@NonNull
private final IBinder mToken;
/**
* Window Context Controller constructor
*
- * @param token The token to register to the window context listener. It is usually from
+ * @param token The token used to attach to a window manager node. It is usually from
* {@link Context#getWindowContextToken()}.
*/
public WindowContextController(@NonNull IBinder token) {
@@ -60,19 +67,21 @@
}
/**
- * Registers the {@code mToken} to the window context listener.
+ * Attaches the {@code mToken} to a {@link com.android.server.wm.DisplayArea}.
*
* @param type The window type of the {@link WindowContext}
* @param displayId The {@link Context#getDisplayId() ID of display} to associate with
* @param options The window context launched option
+ * @throws IllegalStateException if the {@code mToken} has already been attached to a
+ * DisplayArea.
*/
- public void registerListener(@WindowType int type, int displayId, @Nullable Bundle options) {
- if (mListenerRegistered) {
- throw new UnsupportedOperationException("A Window Context can only register a listener"
- + " once.");
+ public void attachToDisplayArea(@WindowType int type, int displayId, @Nullable Bundle options) {
+ if (mAttachedToDisplayArea) {
+ throw new IllegalStateException("A Window Context can be only attached to "
+ + "a DisplayArea once.");
}
try {
- mListenerRegistered = mWms.registerWindowContextListener(mToken, type, displayId,
+ mAttachedToDisplayArea = mWms.attachWindowContextToDisplayArea(mToken, type, displayId,
options);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -80,14 +89,42 @@
}
/**
- * Unregisters the window context listener associated with the {@code mToken} if it has been
- * registered.
+ * Switches to attach the window context to a window token.
+ * <p>
+ * Note that the context should have been attached to a
+ * {@link com.android.server.wm.DisplayArea} by {@link #attachToDisplayArea(int, int, Bundle)}
+ * before attaching to a window token, and the window token's type must match the window
+ * context's type.
+ * </p><p>
+ * A {@link WindowContext} can only attach to a specific window manager node, which is either a
+ * {@link com.android.server.wm.DisplayArea} by calling
+ * {@link #attachToDisplayArea(int, int, Bundle)} or the latest attached {@code windowToken}
+ * although this API is allowed to be called multiple times.
+ * </p>
+ * @throws IllegalStateException if the {@code mClientToken} has not yet attached to
+ * a {@link com.android.server.wm.DisplayArea} by
+ * {@link #attachToDisplayArea(int, int, Bundle)}.
+ *
+ * @see IWindowManager#attachWindowContextToWindowToken(IBinder, IBinder)
*/
- public void unregisterListenerIfNeeded() {
- if (mListenerRegistered) {
+ public void attachToWindowToken(IBinder windowToken) {
+ if (!mAttachedToDisplayArea) {
+ throw new IllegalStateException("The Window Context should have been attached"
+ + " to a DisplayArea.");
+ }
+ try {
+ mWms.attachWindowContextToWindowToken(mToken, windowToken);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** Detaches the window context from the node it's currently associated with. */
+ public void detachIfNeeded() {
+ if (mAttachedToDisplayArea) {
try {
- mWms.unregisterWindowContextListener(mToken);
- mListenerRegistered = false;
+ mWms.detachWindowContextFromWindowContainer(mToken);
+ mAttachedToDisplayArea = false;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/com/android/internal/os/BinderLatencyBuckets.java b/core/java/com/android/internal/os/BinderLatencyBuckets.java
new file mode 100644
index 0000000..d7d2d6a
--- /dev/null
+++ b/core/java/com/android/internal/os/BinderLatencyBuckets.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.Arrays;
+
+/**
+ * Generates the bucket thresholds (with a custom logarithmic scale) for a histogram to store
+ * latency samples in.
+ */
+public class BinderLatencyBuckets {
+ private static final String TAG = "BinderLatencyBuckets";
+ private final int[] mBuckets;
+
+ /**
+ * @param bucketCount the number of buckets the histogram should have
+ * @param firstBucketSize the size of the first bucket (used to avoid excessive small buckets)
+ * @param scaleFactor the rate in which each consecutive bucket increases (before rounding)
+ */
+ public BinderLatencyBuckets(int bucketCount, int firstBucketSize, float scaleFactor) {
+ int[] buffer = new int[bucketCount - 1];
+ buffer[0] = firstBucketSize;
+
+ // Last value and the target are disjoint as we never want to create buckets smaller than 1.
+ double lastTarget = firstBucketSize;
+
+ // First bucket is already created and the last bucket is anything greater than the final
+ // bucket in the list, so create 'bucketCount' - 2 buckets.
+ for (int i = 1; i < bucketCount - 1; i++) {
+ // Increase the target bucket limit value by the scale factor.
+ double nextTarget = lastTarget * scaleFactor;
+
+ if (nextTarget > Integer.MAX_VALUE) {
+ // Do not throw an exception here as this should not affect binder calls.
+ Slog.w(TAG, "Attempted to create a bucket larger than maxint");
+ mBuckets = Arrays.copyOfRange(buffer, 0, i);
+ return;
+ }
+
+ if ((int) nextTarget > buffer[i - 1]) {
+ // Convert the target bucket limit value to an integer.
+ buffer[i] = (int) nextTarget;
+ } else {
+ // Avoid creating redundant buckets, so bucket size should be 1 at a minimum.
+ buffer[i] = buffer[i - 1] + 1;
+ }
+ lastTarget = nextTarget;
+ }
+ mBuckets = buffer;
+ }
+
+ /** Gets the bucket index to insert the provided sample in. */
+ public int sampleToBucket(int sample) {
+ if (sample >= mBuckets[mBuckets.length - 1]) {
+ return mBuckets.length;
+ }
+
+ // Binary search returns the element index if it is contained in the list - in this case the
+ // correct bucket is the index after as we use [minValue, maxValue) for bucket boundaries.
+ // Otherwise, it returns (-(insertion point) - 1), where insertion point is the point where
+ // to insert the element so that the array remains sorted - in this case the bucket index
+ // is the insertion point.
+ int searchResult = Arrays.binarySearch(mBuckets, sample);
+ return searchResult < 0 ? -(1 + searchResult) : searchResult + 1;
+ }
+
+ @VisibleForTesting
+ public int[] getBuckets() {
+ return mBuckets;
+ }
+}
diff --git a/core/java/com/android/internal/os/BinderLatencyObserver.java b/core/java/com/android/internal/os/BinderLatencyObserver.java
index 92b4952..59cc66d 100644
--- a/core/java/com/android/internal/os/BinderLatencyObserver.java
+++ b/core/java/com/android/internal/os/BinderLatencyObserver.java
@@ -26,7 +26,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BinderInternal.CallSession;
-import java.util.ArrayList;
import java.util.Random;
/** Collects statistics about Binder call latency per calling API and method. */
@@ -34,18 +33,25 @@
private static final String TAG = "BinderLatencyObserver";
public static final int PERIODIC_SAMPLING_INTERVAL_DEFAULT = 10;
- // This is not the final data structure - we will eventually store latency histograms instead of
- // raw samples as it is much more memory / disk space efficient.
- // TODO(b/179999191): change this to store the histogram.
- // TODO(b/179999191): pre allocate the array size so we would not have to resize this.
+ // Histogram buckets parameters.
+ public static final int BUCKET_COUNT_DEFAULT = 100;
+ public static final int FIRST_BUCKET_SIZE_DEFAULT = 5;
+ public static final float BUCKET_SCALE_FACTOR_DEFAULT = 1.125f;
+
@GuardedBy("mLock")
- private final ArrayMap<LatencyDims, ArrayList<Long>> mLatencySamples = new ArrayMap<>();
+ private final ArrayMap<LatencyDims, int[]> mLatencyHistograms = new ArrayMap<>();
private final Object mLock = new Object();
// Sampling period to control how often to track CPU usage. 1 means all calls, 100 means ~1 out
// of 100 requests.
private int mPeriodicSamplingInterval = PERIODIC_SAMPLING_INTERVAL_DEFAULT;
+
+ private int mBucketCount = BUCKET_COUNT_DEFAULT;
+ private int mFirstBucketSize = FIRST_BUCKET_SIZE_DEFAULT;
+ private float mBucketScaleFactor = BUCKET_SCALE_FACTOR_DEFAULT;
+
private final Random mRandom;
+ private BinderLatencyBuckets mLatencyBuckets;
/** Injector for {@link BinderLatencyObserver}. */
public static class Injector {
@@ -56,6 +62,8 @@
public BinderLatencyObserver(Injector injector) {
mRandom = injector.getRandomGenerator();
+ mLatencyBuckets = new BinderLatencyBuckets(
+ mBucketCount, mFirstBucketSize, mBucketScaleFactor);
}
/** Should be called when a Binder call completes, will store latency data. */
@@ -67,12 +75,21 @@
LatencyDims dims = new LatencyDims(s.binderClass, s.transactionCode);
long callDuration = getElapsedRealtimeMicro() - s.timeStarted;
+ // Find the bucket this sample should go to.
+ int bucketIdx = mLatencyBuckets.sampleToBucket(
+ callDuration > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) callDuration);
+
synchronized (mLock) {
- if (!mLatencySamples.containsKey(dims)) {
- mLatencySamples.put(dims, new ArrayList<Long>());
+ int[] buckets = mLatencyHistograms.get(dims);
+ if (buckets == null) {
+ buckets = new int[mBucketCount];
+ mLatencyHistograms.put(dims, buckets);
}
- mLatencySamples.get(dims).add(callDuration);
+ // Increment the correct bucket.
+ if (buckets[bucketIdx] < Integer.MAX_VALUE) {
+ buckets[bucketIdx] += 1;
+ }
}
}
@@ -100,10 +117,26 @@
}
}
+ /** Updates the histogram buckets parameters. */
+ public void setHistogramBucketsParams(
+ int bucketCount, int firstBucketSize, float bucketScaleFactor) {
+ synchronized (mLock) {
+ if (bucketCount != mBucketCount || firstBucketSize != mFirstBucketSize
+ || bucketScaleFactor != mBucketScaleFactor) {
+ mBucketCount = bucketCount;
+ mFirstBucketSize = firstBucketSize;
+ mBucketScaleFactor = bucketScaleFactor;
+ mLatencyBuckets = new BinderLatencyBuckets(
+ mBucketCount, mFirstBucketSize, mBucketScaleFactor);
+ reset();
+ }
+ }
+ }
+
/** Resets the sample collection. */
public void reset() {
synchronized (mLock) {
- mLatencySamples.clear();
+ mLatencyHistograms.clear();
}
}
@@ -151,7 +184,7 @@
}
@VisibleForTesting
- public ArrayMap<LatencyDims, ArrayList<Long>> getLatencySamples() {
- return mLatencySamples;
+ public ArrayMap<LatencyDims, int[]> getLatencyHistograms() {
+ return mLatencyHistograms;
}
}
diff --git a/core/java/com/android/internal/os/ZygoteCommandBuffer.java b/core/java/com/android/internal/os/ZygoteCommandBuffer.java
index b61ae7a..83a68ca 100644
--- a/core/java/com/android/internal/os/ZygoteCommandBuffer.java
+++ b/core/java/com/android/internal/os/ZygoteCommandBuffer.java
@@ -176,7 +176,7 @@
/*
* Repeatedly fork children as above. It commonly does not return in the parent, but it may.
- * @return true in the chaild, false in the parent if we encounter a command we couldn't handle.
+ * @return true in the child, false in the parent if we encounter a command we couldn't handle.
*/
private static native boolean nativeForkRepeatedly(long /* NativeCommandBuffer* */ nbuffer,
int zygoteSocketRawFd,
diff --git a/core/java/com/android/internal/security/VerityUtils.java b/core/java/com/android/internal/security/VerityUtils.java
index ef703a9..8770267 100644
--- a/core/java/com/android/internal/security/VerityUtils.java
+++ b/core/java/com/android/internal/security/VerityUtils.java
@@ -60,7 +60,7 @@
private static final boolean DEBUG = false;
public static boolean isFsVeritySupported() {
- return Build.VERSION.FIRST_SDK_INT >= Build.VERSION_CODES.R
+ return Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.R
|| SystemProperties.getInt("ro.apk_verity.mode", 0) == 2;
}
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index bac6bbe..db536d3 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -486,7 +486,7 @@
// Vendors are only allowed to customize these
int vendorPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_PRIVAPP_PERMISSIONS
| ALLOW_ASSOCIATIONS;
- if (Build.VERSION.FIRST_SDK_INT <= Build.VERSION_CODES.O_MR1) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.O_MR1) {
// For backward compatibility
vendorPermissionFlag |= (ALLOW_PERMISSIONS | ALLOW_APP_CONFIGS);
}
@@ -538,9 +538,9 @@
int productPermissionFlag = ALLOW_FEATURES | ALLOW_LIBS | ALLOW_PERMISSIONS
| ALLOW_APP_CONFIGS | ALLOW_PRIVAPP_PERMISSIONS | ALLOW_HIDDENAPI_WHITELISTING
| ALLOW_ASSOCIATIONS | ALLOW_OVERRIDE_APP_RESTRICTIONS | ALLOW_IMPLICIT_BROADCASTS;
- if (Build.VERSION.FIRST_SDK_INT <= Build.VERSION_CODES.R) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.R) {
// TODO(b/157393157): This must check product interface enforcement instead of
- // FIRST_SDK_VERSION for the devices without product interface enforcement.
+ // DEVICE_INITIAL_SDK_INT for the devices without product interface enforcement.
productPermissionFlag = ALLOW_ALL;
}
readPermissions(Environment.buildPath(
@@ -1241,7 +1241,7 @@
addFeature(PackageManager.FEATURE_APP_ENUMERATION, 0);
}
- if (Build.VERSION.FIRST_SDK_INT >= Build.VERSION_CODES.Q) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.Q) {
addFeature(PackageManager.FEATURE_IPSEC_TUNNELS, 0);
}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 916ecd6..de4cede 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -50,6 +50,7 @@
#include "jni.h"
using namespace android;
+using android::base::GetBoolProperty;
using android::base::GetProperty;
extern int register_android_os_Binder(JNIEnv* env);
@@ -735,17 +736,7 @@
ALOGI("Leaving lock profiling enabled");
}
- bool checkJni = false;
- property_get("dalvik.vm.checkjni", propBuf, "");
- if (strcmp(propBuf, "true") == 0) {
- checkJni = true;
- } else if (strcmp(propBuf, "false") != 0) {
- /* property is neither true nor false; fall back on kernel parameter */
- property_get("ro.kernel.android.checkjni", propBuf, "");
- if (propBuf[0] == '1') {
- checkJni = true;
- }
- }
+ const bool checkJni = GetBoolProperty("dalvik.vm.checkjni", false);
ALOGV("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
if (checkJni) {
/* extended JNI checking */
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 354e3a4..b342755 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -1072,7 +1072,7 @@
return object;
}
-jobject convertDeviceProductInfoToJavaObject(JNIEnv* env, const HdrCapabilities& capabilities) {
+jobject convertHdrCapabilitiesToJavaObject(JNIEnv* env, const HdrCapabilities& capabilities) {
const auto& types = capabilities.getSupportedHdrTypes();
std::vector<int32_t> intTypes;
for (auto type : types) {
@@ -1129,7 +1129,7 @@
static_cast<jint>(info.activeColorMode));
env->SetObjectField(object, gDynamicDisplayInfoClassInfo.hdrCapabilities,
- convertDeviceProductInfoToJavaObject(env, info.hdrCapabilities));
+ convertHdrCapabilitiesToJavaObject(env, info.hdrCapabilities));
env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported,
info.autoLowLatencyModeSupported);
@@ -1443,14 +1443,6 @@
return JNI_TRUE;
}
-static void nativeDeferTransactionUntil(JNIEnv* env, jclass clazz, jlong transactionObj,
- jlong nativeObject, jlong barrierObject, jlong frameNumber) {
- sp<SurfaceControl> ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
- sp<SurfaceControl> barrier = reinterpret_cast<SurfaceControl*>(barrierObject);
- auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
- transaction->deferTransactionUntil_legacy(ctrl, barrier, frameNumber);
-}
-
static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj,
jlong nativeObject,
jlong newParentObject) {
@@ -1856,8 +1848,6 @@
(void*)nativeSetDisplayPowerMode },
{"nativeGetProtectedContentSupport", "()Z",
(void*)nativeGetProtectedContentSupport },
- {"nativeDeferTransactionUntil", "(JJJJ)V",
- (void*)nativeDeferTransactionUntil },
{"nativeReparent", "(JJJ)V",
(void*)nativeReparent },
{"nativeCaptureDisplay",
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 7d1ac95..925a212 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -692,7 +692,7 @@
<protected-broadcast android:name="com.android.internal.intent.action.BUGREPORT_REQUESTED" />
<!-- Added in S -->
- <protected-broadcast android:name="android.intent.action.REBOOT_READY" />
+ <protected-broadcast android:name="android.scheduling.action.REBOOT_READY" />
<protected-broadcast android:name="android.app.action.DEVICE_POLICY_CONSTANTS_CHANGED" />
<!-- ====================================================================== -->
@@ -5982,6 +5982,12 @@
android:exported="false">
</activity>
+ <activity android:name="com.android.server.notification.NASLearnMoreActivity"
+ android:theme="@style/Theme.Dialog.Confirmation"
+ android:excludeFromRecents="true"
+ android:exported="false">
+ </activity>
+
<receiver android:name="com.android.server.BootReceiver"
android:exported="true"
android:systemUserOnly="true">
diff --git a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml b/core/res/res/color/surface_highlight_dark.xml
similarity index 72%
copy from packages/SystemUI/res/drawable/privacy_dialog_bg.xml
copy to core/res/res/color/surface_highlight_dark.xml
index 96136c4..3361bb0 100644
--- a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml
+++ b/core/res/res/color/surface_highlight_dark.xml
@@ -14,9 +14,6 @@
~ 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:shape="rectangle">
- <solid android:color="?android:attr/colorBackground" />
- <corners android:radius="@dimen/ongoing_appops_dialog_bg_corner_radius" />
-</shape>
\ No newline at end of file
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/system_neutral1_500" android:lStar="35" />
+</selector>
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/core/res/res/color/surface_light.xml
similarity index 63%
copy from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
copy to core/res/res/color/surface_light.xml
index 41d88b4..169bfcd 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/core/res/res/color/surface_light.xml
@@ -1,5 +1,5 @@
<?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.
@@ -13,11 +13,6 @@
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:shape="oval">
- <size
- android:height="50dp"
- android:width="50dp" />
- <solid android:color="@android:color/transparent" />
- <stroke android:width="2dp" android:color="#AECBFA" />
-</shape>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/system_neutral1_500" android:lStar="98" />
+</selector>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 72cbc8f..8b225b3 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"toegang tot jou fisieke aktiwiteit"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"foto\'s en video te neem"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-toestelle in die omtrek"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ontdek en koppel aan Bluetooth-toestelle in die omtrek"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Toestelle in die omtrek"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ontdek en koppel aan toestelle in die omtrek"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Oproeprekords"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lees en skryf foonoproeprekord"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Foon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Laat die program toe om Bluetooth-toestelle in die omtrek te ontdek en saam te bind"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"koppel aan saamgebinde Bluetooth-toestelle"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Laat die program toe om aan saamgebinde Bluetooth-toestelle te koppel"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"adverteer op Bluetooth-toestelle in die omtrek"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Laat die program toe om op Bluetooth-toestelle in die omtrek te adverteer"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"bepaal relatiewe posisie tussen ultrabreëbandtoestelle in die omtrek"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Laat die program toe om relatiewe posisie tussen ultrabreëbandtoestelle in die omtrek te bepaal"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Voorkeur-NFC-betalingdiensinligting"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Laat die program toe om voorkeur-NFC-betalingdiensinligting soos geregistreerde hulpmiddels en roetebestemming te kry."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"beheer kortveldkommunikasie"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Opgedateer deur jou administrateur"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Uitgevee deur jou administrateur"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n\n• Skakel Donkertema aan\n• Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af of beperk dit\n\n"<annotation id="url">"Kom meer te wete"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batterybespaarder doen die volgende om batterylewe te verleng:\n\n• Skakel Donkertema aan\n• Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af of beperk dit"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Skakel Databespaarder aan?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Skakel aan"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Hierdie kennisgewing is gedegradeer na Stil. Tik om terugvoer te gee."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Hierdie kennisgewing is hoër gegradeer. Tik om terugvoer te gee."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Hierdie kennisgewing is laer gegradeer. Tik om terugvoer te gee."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Roetinemodus-inligtingkennisgewing"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Jy kan nou \'n deel van jou skerm vergroot"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Skakel aan in Instellings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Maak toe"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Om voort te gaan, moet <b><xliff:g id="APP">%s</xliff:g></b> toegang tot jou toestel se mikrofoon hê."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Om voort te gaan, moet <b><xliff:g id="APP">%s</xliff:g></b> toegang tot jou toestel se kamera hê."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Skakel aan"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Deblokkeer toestelmikrofoon"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokkeer toestelkamera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Vir <b><xliff:g id="APP">%s</xliff:g></b> en alle programme en dienste"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Deblokkeer"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorprivaatheid"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Programikoon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Programhandelsmerkprent"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 0256ab1..834eb74 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"የእርስዎን አካላዊ እንቅስቃሴ ይድረሱበት"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ካሜራ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ስዕሎች ያንሱ እና ቪዲዮ ይቅረጹ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎች"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎችን ያግኙ እና ያገናኙ"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"በአቅራቢያ ያሉ መሣሪያዎች"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"በአቅራቢያ ያሉ መሣሪያዎችን ያሉበትን ያግኙ እና ያገናኙ"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"የጥሪ ምዝገባ ማስታወሻዎች"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"የስልክ ጥሪ ምዝግባ ማስታወሻን ያንብቡ እና ይጻፉ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ስልክ"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"መተግበሪያው በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎችን እንዲያገኝ እና እንዲጣመር ይፈቅድለታል"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ከተጣመሩ የብሉቱዝ መሣሪያዎች ጋር ያገናኙ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"መተግበሪያው ከተጣመሩ የብሉቱዝ መሣሪያዎች ጋር እንዲገናኝ ይፈቅድለታል"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"በአቅራቢያ ላሉ የብሉቱዝ መሣሪያዎችን ያስተዋውቁ"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"በአቅራቢያ ላሉ የብሉቱዝ መሣሪያዎችን እንዲያስተዋውቅ መተግበሪያው ያስችለዋል"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"በአቅራቢያ ባሉ ልዕለ ሰፊ ባንድ መሣሪያዎች መካከል ተዛማጅ የሆነውን ቦታ ይወቁ"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"በአቅራቢያ ባሉ ልዕለ-ሰፊ ባንድ መሣሪያዎች መካከል ያለውን አንጻራዊ አቀማመጣቸውን ለማወቅ ንዲችል ለመተግበሪያው ይፍቀዱ"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ተመራጭ NFC የክፍያ አገልግሎት መረጃ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"እንደ የተመዘገቡ እርዳታዎች እና የጉዞ መሥመር መዳረሻ የመሳሰለ ተመራጭ nfc የክፍያ አገልግሎት መረጃን ለማግኘት ለመተግበሪያው ያፈቅድለታል።"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ቅርብ የግኑኙነትመስክ (NFC) ተቆጣጠር"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"በእርስዎ አስተዳዳሪ ተዘምኗል"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"በእርስዎ አስተዳዳሪ ተሰርዟል"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"እሺ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"የባትሪ ዕድሜን ለማራዘም፣ የባትሪ ቆጣቢ፦\n\n•ጨለማ ገጽታን ያበራል\n•የበስተጀርባ እንቅስቃሴን፣ አንዳንድ የሚታዩ ማሳመሪያዎችን፣ እና ሌሎች እንደ «Hey Google» ያሉ ባህሪያትን ያጠፋል ወይም ይገድባል\n\n"<annotation id="url">"የበለጠ ለመረዳት"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"የባትሪ ዕድሜን ለማራዘም የባትሪ ኃይል ቆጣቢ፦\n\n• ጨለማ ገጽታን ያበራል\n• የበስተጀርባ እንቅስቃሴን፣ አንዳንድ ምስላዊ ተጽዕኖዎችን እና ሌሎች እንደ «Hey Google» ያሉ ባህሪያትን ያጠፋል ወይም ይገድባል"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"የውሂብ አጠቃቀም እንዲቀንስ ለማገዝ ውሂብ ቆጣቢ አንዳንድ መተግበሪያዎች ከበስተጀርባ ሆነው ውሂብ እንዳይልኩ ወይም እንዳይቀበሉ ይከለክላቸዋል። በአሁኑ ጊዜ እየተጠቀሙበት ያለ መተግበሪያ ውሂብ ሊደርስ ይችላል፣ ነገር ግን ባነሰ ተደጋጋሚነት ሊሆን ይችላል። ይሄ ማለት ለምሳሌ ምስሎችን መታ እስኪያደርጓቸው ድረስ ላይታዩ ይችላሉ ማለት ነው።"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ውሂብ ቆጣቢ ይጥፋ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"አብራ"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ይህ ማሳወቂያ ወደ ዝምታ ዝቅ ብሏል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ይህ ማሳወቂያ ከፍተኛ ደረጃ ተሰጥቶታል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ይህ ማሳወቂያ ዝቅተኛ ደረጃ ተሰጥቶታል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"አሁን የማያ ገጽዎን ክፍል ማጉላት ይችላሉ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"በቅንብሮች ውስጥ ያብሩ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"አሰናብት"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ለመቀጠል፣ <b><xliff:g id="APP">%s</xliff:g></b> ወደ መሳሪያዎ ማይክሮፎን መድረስ ይፈልጋል።"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ለመቀጠል፣ <b><xliff:g id="APP">%s</xliff:g></b> የመሣሪያዎን ካሜራ መድረስ ይፈልጋል።"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"አብራ"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"የመሣሪያ ማይክሮፎን እገዳን አንሳ"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"የመሣሪያ ካሜራ እገዳን አንሳ"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"ለ<b><xliff:g id="APP">%s</xliff:g></b> እና ሁሉም መተግበሪያዎች እና አገልግሎቶች"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"እገዳውን አንሳ"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ዳሳሽ ግላዊነት"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"የመተግበሪያ አዶ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"የመተግበሪያ የምርት ስም ምስል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index c8acfc0..4623057 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -331,8 +331,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"الوصول إلى بيانات نشاطك البدني"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"الكاميرا"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"التقاط صور وتسجيل فيديو"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"الأجهزة القريبة التي تتضمّن بلوتوث"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"تسمح هذه الأذونات للتطبيق باكتشاف الأجهزة القريبة التي تتضمّن بلوتوث والربط بها."</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"الأجهزة المجاورة"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"يسمح هذا الإذن برصد الأجهزة المجاورة والربط بها."</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"سجلّ المكالمات"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"قراءة سجلّ المكالمات الهاتفية والكتابة إليه"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"الهاتف"</string>
@@ -550,10 +550,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"يسمح هذا الإذن للتطبيق باكتشاف الأجهزة القريبة التي تتضمّن بلوتوث والاقتران بها."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"تسمح بالربط الأجهزة المقترنة التي تتضمّن بلوتوث."</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"يسمح هذا الإذن للتطبيق بالارتباط بالأجهزة المقترنة التي تتضمّن بلوتوث."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"تحديد الموضع النسبي بين الأجهزة المجاورة التي تستخدم النطاق الواسع جدًا"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"يسمح هذا الإذن للتطبيق بتحديد الموضع النسبي بين الأجهزة المجاورة التي تستخدم النطاق الواسع جدًا."</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"معلومات الخدمات المدفوعة باستخدام الاتصال قصير المدى NFC المفضّل"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"يسمح هذا الإذن للتطبيق بالحصول على معلومات الخدمات المدفوعة باستخدام الاتصال قصير المدى NFC المفضّل، مثلاً المساعدات المسجّلة ووجهة المسار."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"التحكم في اتصال الحقل القريب"</string>
@@ -1944,8 +1946,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"تم التحديث بواسطة المشرف"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"تم الحذف بواسطة المشرف"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"حسنًا"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"لإطالة عمر البطارية، تعمل ميزة \"توفير شحن البطارية\" على:\n·تفعيل \"المظهر الداكن\"\n إيقاف أو حظر النشاط في الخلفية وبعض التأثيرات المرئية والميزات الأخرى، مثل \"Ok Google\"\n\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"لإطالة عمر البطارية، تعمل ميزة \"توفير شحن البطارية\" على:\n\n• تفعيل \"المظهر الداكن\"\n• إيقاف أو حظر النشاط في الخلفية وبعض التأثيرات المرئية والميزات الأخرى، مثل \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"للمساعدة في خفض استخدام البيانات، تمنع ميزة \"توفير البيانات\" بعض التطبيقات من إرسال البيانات وتلقّيها في الخلفية. يمكن للتطبيقات المتاحة لديك الآن استخدام البيانات، ولكن لا يمكنها الإكثار من ذلك. وهذا يعني أن الصور مثلاً لا تظهر حتى تنقر عليها."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"هل تريد تفعيل توفير البيانات؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"تفعيل"</string>
@@ -2204,6 +2208,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"تم خفض ترتيب هذا الإشعار إلى الوضع \"صامت\". انقر لإرسال ملاحظات وآراء."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"تمت زيادة ترتيب هذا الإشعار. انقر لإرسال ملاحظات وآراء."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"تم خفض ترتيب هذا الإشعار. انقر لإرسال ملاحظات وآراء."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"إشعار معلومات \"وضع سلسلة الإجراءات\""</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"قد تنفد طاقة البطارية قبل الشحن المعتاد"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"تم تفعيل \"توفير شحن البطارية\" لإطالة عمرها."</string>
@@ -2395,9 +2411,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"يمكنك الآن تكبير جزء من الشاشة."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"التفعيل من خلال \"الإعدادات\""</string>
<string name="dismiss_action" msgid="1728820550388704784">"إغلاق"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"للمتابعة، يحتاج <b><xliff:g id="APP">%s</xliff:g></b> إلى الوصول إلى ميكروفون الجهاز."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"للمتابعة، يحتاج تطبيق <b><xliff:g id="APP">%s</xliff:g></b> إلى الوصول إلى كاميرا الجهاز."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"تفعيل"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"الخصوصية في جهاز الاستشعار"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"رمز التطبيق"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"الصورة الذهنية للعلامة التجارية للتطبيق"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 5b65daa..a815db7 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"শাৰীৰিক কাৰ্যকলাপ এক্সেছ কৰা"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"কেমেৰা"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ফট\' তুলিব আৰু ভিডিঅ\' ৰেকৰ্ড কৰিব পাৰে"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"নিকটৱৰ্তী ব্লুটুথ ডিভাইচ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"নিকটৱৰ্তী ব্লুটুথ ডিভাইচ বিচাৰি উলিয়াওক আৰু সেইসমূহৰ সৈতে সংযোগ কৰক"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"কল লগসমূহ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ফ\'নৰ কল লগ পঢ়ক আৰু লিখক"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ফ’ন"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"এপ্টোক নিকটৱৰ্তী ব্লুটুথ ডিভাইচ বিচাৰি উলিয়াবলৈ আৰু সেইসমূহৰ সৈতে পেয়াৰ কৰিবলৈ অনুমতি দিয়ে"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"পেয়াৰ কৰা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰক"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"এপ্টোক পেয়াৰ কৰা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰিবলৈ অনুমতি দিয়ে"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"আপোনাৰ প্ৰশাসকে আপেডট কৰিছে"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"আপোনাৰ প্ৰশাসকে মচিছে"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ঠিক আছে"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ, বেটাৰী সঞ্চয়কাৰীয়ে:\n\n•গাঢ় ৰঙৰ থীম অন কৰে\n•নেপথ্যৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল ইফেক্ট আৰু “Hey Google”ৰ দৰে অন্য সুবিধাসমূহ অফ কৰে অথবা সেইবোৰ সীমাবদ্ধ কৰে\n\n"<annotation id="url">"অধিক জানক"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ বেটাৰী সঞ্চয়কাৰীয়ে:\n\n• গাঢ় ৰঙৰ থীম অন কৰে\n• নেপথ্যৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল ইফেক্ট আৰু “Hey Google”ৰ দৰে অন্য সুবিধাসমূহ অফ কৰে অথবা সীমাবদ্ধ কৰে"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ডেটা ব্য়ৱহাৰ মাত্ৰা কম কৰিবৰ বাবে ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা ব্য়ৱহাৰ কৰিব পাৰে, কিন্তু সঘনাই এই কার্য কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ এইয়ে হ\'ব পাৰে যে, উদাহৰণস্বৰূপে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ’ব।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সঞ্চয়কাৰী অন কৰিবনে?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"অন কৰক"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"এই জাননীটোৰ গুৰুত্ব নীৰৱলৈ হ্ৰাস কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"এই জাননীটোৰ স্থান ওপৰলৈ কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"এই জাননীটোৰ স্থান তললৈ কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"আপুনি এতিয়া আপোনাৰ স্ক্ৰীনখনৰ কিছু অংশ বিবৰ্ধন কৰিব পাৰে"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ছেটিঙত অন কৰক"</string>
<string name="dismiss_action" msgid="1728820550388704784">"অগ্ৰাহ্য কৰক"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"অব্যাহত ৰাখিবলৈ <b><xliff:g id="APP">%s</xliff:g></b>এ আপোনাৰ ডিভাইচৰ মাইক্ৰ’ফ’ন এক্সেছ কৰাৰ আৱশ্যক।"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"অব্যাহত ৰাখিবলৈ <b><xliff:g id="APP">%s</xliff:g></b>এ আপোনাৰ ডিভাইচৰ কেমেৰা এক্সেছ কৰাৰ আৱশ্যক।"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"অন কৰক"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ছেন্সৰ সম্পৰ্কীয় গোপনীয়তাৰ নীতি"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"এপ্লিকেশ্বনৰ চিহ্ন"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"এপ্লিকেশ্বনৰ ব্ৰেণ্ডৰ প্ৰতিচ্ছবি"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index da7da27..70c4534 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"fiziki fəaliyyətə daxil olun"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"şəkil çəkin və video yazın"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"yaxınlıqdakı Bluetooth cihazları"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"yaxınlıqdakı Bluetooth cihazlarını aşkarlamaq və onlara qoşulmaq"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Yaxınlıqdakı cihazlar"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"yaxınlıqdakı cihazları tapmaq və qoşulmaq"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Zəng qeydləri"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"telefonun zəng qeydini oxuyun və yazın"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tətbiqə yaxınlıqdakı Bluetooth cihazlarını aşkarlamaq və birləşdirməyə icazə verir"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"birləşdirilmiş Bluetooth cihazlarına qoşulmaq"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tətbiqə birləşdirilmiş Bluetooth cihazlarına qoşulmağa icazə verir"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"yaxınlıqdakı Ultra Genişzolaqlı cihazları arasında nisbi mövqeyi təyin etmək"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Tətbiqə yaxınlıqdakı Ultra Genişzolaqlı cihazları arasında nisbi mövqeyi təyin etməyə icazə verin"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Tərcih edilən NFC ödəniş xidməti məlumatı"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tətbiqə qeydiyyatdan keçmiş yardım və marşrut təyinatı kimi tərcih edilən nfc ödəniş xidməti məlumatını əldə etmək icazəsi verir."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication\'ı kontrol et"</string>
@@ -1016,7 +1018,7 @@
<string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"Tətbiqə Brauzerin geolokasiya icazələrini dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək məkan məlumatlarını təsadüfi saytlara göndərə bilər."</string>
<string name="save_password_message" msgid="2146409467245462965">"Brauzerin bu şifrəni yadda saxlamasını istəyirsiz?"</string>
<string name="save_password_notnow" msgid="2878327088951240061">"İndi yox"</string>
- <string name="save_password_remember" msgid="6490888932657708341">"Yadda saxla"</string>
+ <string name="save_password_remember" msgid="6490888932657708341">"Yadda saxlayın"</string>
<string name="save_password_never" msgid="6776808375903410659">"Heç vaxt"</string>
<string name="open_permission_deny" msgid="5136793905306987251">"Bu səhifəni açmaq üçün icazəniz yoxdur."</string>
<string name="text_copied" msgid="2531420577879738860">"Mətn panoya kopyalandı."</string>
@@ -1358,7 +1360,7 @@
<string name="usb_supplying_notification_title" msgid="5378546632408101811">"USB vasitəsilə qoşulmuş cihaza enerji doldurulur"</string>
<string name="usb_mtp_notification_title" msgid="1065989144124499810">"USB fayl transferi aktiv edildi"</string>
<string name="usb_ptp_notification_title" msgid="5043437571863443281">"USB vasitəsilə PTP aktiv edildi"</string>
- <string name="usb_tether_notification_title" msgid="8828527870612663771">"USB birləşmə aktiv edildi"</string>
+ <string name="usb_tether_notification_title" msgid="8828527870612663771">"USB-modem aktivdir"</string>
<string name="usb_midi_notification_title" msgid="7404506788950595557">"USB vasitəsilə MIDI aktiv edildi"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB aksesuarı qoşulub"</string>
<string name="usb_notification_message" msgid="4715163067192110676">"Əlavə seçimlər üçün tıklayın."</string>
@@ -1624,7 +1626,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Ekranı cihaza yayımla"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"Cihazlar axtarılır..."</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Ayarlar"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Bağlantını kəs"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Əlaqəni kəsin"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"Skan edilir..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"Qoşulur..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"Əlçatımlı"</string>
@@ -1852,10 +1854,12 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Admin tərəfindən yeniləndi"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Admin tərəfindən silindi"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət funksiyası:\n\n• Qaranlıq temanı aktiv edir\n• Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları deaktiv edir və ya məhdudlaşdırır\n\n"<annotation id="url">"Ətraflı məlumat"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət funksiyası:\n\n• Qaranlıq temanı aktiv edir\n• Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları deaktiv edir və ya məhdudlaşdırır"</string>
- <string name="data_saver_description" msgid="4995164271550590517">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq dataya daxil ola bilər, ancaq bunu tez-tez edə bilməz. Bu o deməkdir ki, məsələn, Siz üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string>
- <string name="data_saver_enable_title" msgid="7080620065745260137">"Data Qənaəti aktiv edilsin?"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"Mobil interneti qənaətlə işlətmək məqsədilə Data Qanaəti bəzi tətbiqlərin fonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq nisbətən az müntəzəmliklə data istifadə edə bilər. Örnək olaraq bu, o deməkdir ki, şəkil fayllarına toxunmadıqca onlar açılmayacaq."</string>
+ <string name="data_saver_enable_title" msgid="7080620065745260137">"Trafikə qənaət edilsin?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivləşdirin"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
<item quantity="other"> %1$d dəqiqəlik (saat <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> radəsinə qədər)</item>
@@ -1892,7 +1896,7 @@
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Bu vaxtadək: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Saat <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> qədər"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> radəsinə qədər (növbəti siqnal)"</string>
- <string name="zen_mode_forever" msgid="740585666364912448">"Deaktiv edənə qədər"</string>
+ <string name="zen_mode_forever" msgid="740585666364912448">"Deaktiv edilənə qədər"</string>
<string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\"Narahat etməyin\" seçiminini deaktiv edənə kimi"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Dağıt"</string>
@@ -1901,7 +1905,7 @@
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Həftəiçi gecəsi"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Həftə sonu"</string>
<string name="zen_mode_default_events_name" msgid="2280682960128512257">"Tədbir"</string>
- <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Yuxu"</string>
+ <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Yuxu vaxtı"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> bəzi səsləri səssiz rejimə salır"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Cihazınızın daxili problemi var və istehsalçı sıfırlanması olmayana qədər qeyri-stabil ola bilər."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Cihazınızın daxili problemi var. Əlavə məlumat üçün istehsalçı ilə əlaqə saxlayın."</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildiriş Səssiz rejimə keçirilib. Rəy bildirmək üçün toxunun."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildiriş yuxarı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildiriş aşağı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rejim üçün məlumat bildirişi"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"İndi ekranınızın bir hissəsini böyüdə bilərsiniz"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ayarlarda aktiv edin"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Qapadın"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Davam etmək üçün <b><xliff:g id="APP">%s</xliff:g></b> tətbiqi cihazın mikrofonuna giriş tələb edir."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Davam etmək üçün <b><xliff:g id="APP">%s</xliff:g></b> tətbiqi cihazın kamerasına giriş tələb edir."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktiv edin"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor Məxfiliyi"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Tətbiq ikonası"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Tətbiqin brend şəkli"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 81ca4e6..1cd4c12 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"pristup fizičkim aktivnostima"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"snima slike i video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth uređaji u blizini"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"otkrivanje i povezivanje sa Bluetooth uređajima u blizini"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Uređaji u blizini"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"otkrivanje uređaja u blizini i povezivanje sa njima"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Evidencije poziva"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"čitanje i pisanje evidencije poziva na telefonu"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -541,10 +541,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Dozvoljava aplikaciji da otkriva Bluetooth uređaje u blizini i uparuje se sa njima"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezivanje sa uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Dozvoljava aplikaciji da se povezuje sa uparenim Bluetooth uređajima"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"oglašavanje na Bluetooth uređajima u blizini"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Dozvoljava aplikaciji da se oglašava na Bluetooth uređajima u blizini"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"određivanje razdaljine između uređaja ultra-širokog pojasa u blizini"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Dozvoljava aplikaciji da određuje relativnu razdaljinu između uređaja ultra-širokog pojasa u blizini"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o željenoj NFC usluzi za plaćanje"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da preuzima informacije o željenoj NFC usluzi za plaćanje, poput registrovanih identifikatora aplikacija i odredišta preusmeravanja."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrola komunikacije u užem polju (Near Field Communication)"</string>
@@ -1875,8 +1875,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je administrator"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je administrator"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Potvrdi"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Da bi se produžilo trajanje baterije, Ušteda baterije:\n\n• uključuje tamnu temu\n• isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer „Ok Google“\n\n"<annotation id="url">"Saznajte više"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Da bi se produžilo trajanje baterije, Ušteda baterije:\n\n• uključuje tamnu temu\n• isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer, „Ok Google“"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Želite da uključite Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
@@ -2105,6 +2107,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ovo obaveštenje je degradirano u Nečujno. Dodirnite da biste naveli povratne informacije."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ovo obaveštenje je rangirano više. Dodirnite da biste naveli povratne informacije."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ovo obaveštenje je rangirano niže. Dodirnite da biste naveli povratne informacije."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obaveštenje o informacijama Rutinskog režima"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
@@ -2293,9 +2307,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sada možete da uvećate deo ekrana"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Podešavanjima"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> zahteva pristup mikrofonu uređaja radi nastavljanja."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> zahteva pristup kameri uređaja radi nastavljanja."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Uključi"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Odblokirajte mikrofon uređaja"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Odblokirajte kameru uređaja"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za <b><xliff:g id="APP">%s</xliff:g></b> i sve aplikacije i usluge"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Odblokiraj"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatnost senzora"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikacije"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imidž brenda aplikacije"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 995bf8e..c1abeca 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"доступ да даных фізічнай актыўнасці"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"рабіць фатаздымкі і запісваць відэа"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Прылады з Bluetooth паблізу"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"выяўляць прылады з Bluetooth, якія знаходзяцца паблізу, і падключацца да іх"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Прылады паблізу"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"выяўляць прылады паблізу і падключацца да іх"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Журналы выклікаў"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"Чытанне і запіс журнала тэлефонных выклікаў"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Тэлефон"</string>
@@ -544,10 +544,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дазваляе праграме выяўляць прылады з Bluetooth і спалучацца з імі"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"падключацца да спалучаных прылад з Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дазваляе праграме падключацца да спалучаных прылад з Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"вызначаць адлегласць паміж прыладамі з звышшырокапалоснай сувяззю"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Дазволіць праграме вызначаць адлегласць паміж прыладамі паблізу, якія выкарыстоўваюць звышшырокапалосную сувязь"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Інфармацыя пра прыярытэтны сэрвіс аплаты NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дазваляе праграме атрымаць доступ да інфармацыі пра прыярытэтны сэрвіс аплаты NFC, напрыклад зарэгістраваныя ідэнтыфікатары праграм і маршруты адпраўкі даных."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"кантроль Near Field Communication"</string>
@@ -1406,8 +1408,8 @@
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Выяўлены аксесуар аналагавага аўдыя"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Далучаная прылада не сумяшчальная з гэтым тэлефонам. Націсніце, каб даведацца больш."</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"Адладка па USB падключана"</string>
- <string name="adb_active_notification_message" msgid="5617264033476778211">"Націсніце, каб выключыць адладку па USB"</string>
- <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Выберыце, каб адключыць адладку USB."</string>
+ <string name="adb_active_notification_message" msgid="5617264033476778211">"Націсніце, каб адключыць адладку па USB"</string>
+ <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Выберыце, каб адключыць адладку па USB."</string>
<string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Адладка па Wi-Fi уключана"</string>
<string name="adbwifi_active_notification_message" msgid="930987922852867972">"Націсніце, каб выключыць адладку па Wi-Fi"</string>
<string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Выберыце, каб выключыць адладку па Wi-Fi."</string>
@@ -1661,7 +1663,7 @@
<string name="default_audio_route_category_name" msgid="5241740395748134483">"Сістэма"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"Bluetooth-аўдыё"</string>
<string name="wireless_display_route_description" msgid="8297563323032966831">"Бесправадны дысплей"</string>
- <string name="media_route_button_content_description" msgid="2299223698196869956">"Перадача"</string>
+ <string name="media_route_button_content_description" msgid="2299223698196869956">"Трансляцыя"</string>
<string name="media_route_chooser_title" msgid="6646594924991269208">"Падключыцца да прылады"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Трансліраваць экран на прыладу"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"Пошук прылад..."</string>
@@ -1898,8 +1900,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Абноўлены вашым адміністратарам"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Выдалены вашым адміністратарам"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n\n•·уключае цёмную тэму;\n• выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\"\n\n"<annotation id="url">"Даведацца больш"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n\n• уключае цёмную тэму;\n• выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"У рэжыме \"Эканомія трафіка\" фонавая перадача для некаторых праграмам адключана. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але радзей, чым звычайна. Напрыклад, відарысы могуць не загружацца, пакуль вы не націсніце на іх."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Уключыць Эканомію трафіка?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Уключыць"</string>
@@ -2054,7 +2058,7 @@
<string name="app_category_productivity" msgid="1844422703029557883">"Прадукцыйнасць"</string>
<string name="app_category_accessibility" msgid="6643521607848547683">"Спецыяльныя магчымасці"</string>
<string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Сховішча на прыладзе"</string>
- <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"Адладка USB"</string>
+ <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"Адладка па USB"</string>
<string name="time_picker_hour_label" msgid="4208590187662336864">"гадз"</string>
<string name="time_picker_minute_label" msgid="8307452311269824553">"хв"</string>
<string name="time_picker_header_text" msgid="9073802285051516688">"Задаць час"</string>
@@ -2138,6 +2142,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Гэта апавяшчэнне пераведзена ў рэжым \"Без гуку\". Націсніце тут і дайце водгук."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Гэта апавяшчэнне ацэнена як важнае. Націсніце тут і дайце водгук."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Гэта апавяшчэнне ацэнена як няважнае. Націсніце тут і дайце водгук."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
@@ -2327,9 +2343,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Цяпер можна павялічваць частку экрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Уключыць у Наладах"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Адхіліць"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Каб працягнуць, дайце праграме <b><xliff:g id="APP">%s</xliff:g></b> доступ да мікрафона прылады."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Каб працягнуць, дайце праграме <b><xliff:g id="APP">%s</xliff:g></b> доступ да камеры прылады."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Уключыць"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Прыватнасць інфармацыі з датчыка"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Значок праграмы"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Відарыс брэнда праграмы"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 61f1c24..52e686c92 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"достъп до физическата ви активност"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"да прави снимки и записва видео"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Устройства с Bluetooth в близост"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"откриване на устройства с Bluetooth в близост и свързване с тях"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Устройства в близост"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"откриване на устройства в близост и свързване с тях"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Списъци с обажданията"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"четене и запис на списъка с телефонните обаждания"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дава възможност на приложението да открива устройства с Bluetooth в близост и да се сдвоява с тях"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"свързване със сдвоените устройства с Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дава възможност на приложението да се свързва със сдвоените устройства с Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"рекламиране на устройства с Bluetooth в близост"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Разрешава на приложението да рекламира на устройства с Bluetooth в близост"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"опред. на относителната позиция м/у у-вата с ултрашироколентови сигнали в близост"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Разрешаване на приложението да определя относителната позиция между устройствата с ултрашироколентови сигнали в близост"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информация за предпочитаната услуга за плащане чрез NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дава възможност на приложението да получава информация за предпочитаната услуга за плащане чрез NFC, като например регистрирани помощни средства и местоназначение."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контролиране на комуникацията в близкото поле"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Актуализирано от администратора ви"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Изтрито от администратора ви"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n\n•·включва тъмната тема;\n•·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“.\n\n"<annotation id="url">"Научете повече"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n\n• включва тъмната тема;\n• изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ще вкл. ли „Икономия на данни“?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Включване"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Това известие бе понижено до беззвучно. Докоснете, за да изпратите отзиви."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Това известие бе класирано по-високо. Докоснете, за да изпратите отзиви."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Това известие бе класирано по-ниско. Докоснете, за да изпратите отзиви."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известие с информация за режима на поредица"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерията може да се изтощи преди обичайното зареждане"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Вече можете да увеличите част от екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Включете от настройките"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Отхвърляне"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"За да продължите, <b><xliff:g id="APP">%s</xliff:g></b> се нуждае от достъп до микрофона на устройството ви."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"За да продължите, <b><xliff:g id="APP">%s</xliff:g></b> се нуждае от достъп до камерата на устройството ви."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Включване"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Отблокиране на микрофона на устройството"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Отблокиране на камерата на устройството"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"За <b><xliff:g id="APP">%s</xliff:g></b> и всички приложения и услуги"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Отблокиране"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Поверителност на сензорните данни"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Икона на приложението"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Изображение на търговската марка на приложението"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index b279b3b..17be781 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"শারীরিক অ্যাক্টিভিটি অ্যাক্সেস করা"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ক্যামেরা"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ছবি তোলা এবং ভিডিও রেকর্ড"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"কাছাকাছি ব্লুটুথ ডিভাইস"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"কাছাকাছি ব্লুটুথ ডিভাইস খুঁজে দেখুন এবং তার সাথে কানেক্ট করুন"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"কল লগ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ফোন কল লগ পড়ে এবং দেখে"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ফোন"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"অ্যাপটিকে কাছাকাছি ব্লুটুথ ডিভাইস খুঁজে দেখতে এবং তার সাথে পেয়ার করার অনুমতি দেয়"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"পেয়ার করা ব্লুটুথ ডিভাইসের সাথে কানেক্ট করুন"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"অ্যাপটিকে পেয়ার করা ব্লুটুথ ডিভাইসের সাথে কানেক্ট করতে অনুমতি দেয়"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1624,7 +1630,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ডিভাইসে স্ক্রিন কাস্ট করুন"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"ডিভাইসগুলি সার্চ করা হচ্ছে…"</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"সেটিংস"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"সংযোগ বিচ্ছিন্ন করুন"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ডিসকানেক্ট করুন"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"স্ক্যান করা হচ্ছে…"</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"সংযুক্ত হচ্ছে..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"উপলব্ধ"</string>
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ঠিক আছে"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n\n• ডার্ক থিম চালু করে\n• ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমিত করে\n\n"<annotation id="url">"আরও জানুন"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n\n• ডার্ক থিম চালু করে\n• ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ অথবা সীমিত করে"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার ব্যাকগ্রাউন্ডে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবির উপর ট্যাপ না করা পর্যন্ত সেগুলি দেখানো হবে না৷"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"চালু করুন"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"এই বিজ্ঞপ্তির গুরুত্ব কমিয়ে মিউট হিসেবে সেট করা হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"এই বিজ্ঞপ্তির গুরুত্ব বাড়ানো হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"এই বিজ্ঞপ্তির গুরুত্ব কমানো হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"আপনার স্ক্রিনের অংশ এখন আপনি বড় করে দেখতে পারবেন"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"সেটিংস থেকে চালু করুন"</string>
<string name="dismiss_action" msgid="1728820550388704784">"বাতিল করুন"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"চালিয়ে যেতে, <b><xliff:g id="APP">%s</xliff:g></b> আপনার ডিভাইসের মাইক্রোফোন অ্যাক্সেস করতে চায়।"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"চালিয়ে যেতে, <b><xliff:g id="APP">%s</xliff:g></b> আপনার ডিভাইসের ক্যামেরা অ্যাক্সেস করতে চায়।"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"চালু করুন"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"সেন্সর গোপনীয়তা"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"অ্যাপের আইকন"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"অ্যাপের ব্র্যান্ড ছবি"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 0dac1b9..b034223 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"pristup vašoj fizičkoj aktivnosti"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"snima fotografije i videozapise"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth uređaji u blizini"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"otkrivanje Bluetooth uređaja u blizini i povezivanje s njima"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Uređaji u blizini"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"otkrivanje uređaja u blizini i povezivanje s njima"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Zapisnici poziva"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"čitanje i pisanje zapisnika telefonskih poziva"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -541,10 +541,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Dozvoljava aplikaciji da otkrije Bluetooth uređaje u blizini i upari se s njima"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezivanje s uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Dozvoljava aplikaciji da se poveže s uparenim Bluetooth uređajima"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"oglašavanje na Bluetooth uređajima u blizini"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Dozvoljava aplikaciji da vrši oglašavanje na Bluetooth uređajima u blizini"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"određivanje rel. položaja uređaja ultra širokog opsega u blizini"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Dozvolite aplikaciji da odredi relativni položaj između uređaja ultra širokog opsega u blizini"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o preferiranoj usluzi plaćanja putem NFC-a"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da dobije informacije o preferiranoj usluzi plaćanja putem NFC-a kao što su registrirana pomagala i odredište rute."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"upravljanje NFC-om"</string>
@@ -1354,10 +1354,10 @@
<string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"Uvijek dozvoli"</string>
<string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"Nikada ne dozvoli"</string>
<string name="sim_removed_title" msgid="5387212933992546283">"SIM kartica uklonjena"</string>
- <string name="sim_removed_message" msgid="9051174064474904617">"Mobilna mreža bit će nedostupna do ponovnog pokretanja s umetnutom važećom SIM karticom."</string>
+ <string name="sim_removed_message" msgid="9051174064474904617">"Mobilna mreža neće biti dostupna dok ponovo ne pokrenete uređaj s umetnutom važećom SIM karticom."</string>
<string name="sim_done_button" msgid="6464250841528410598">"Gotovo"</string>
<string name="sim_added_title" msgid="7930779986759414595">"SIM kartica dodana"</string>
- <string name="sim_added_message" msgid="6602906609509958680">"Za pristup mobilnoj mreži ponovo pokrenite uređaj."</string>
+ <string name="sim_added_message" msgid="6602906609509958680">"Ponovo pokrenite uređaj da pristupite mobilnoj mreži."</string>
<string name="sim_restart_button" msgid="8481803851341190038">"Ponovo pokreni"</string>
<string name="install_carrier_app_notification_title" msgid="5712723402213090102">"Aktivirajte uslugu mobilne mreže"</string>
<string name="install_carrier_app_notification_text" msgid="2781317581274192728">"Preuzmite aplikaciju operatera da aktivirate novi SIM"</string>
@@ -1405,7 +1405,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"Vaš administrator je zatražio izvještaj o greškama kako bi pomogao u rješavanju problema ovog uređaja. Moguće je dijeljenje aplikacija i podataka."</string>
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"PODIJELI"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"ODBACI"</string>
- <string name="select_input_method" msgid="3971267998568587025">"Odabir načina unosa"</string>
+ <string name="select_input_method" msgid="3971267998568587025">"Odaberite način unosa"</string>
<string name="show_ime" msgid="6406112007347443383">"Prikaži na ekranu dok je fizička tastatura aktivna"</string>
<string name="hardware" msgid="1800597768237606953">"Prikaz virtuelne tastature"</string>
<string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"Konfiguriraj fizičku tastaturu"</string>
@@ -1875,8 +1875,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je vaš administrator"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je vaš administrator"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Uredu"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n\n• Uključuje Tamnu temu\n• Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Ok Google\"\n\n"<annotation id="url">"Saznajte više"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n\n• Uključuje Tamnu temu\n• Isključuje ili ograničava aktivnost u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Ok Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Radi smanjenja prijenosa podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. Naprimjer, to može značiti da se slike ne prikazuju dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
@@ -2105,6 +2107,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Značaj ovog obavještenja je umanjen na Nečujno. Dodirnite da pošaljete povratne informacije."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Značaj ovog obavještenja je povećan. Dodirnite da pošaljete povratne informacije."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Značaj ovog obavještenja je umanjen. Dodirnite da pošaljete povratne informacije."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještenje za informacije Rutinskog načina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
@@ -2293,9 +2307,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sada možete uvećati dio ekrana"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Da nastavite, aplikaciji <b><xliff:g id="APP">%s</xliff:g></b> je potreban pristup mikrofonu vašeg uređaja."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Da nastavite, aplikaciji <b><xliff:g id="APP">%s</xliff:g></b> je potreban pristup kameri vašeg uređaja."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Uključi"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Deblokirajte mikrofon uređaja"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokirajte kameru uređaja"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za aplikaciju <b><xliff:g id="APP">%s</xliff:g></b> te sve aplikacije i usluge"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Deblokiraj"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatnost senzora"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikacije"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Slika robne marke za aplikaciju"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 3d1ff85..96f0b7c 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"accedir a la teva activitat física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Càmera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fer fotos i gravar vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositius Bluetooth propers"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"detectar i connectar-se a dispositius Bluetooth propers"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositius propers"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"detectar dispositius propers i connectar-s\'hi"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registres de trucades"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"llegir i editar el registre de trucades del telèfon"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telèfon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permet que l\'aplicació detecti i vinculi dispositius Bluetooth propers"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connectar-se a dispositius Bluetooth vinculats"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permet que l\'aplicació es connecti a dispositius Bluetooth vinculats"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"anunciar-se als dispositius Bluetooth propers"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permet que l\'aplicació s\'anunciï als dispositius Bluetooth propers"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar posició entre dispositius de banda ultraampla propers"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permet que l\'aplicació determini la posició relativa entre els dispositius de banda ultraampla propers"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informació preferent sobre el servei de pagament per NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet que l\'aplicació obtingui informació preferent sobre el servei de pagament per NFC, com ara complements registrats i destinacions de rutes."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicació de camp proper (NFC)"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Actualitzat per l\'administrador"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Suprimit per l\'administrador"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"D\'acord"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Per allargar la durada de la bateria, la funció Estalvi de bateria:\n\n• Activa el tema fosc.\n• Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\".\n\n"<annotation id="url">"Més informació"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Per allargar la durada de la bateria, la funció Estalvi de bateria:\n\n• Activa el tema fosc.\n• Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Activar l\'Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activa"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"El nivell d\'aquesta notificació s\'ha disminuït a Silenci. Toca per proporcionar suggeriments."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Aquesta notificació s\'ha classificat amb un nivell superior. Toca per proporcionar suggeriments."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Aquesta notificació s\'ha classificat amb un nivell inferior. Toca per proporcionar suggeriments."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificació d\'informació del mode de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"És possible que la bateria s\'esgoti abans de la càrrega habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"S\'ha activat l\'estalvi de bateria per prolongar-ne la durada"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ara pots ampliar una part de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activa a Configuració"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignora"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Per continuar, <b><xliff:g id="APP">%s</xliff:g></b> necessita accedir al micròfon del dispositiu."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Per continuar, <b><xliff:g id="APP">%s</xliff:g></b> necessita accedir a la càmera del dispositiu."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activa"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloqueja el micròfon del dispositiu"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloqueja la càmera del dispositiu"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Per a <b><xliff:g id="APP">%s</xliff:g></b> i tots els serveis i aplicacions"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloqueja"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privadesa dels sensors"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icona d\'aplicació"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imatge de brànding de l\'aplicació"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 70ad326..0dd472f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"přístup k vaší fyzické aktivitě"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"pořizování fotografií a nahrávání videa"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Zařízení Bluetooth v okolí"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"vyhledávat zařízení Bluetooth v okolí a připojovat se k nim"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Zařízení v okolí"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"objevování a připojení k zařízením v okolí"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Seznamy hovorů"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"čtení a zápis do seznamu telefonních hovorů"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Umožňuje aplikaci vyhledávat zařízení Bluetooth v okolí a spárovávat se s nimi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"připojovat se ke spárovaným zařízením Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Umožňuje aplikaci připojovat se ke spárovaným zařízením Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"inzerovat zařízením Bluetooth v okolí"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Umožňuje aplikaci inzerovat zařízením Bluetooth v okolí"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"zjišťování vzájemné pozice mezi ultra-širokopásmovými zařízeními v okolí"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Aplikace bude moci zjišťovat vzájemnou pozici mezi ultra-širokopásmovými zařízeními v okolí"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informace o preferované platební službě NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikaci získat informace o preferované platební službě NFC, například o registrovaných pomůckách a cíli směrování."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ovládání technologie NFC"</string>
@@ -1898,8 +1898,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizováno administrátorem"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Smazáno administrátorem"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Spořič baterie za účelem úspory energie:\n\n• Zapne tmavý motiv.\n• Vypne nebo omezí aktivitu na pozadí, některé vizuální efekty a další funkce jako „Ok Google“.\n\n"<annotation id="url">"Další informace"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Spořič baterie za účelem úspory energie:\n\n• Zapne tmavý motiv.\n• Vypne nebo omezí aktivitu na pozadí, některé vizuální efekty a další funkce jako „Ok Google“."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Z důvodu snížení využití dat brání spořič dat některým aplikacím v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnout Spořič dat?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnout"</string>
@@ -1954,7 +1956,7 @@
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (příští budík)"</string>
- <string name="zen_mode_forever" msgid="740585666364912448">"Dokud tuto funkci nevypnete"</string>
+ <string name="zen_mode_forever" msgid="740585666364912448">"Dokud funkci nevypnete"</string>
<string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dokud nevypnete režim Nerušit"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Sbalit"</string>
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Toto oznámení bylo ztlumeno. Po klepnutí můžete zadat zpětnou vazbu."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"U tohoto oznámení byla zvýšena priorita. Po klepnutí můžete zadat zpětnou vazbu."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"U tohoto oznámení byla snížena priorita. Po klepnutí můžete zadat zpětnou vazbu."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informační oznámení režimu sledu činností"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterie se možná vybije před obvyklým časem nabití"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nově můžete zvětšit část obrazovky"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Zapnout v Nastavení"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Zavřít"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Než budete pokračovat, udělte aplikaci <b><xliff:g id="APP">%s</xliff:g></b> přístup k mikrofonu na zařízení."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Než budete pokračovat, udělte aplikaci <b><xliff:g id="APP">%s</xliff:g></b> přístup k fotoaparátu na zařízení."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Zapnout"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Odblokovat mikrofon zařízení"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Odblokovat fotoaparát zařízení"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Pro aplikaci <b><xliff:g id="APP">%s</xliff:g></b> a všechny aplikace a služby"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Odblokovat"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Ochrana soukromí – senzor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikace"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Image značky aplikace"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index c4db344..94b9a92 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"få adgang til din fysiske aktivitet"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tage billeder og optage video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-enheder i nærheden"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"registrer og opret forbindelse til Bluetooth-enheder i nærheden"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Enheder i nærheden"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"finde og oprette forbindelse til enheder i nærheder"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Opkaldslister"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"læse og redigere opkaldslisten"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -540,10 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tillader, at appen registrerer og parrer Bluetooth-enheder i nærheden"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"opret forbindelse til parrede Bluetooth-enheder"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tillader, at appen opretter forbindelse til parrede Bluetooth-enheder"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"give sig til kende for Bluetooth-enheder i nærheden"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Giver appen tilladelse til at give sig til kende for Bluetooth-enheder i nærheden"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"fastlægge den relative position mellem UWB-enheder i nærheden"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Tillad, at appen fastlægger den relative position mellem UWB-enheder (Ultra-Wideband) i nærheden"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Foretrukne oplysninger vedrørende NFC-betalingstjeneste"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillader, at appen får foretrukne oplysninger vedrørende NFC-betalingstjeneste, f.eks. registrerede hjælpemidler og rutedestinationer."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"administrere Near Field Communication"</string>
@@ -1854,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Opdateret af din administrator"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet af din administrator"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batterisparefunktionen gør følgende for at spare på batteriet:\n\n• Aktiverer Mørkt tema\n• Deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og andre funktioner som f.eks. \"Hey Google\"\n\n"<annotation id="url">"Få flere oplysninger"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batterisparefunktionen gør følgende for at spare på batteriet:\n\n• Aktiverer Mørkt tema\n• Deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og andre funktioner som f.eks. \"Hey Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du aktivere Datasparefunktion?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivér"</string>
@@ -2074,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Denne notifikation blev angivet som Lydløs. Tryk for at give feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Denne notifikation blev placeret højere. Tryk for at give feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Denne notifikation blev placeret lavere. Tryk for at give feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikation med oplysninger om rutinetilstand"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
@@ -2261,9 +2275,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Du kan nu forstørre noget af skærmen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivér i Indstillinger"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Luk"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> skal have adgang til din enheds mikrofon, før den kan fortsætte."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> skal have adgang til din enheds kamera, før den kan fortsætte."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktivér"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Fjern blokeringen af enhedens mikrofon"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Fjern blokeringen af enhedens kamera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> og alle apps og tjenester"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Fjern blokering"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Beskyttelse af sensoroplysninger"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Appens ikon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Appens brandimage"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index d98ea99..6e8ab72 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Zugriff auf körperliche Aktivität"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"Bilder und Videos aufnehmen"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-Geräte in der Nähe"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"Bluetooth-Geräte in der Nähe finden und eine Verbindung zu ihnen herstellen"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Anrufliste"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"Schreib- und Lesezugriff auf Anrufliste"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Erlaubt der App, Bluetooth-Geräte in der Nähe zu finden und zu koppeln"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"Mit gekoppelten Bluetooth-Geräten verbinden"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Erlaubt der App, sich mit gekoppelten Bluetooth-Geräten zu verbinden"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -715,8 +721,8 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Ermöglicht dem Inhaber die Bindung an die Oberfläche eines Mobilfunkanbieter-Messaging-Dienstes auf oberster Ebene. Für normale Apps sollte dies nie erforderlich sein."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"An Mobilfunkanbieter-Dienste binden"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Ermöglicht dem Inhaber die Bindung an Mobilfunkanbieter-Dienste. Für normale Apps sollte dies nicht erforderlich sein."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Auf \"Bitte nicht stören\" zugreifen"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ermöglicht der App Lese- und Schreibzugriff auf die \"Bitte nicht stören\"-Konfiguration"</string>
+ <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Auf „Bitte nicht stören“ zugreifen"</string>
+ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ermöglicht der App Lese- und Schreibzugriff auf die „Bitte nicht stören“-Konfiguration"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Mit der Verwendung der Anzeigeberechtigung beginnen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ermöglicht dem Inhaber, die Berechtigungsnutzung für eine App zu beginnen. Sollte für normale Apps nie benötigt werden."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Sensordaten mit hoher Frequenz auslesen"</string>
@@ -1520,7 +1526,7 @@
<string name="gpsNotifTicker" msgid="3207361857637620780">"Standortabfrage von <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="1590033371665669570">"Standortabfrage"</string>
<string name="gpsNotifMessage" msgid="7346649122793758032">"Angefordert von <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
- <string name="gpsVerifYes" msgid="3719843080744112940">"\"Ja\""</string>
+ <string name="gpsVerifYes" msgid="3719843080744112940">"„Ja“"</string>
<string name="gpsVerifNo" msgid="1671201856091564741">"Nein"</string>
<string name="sync_too_many_deletes" msgid="6999440774578705300">"Löschbegrenzung überschritten"</string>
<string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Es sind <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> gelöschte Elemente für <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, Konto <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>, vorhanden. Wie möchtest du fortfahren?"</string>
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Von deinem Administrator aktualisiert"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Von deinem Administrator gelöscht"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n\n• Das dunkle Design wird aktiviert\n• Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt\n\n"<annotation id="url">"Weitere Informationen"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n\n• Das dunkle Design wird aktiviert\n• Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Der Datensparmodus verhindert zum einen, dass manche Apps im Hintergrund Daten senden oder empfangen, sodass weniger Daten verbraucht werden. Zum anderen werden die Datenzugriffe der gerade aktiven App eingeschränkt, was z. B. dazu führen kann, dass Bilder erst angetippt werden müssen, bevor sie sichtbar werden."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivieren"</string>
@@ -1893,7 +1901,7 @@
<string name="zen_mode_until" msgid="2250286190237669079">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (nächste Weckzeit)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Bis zur Deaktivierung"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Bis zur Deaktivierung von \"Bitte nicht stören\""</string>
+ <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Bis zur Deaktivierung von „Bitte nicht stören“"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Minimieren"</string>
<string name="zen_mode_feature_name" msgid="3785547207263754500">"Bitte nicht stören"</string>
@@ -2058,9 +2066,9 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Anrufe und Benachrichtigungen stummgeschaltet"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemänderungen"</string>
<string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Bitte nicht stören"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Neu: Durch \"Bitte nicht stören\" werden Benachrichtigungen nicht mehr angezeigt"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Neu: Durch „Bitte nicht stören“ werden Benachrichtigungen nicht mehr angezeigt"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Für weitere Informationen und zum Ändern tippen."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Bitte nicht stören\" wurde geändert"</string>
+ <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„Bitte nicht stören“ wurde geändert"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Einstellungen"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Diese Benachrichtigung wurde auf „Lautlos“ herabgestuft. Tippe, um Feedback zu geben."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Diese Benachrichtigung wurde hochgestuft. Tippe, um Feedback zu geben."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Diese Benachrichtigung wurde herabgestuft. Tippe, um Feedback zu geben."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Energiesparmodus aktiviert, um die Akkulaufzeit zu verlängern"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Du kannst das Display teilweise vergrößern"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"In den Einstellungen aktivieren"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Schließen"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Zum Fortfahren benötigt, <b><xliff:g id="APP">%s</xliff:g></b> Zugriff auf das Mikrofon deines Geräts."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Zum Fortfahren benötigt <b><xliff:g id="APP">%s</xliff:g></b> Zugriff auf die Kamera deines Geräts."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktivieren"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Datenschutz für Sensoren"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"App-Symbol"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"App-Branding-Hintergrundbild"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index fffa6af..517ba84 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"πρόσβαση στη σωματική σας δραστηριότητα"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Κάμερα"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"γίνεται λήψη φωτογραφιών και εγγραφή βίντεο"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Κοντινές συσκευές Bluetooth"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ανακάλυψη και σύνδεση σε κοντινές συσκευές Bluetooth"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Συσκευές σε κοντινή απόσταση"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ανακάλυψη και σύνδεση σε κοντινές συσκευές"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Αρχεία καταγρ. κλήσ."</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ανάγνωση και εγγραφή αρχείου καταγραφής τηλεφωνικών κλήσεων"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Τηλέφωνο"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Επιτρέπει στην εφαρμογή την ανακάλυψη και τη σύζευξη κοντινών συσκευών Bluetooth"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"σύνδεση σε συζευγμένες συσκευές Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Επιτρέπει στην εφαρμογή τη σύνδεση σε συζευγμένες συσκευές Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"προβολή διαφημίσεων σε κοντινές συσκευές Bluetooth"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Επιτρέπει στην εφαρμογή να προβάλλει διαφημίσεις σε κοντινές συσκευές Bluetooth"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"προσδιορισμός σχετ. θέσης μεταξύ κοντινών συσκευών Ultra-Wideband"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Επιτρέψτε στην εφαρμογή να προσδιορίζει τη σχετική θέση μεταξύ κοντινών συσκευών Ultra-Wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Πληροφορίες προτιμώμενης υπηρεσίας πληρωμών NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Επιτρέπει στην εφαρμογή να λαμβάνει πληροφορίες προτιμώμενης υπηρεσίας πληρωμής NFC, όπως καταχωρημένα βοηθήματα και προορισμό διαδρομής."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ελέγχει την Επικοινωνία κοντινού πεδίου (FNC)"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ενημερώθηκε από τον διαχειριστή σας"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Διαγράφηκε από τον διαχειριστή σας"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Για την επέκταση της διάρκειας ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας:\n\n• Ενεργοποιεί το Σκούρο θέμα\n• Απενεργοποιεί ή περιορίζει τη δραστηριότητα παρασκηνίου, ορισμένα οπτικά εφέ και άλλες λειτουργίες όπως την εντολή Hey Google\n\n"<annotation id="url">"Μάθετε περισσότερα"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Για την επέκταση της διάρκειας ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας:\n\n• Ενεργοποιεί το Σκούρο θέμα\n• Απενεργοποιεί ή περιορίζει τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ και άλλες λειτουργίες, όπως την εντολή Hey Google"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ενεργ.Εξοικονόμησης δεδομένων;"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ενεργοποίηση"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Αυτή η ειδοποίηση υποβιβάστηκε στις Αθόρυβες. Πατήστε για να υποβάλετε σχόλια."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Αυτή η ειδοποίηση κατατάχθηκε ψηλότερα. Πατήστε για να υποβάλετε σχόλια."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Αυτή η ειδοποίηση κατατάχθηκε χαμηλότερα. Πατήστε για να υποβάλετε σχόλια."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Μπορείτε πλέον να μεγεθύνετε μέρος της οθόνης σας"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ενεργοποίηση στις Ρυθμίσεις"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Παράβλεψη"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Για να συνεχίσετε, η εφαρμογή <b><xliff:g id="APP">%s</xliff:g></b> χρειάζεται πρόσβαση στο μικρόφωνο της συσκευής σας."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Για να συνεχίσετε, η εφαρμογή <b><xliff:g id="APP">%s</xliff:g></b> χρειάζεται πρόσβαση στην κάμερα της συσκευής σας."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Ενεργοποίηση"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Κατάργηση αποκλεισμού μικροφώνου συσκευής"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Κατάργηση αποκλεισμού κάμερας συσκευής"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Για την εφαρμογή <b><xliff:g id="APP">%s</xliff:g></b> και όλες τις εφαρμογές και υπηρεσίες"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Κατάργηση αποκλεισμού"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Απόρρητο αισθητήρα"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Εικονίδιο εφαρμογής"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Εικόνα επωνυμίας εφαρμογής"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index afa48b9..e841e27 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"access your physical activity"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nearby Bluetooth devices"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"discover and connect to nearby Bluetooth devices"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nearby devices"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"discover and connect to nearby devices"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"advertise to nearby Bluetooth devices"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Allows the app to advertise to nearby Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determine relative position between nearby ultra-wideband devices"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Allow the app to determine relative position between nearby ultra-wideband devices"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you\'re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device microphone."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device’s camera."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Turn on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> and all apps and services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor privacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Application icon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Application branding image"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 7f00781..52d6dc5 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"access your physical activity"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nearby Bluetooth devices"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"discover and connect to nearby Bluetooth devices"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nearby devices"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"discover and connect to nearby devices"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"advertise to nearby Bluetooth devices"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Allows the app to advertise to nearby Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determine relative position between nearby ultra-wideband devices"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Allow the app to determine relative position between nearby ultra-wideband devices"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you\'re currently using can access data, but may do so less frequently. This may mean, for example, that images don\'t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device microphone."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device’s camera."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Turn on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> and all apps and services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor privacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Application icon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Application branding image"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 42a9bb0..a25f29c 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"access your physical activity"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nearby Bluetooth devices"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"discover and connect to nearby Bluetooth devices"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nearby devices"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"discover and connect to nearby devices"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"advertise to nearby Bluetooth devices"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Allows the app to advertise to nearby Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determine relative position between nearby ultra-wideband devices"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Allow the app to determine relative position between nearby ultra-wideband devices"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device microphone."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device’s camera."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Turn on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> and all apps and services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor privacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Application icon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Application branding image"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 7a6833a..dbb72e9 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"access your physical activity"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nearby Bluetooth devices"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"discover and connect to nearby Bluetooth devices"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nearby devices"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"discover and connect to nearby devices"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"advertise to nearby Bluetooth devices"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Allows the app to advertise to nearby Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determine relative position between nearby ultra-wideband devices"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Allow the app to determine relative position between nearby ultra-wideband devices"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device microphone."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device’s camera."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Turn on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> and all apps and services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor privacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Application icon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Application branding image"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 2da3b95..0c50419 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"access your physical activity"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nearby Bluetooth Devices"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"discover and connect to nearby Bluetooth devices"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nearby devices"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"discover and connect to nearby devices"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call log"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"advertise to nearby Bluetooth devices"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Allows the app to advertise to nearby Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determine relative position between nearby Ultra-Wideband devices"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Allow the app to determine relative position between nearby Ultra-Wideband devices"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC Payment Service Information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred nfc payment service information like registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near Field Communication"</string>
@@ -1852,8 +1852,8 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects, and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation>""</string>
- <string name="battery_saver_description" msgid="6794188153647295212">"To extend battery life, Battery Saver:\n\n• Turns on Dark theme\n• Turns off or restricts background activity, some visual effects, and other features like “Hey Google”"</string>
+ <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation>""</string>
+ <string name="battery_saver_description" msgid="7695751399533397741">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like “Hey Google”."</string>
<string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2072,6 +2072,12 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to Silent. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
+ <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Try enhanced notifications"</string>
+ <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"To keep getting suggested actions, replies, and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported."</string>
+ <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Turn on"</string>
+ <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Not now"</string>
+ <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2259,9 +2265,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in Settings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device microphone."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"To continue, <b><xliff:g id="APP">%s</xliff:g></b> needs access to your device’s camera."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Turn on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> and all apps and services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensor Privacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Application icon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Application branding image"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index c511484..128e2fb 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"acceder a tu actividad física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tomar fotografías y grabar videos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth cercanos"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"Descubre dispositivos Bluetooth cercanos y conéctate a ellos"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos cercanos"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"descubrir y conectarse a dispositivos cercanos"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Llamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"leer y escribir el registro de llamadas telefónicas"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Teléfono"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que la app descubra dispositivos Bluetooth cercanos y se conecte a ellos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que la app se conecte a dispositivos Bluetooth vinculados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"mostrar anuncios a dispositivos Bluetooth cercanos"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que la app muestre anuncios a dispositivos Bluetooth cercanos"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar posición entre disposit. Ultra Wideband"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permite que la app determine la posición relativa con dispositivos Ultra Wideband cercanos"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información sobre servicio de pago NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar la Transmisión de datos en proximidad"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Tu administrador actualizó este paquete"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Tu administrador borró este paquete"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para extender la duración de batería, el Ahorro de batería hace lo siguiente:\n\n• Activa el Tema oscuro.\n• Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\".\n\n"<annotation id="url">"Más información"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para extender la duración de batería, el Ahorro de batería hace lo siguiente:\n\n• Activa el Tema oscuro.\n• Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"¿Deseas activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificación descendió de a Silenciada. Presiona para enviar comentarios."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación recibió una clasificación superior. Presiona para enviar comentarios."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación recibió una clasificación inferior. Presiona para enviar comentarios."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación de información del modo de Rutinas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Es posible que la batería se agote antes de la carga habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ahora puedes ampliar parte de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Configuración"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Descartar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b&gt necesita acceso al micrófono del dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b&gt necesita acceso a la cámara del dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloquear el micrófono del dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloquear la cámara del dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para <b><xliff:g id="APP">%s</xliff:g></b> y todos los servicios y las apps"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidad del sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ícono de la aplicación"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imagen de marca de la aplicación"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 7a9971a..7bed3e6 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"acceder a tu actividad física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"hacer fotos y grabar vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth cercanos"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"detecta y conéctate a dispositivos Bluetooth cercanos"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos cercanos"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"detectar y conectarse a dispositivos cercanos"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registros de llamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"leer y escribir en el registro de llamadas del teléfono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Teléfono"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que la aplicación detecte y vincule dispositivos Bluetooth cercanos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que la aplicación se conecte a dispositivos Bluetooth vinculados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"mostrar anuncios a dispositivos Bluetooth cercanos"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que la aplicación muestre anuncios a dispositivos Bluetooth cercanos"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"calcular posición de dispositivos de banda ultraancha cercanos"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permite que la aplicación determine la posición relativa de los dispositivos de banda ultraancha cercanos"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información sobre el servicio de pago por NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la aplicación obtenga información sobre el servicio de pago por NFC preferido, como identificadores de aplicación registrados y destinos de rutas."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicación de campo cercano (NFC)"</string>
@@ -1386,7 +1386,7 @@
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"COMPARTIR"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"RECHAZAR"</string>
<string name="select_input_method" msgid="3971267998568587025">"Selecciona un método de entrada"</string>
- <string name="show_ime" msgid="6406112007347443383">"Lo mantiene en pantalla mientras el teclado físico está activo"</string>
+ <string name="show_ime" msgid="6406112007347443383">"Mientras el teclado físico está activo"</string>
<string name="hardware" msgid="1800597768237606953">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"Configura el teclado físico"</string>
<string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"Toca para seleccionar el idioma y el diseño"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado por el administrador"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado por el administrador"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para que la batería dure más, Ahorro de batería hace lo siguiente:\n\n• Activa el tema oscuro.\n• Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Ok Google\".\n\n"<annotation id="url">"Más información"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para que la batería dure más, Ahorro de batería hace lo siguiente:\n\n• Activa el tema oscuro.\n• Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"El modo Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que puede reducir el uso de datos. Una aplicación activa puede acceder a los datos, aunque con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"La importancia de esta notificación ha disminuido a Silencio. Toca para enviar comentarios."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación aparecerá en una posición más alta. Toca para enviar comentarios."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación aparecerá en una posición más baja. Toca para enviar comentarios."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación sobre el modo rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Quizás se agote la batería antes de lo habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se ha activado el modo Ahorro de batería para aumentar la duración de la batería"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ahora puedes ampliar una parte de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Ajustes"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Cerrar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> necesita tener acceso al micrófono del dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> necesita tener acceso a la cámara del dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloquea el micrófono del dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloquea la cámara del dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para que <b><xliff:g id="APP">%s</xliff:g></b> y todos los servicios y las aplicaciones puedan acceder"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidad del sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icono de aplicación"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imagen de marca de aplicación"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 17e3364..9672e84 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"juurdepääs teie füüsilisele tegevusele"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kaamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"pildistamine ja video salvestamine"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Lähedalasuvad Bluetooth-seadmed"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"lähedalasuvate Bluetooth-seadmete avastamine ja nendega ühenduse loomine"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Lähedalasuvad seadmed"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Avastada lähedalasuvaid seadmeid ja luua nendega ühenduse."</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Kõnelogid"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"telefoni kõnelogi lugemine ja kirjutamine"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lubab rakendusel avastada lähedalasuvaid Bluetooth-seadmeid ja nendega siduda"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"seotud Bluetooth-seadmetega ühenduse loomine"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lubab rakendusel luua ühenduse seotud Bluetooth-seadmetega"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"lähedalolevatele Bluetooth-seadmetele reklaamimine"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Lubab rakendusel läheduses olevatele Bluetooth-seadmetele reklaamida"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"Määrata lähedalasuvate ülilairibaühendust kasutavate seadmete suhtelise kauguse üksteisest."</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Võimaldab rakendusel määrata lähedalasuvate ülilairibaühendust kasutavate seadmete suhtelise kauguse üksteisest"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Eelistatud NFC-makseteenuse teave"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Võimaldab rakendusel hankida eelistatud NFC-makseteenuse teavet (nt registreeritud abi ja marsruudi sihtkoht)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"lähiväljaside juhtimine"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Administraator on seda värskendanud"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Administraator on selle kustutanud"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n\n• Lülitab sisse tumeda teema.\n• Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Ok Google”) või piirab neid.\n\n"<annotation id="url">"Lisateave"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n\n• Lülitab sisse tumeda teema.\n• Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Ok Google”) või piirab neid."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Andmekasutuse vähendamiseks keelab andmemahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks pildid kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Lülitada andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Lülita sisse"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Sellele märguandele määrati prioriteet Vaikne. Puudutage tagasiside andmiseks."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Sellele märguandele määrati kõrgem prioriteet. Puudutage tagasiside andmiseks."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Sellele märguandele määrati madalam prioriteet. Puudutage tagasiside andmiseks."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutiinirežiimi teabe märguanne"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Saate nüüd suurendada osa oma ekraanikuvast"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Lülitage sisse menüüs Seaded"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Loobu"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Jätkamiseks vajab rakendus <b><xliff:g id="APP">%s</xliff:g></b> juurdepääsu teie seadme mikrofonile."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Jätkamiseks vajab rakendus <b><xliff:g id="APP">%s</xliff:g></b> juurdepääsu teie seadme kaamerale."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Lülita sisse"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Tühistage seadme mikrofoni blokeerimine"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Tühistage seadme kaamera blokeerimine"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Rakenduse <b><xliff:g id="APP">%s</xliff:g></b> ja kõikide rakenduste ning teenuste puhul"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Tühista blokeerimine"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Anduri privaatsus"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Rakenduse ikoon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Rakenduse brändi kujutis"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index e04dcbb..08c4c06 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"jarduera fisikoa atzitu"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"atera argazkiak eta grabatu bideoak"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Inguruko Bluetooth bidezko gailuak"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"inguruko Bluetooth bidezko gailuak hauteman eta haietara konektatu"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Inguruko gailuak"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"inguruko gailuak hauteman eta haietara konektatu"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Deien erregistroa"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"irakurri telefonoko deien erregistroa eta idatzi bertan"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefonoa"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Inguruko Bluetooth bidezko gailuak hautemateko eta haiekin parekatzeko baimena ematen die aplikazioei"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"parekatutako Bluetooth bidezko gailuetara konektatu"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Parekatutako Bluetooth bidezko gailuetara konektatzeko baimena ematen die aplikazioei"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"inguruko Bluetooth bidezko gailuei publizitatea erakutsi"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Inguruko Bluetooth bidezko gailuei publizitatea erakusteko baimena ematen die aplikazioei"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"banda ultrazabala darabilten inguruko gailuen arteko distantzia erlatiboa zehaztu"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Banda ultrazabala darabilten inguruko gailuen arteko distantzia erlatiboa zehazteko baimena ematen die aplikazioei"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC bidezko ordainketa-zerbitzu lehenetsiari buruzko informazioa"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Aplikazioari baimena ematen dio NFC bidezko ordainketa-zerbitzu lehenetsiari buruzko informazioa jasotzeko, hala nola erregistratutako laguntzaileak eta ibilbidearen helmuga."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolatu Near Field Communication komunikazioa"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Administratzaileak eguneratu du"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratzaileak ezabatu du"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Ados"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n\n• Gai iluna aktibatzen du.\n• Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\".\n\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n\n• Gai iluna aktibatzen du.\n• Atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk desaktibatzen edo murrizten ditu, hala nola \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Une honetan erabiltzen ari zaren aplikazioak atzitu egin ahal izango ditu datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Datu-aurrezlea aktibatu nahi duzu?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktibatu"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Isilarazi da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Mailaz igo da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Mailaz jaitsi da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohitura moduaren informazio-jakinarazpena"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baliteke bateria ohi baino lehenago agortzea"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bateria-aurrezlea aktibatuta dago bateriaren iraupena luzatzeko"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Orain, pantailaren zati bat handi dezakezu"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktibatu ezarpenetan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Baztertu"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Aurrera egiteko, gailuaren mikrofonoa atzitzeko baimena behar du <b><xliff:g id="APP">%s</xliff:g></b> aplikazioak."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Aurrera egiteko, gailuaren kamera atzitzeko baimena behar du <b><xliff:g id="APP">%s</xliff:g></b> aplikazioak."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktibatu"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desblokeatu gailuaren mikrofonoa"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desblokeatu gailuaren kamera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> aplikazioak eta aplikazio eta zerbitzu guztiek erabili ahal izateko"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desblokeatu"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sentsoreen pribatutasuna"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Aplikazioaren ikonoa"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Aplikazioaren marka-irudia"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c693c24..fc9162a 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"دسترسی به فعالیت فیزیکی شما"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"دوربین"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"عکس گرفتن و فیلمبرداری"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"دستگاههای بلوتوث اطراف"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"پیدا کردن دستگاههای بلوتوث اطراف و اتصال به آنها"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"دستگاههای اطراف"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"پیدا کردن دستگاههای اطراف و متصل شدن به آنها"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"گزارشهای تماس"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"خواندن و نوشتن گزارش تماس تلفنی"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"تلفن"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"به برنامه اجازه میدهد دستگاههای بلوتوث اطراف را پیدا کند و با آنها مرتبط شود"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"اتصال به دستگاههای بلوتوث مرتبطشده"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"به برنامه اجازه میدهد به دستگاههای بلوتوث مرتبطشده متصل شود"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"تبلیغ در دستگاههای بلوتوث اطراف"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"برنامه مجاز میشود در دستگاههای بلوتوث اطراف تبلیغ کند."</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"مشخص کردن موقعیت نسبی بین دستگاههای باند فوقوسیع اطراف"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"به برنامه اجازه داده میشود موقعیت نسبی بین دستگاههای باند فوقوسیع اطراف را مشخص کند"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"به برنامه اجازه میدهد اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)، مانند کمکهای ثبتشده و مقصد مسیر را دریافت کند."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"کنترل ارتباط راه نزدیک"</string>
@@ -1852,9 +1852,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"توسط سرپرست سیستم بهروزرسانی شد"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"توسط سرپرست سیستم حذف شد"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"تأیید"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"برای افزایش عمر باتری، «بهینهسازی باتری»:\n\n• «طرح زمینه تیره» را روشن میکند\n• فعالیت پسزمینه، برخی جلوههای بصری، و دیگر ویژگیها مانند «Ok Google» را خاموش یا محدود میکند\n\n"<annotation id="url">"بیشتر بدانید"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"برای افزایش عمر باتری، «بهینهسازی باتری»:\n\n• «طرح زمینه تیره» را روشن میکند\n• فعالیت پسزمینه، برخی جلوههای بصری، و دیگر ویژگیها مثل «Ok Google» را خاموش یا محدود میکند"</string>
- <string name="data_saver_description" msgid="4995164271550590517">"«صرفهجویی داده»، برای کمک به کاهش مصرف داده، از ارسال و دریافت داده در پسزمینه ازطرف بعضی برنامهها جلوگیری میکند. برنامهای که درحالحاضر استفاده میکنید میتواند به دادهها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تازمانیکه روی آنها ضربه نزنید نشان داده نمیشوند."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"برای کمک به کاهش مصرف داده، «صرفهجویی داده» از ارسال و دریافت داده در پسزمینه در بعضی برنامهها جلوگیری میکند. برنامهای که درحالحاضر استفاده میکنید میتواند به دادهها دسترسی داشته باشد اما دفعات دسترسی آن محدود است. این میتواند به این معنی باشد که، برای مثال، تصاویر تازمانیکه روی آنها ضربه نزنید نشان داده نمیشوند."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"«صرفهجویی داده» روشن شود؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"روشن کردن"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"این اعلان به «بیصدا» تنزل داده شد. برای ارائه بازخورد، ضربه بزنید."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"این اعلان در رتبه بالاتری قرار گرفت. برای ارائه بازخورد، ضربه بزنید."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"این اعلان در رتبه پایینتری قرار گرفت. برای ارائه بازخورد، ضربه بزنید."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"اعلان اطلاعات حالت روال معمول"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"جهت افزایش عمر باتری، «بهینهسازی باتری» فعال شد"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"اکنون میتوانید بخشی از صفحه را درشتنمایی کنید"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"روشن کردن در «تنظیمات»"</string>
<string name="dismiss_action" msgid="1728820550388704784">"رد شدن"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"برای ادامه دادن، <b><xliff:g id="APP">%s</xliff:g></b> باید به میکروفون دستگاه دسترسی داشته باشد."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"برای ادامه دادن، <b><xliff:g id="APP">%s</xliff:g></b> باید به دوربین دستگاه دسترسی داشته باشد."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"روشن کردن"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"لغو انسداد میکروفون دستگاه"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"لغو انسداد دوربین دستگاه"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"برای <b><xliff:g id="APP">%s</xliff:g></b> و همه برنامهها و سرویسها"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"لغو انسداد"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"حریمخصوصی حسگر"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"نماد برنامه"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"تصویر نمانامسازی برنامه"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 232883b..4ff7593 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"nähdä liikkumistietosi"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ottaa kuvia ja videoita"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Lähellä olevat Bluetooth-laitteet"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"löytää lähellä olevia Bluetooth-laitteita ja yhdistää niihin"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Lähellä olevat laitteet"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"löytää lähellä olevia laitteita ja yhdistää niihin"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Puhelulokit"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lukea puhelulokia ja kirjoittaa siihen"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Puhelin"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Sallii sovelluksen löytää lähellä olevia Bluetooth-laitteita ja muodostaa niistä laitepareja"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"yhdistää pariliitettyihin Bluetooth-laitteisiin"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Sallii sovelluksen muodostaa yhteyden pariliitettyihin Bluetooth-laitteisiin"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"määrittää UVB:ta käyttävien laitteiden suhteellisen sijainnin"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Sallii sovelluksen määrittää UVB-taajuutta käyttävien laitteiden sijainnin suhteessa toisiinsa"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Ensisijaiset NFC-maksupalvelutiedot"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Sallii sovelluksen noutaa tietoja rekisteröidyistä sovellustunnuksista, maksureitin kohteesta ja muita ensisijaisia NFC-maksupalvelutietoja."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"hallitse Near Field Communication -tunnistusta"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Järjestelmänvalvoja päivitti tämän."</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Järjestelmänvalvoja poisti tämän."</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Parantaakseen akunkestoa Virransäästö\n\n• laittaa tumman teeman päälle\n• laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Ok Google).\n\n"<annotation id="url">"Lue lisää"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Parantaakseen akunkestoa Virransäästö\n\n• laittaa tumman teeman päälle\n• laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Ok Google)."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Otetaanko Data Saver käyttöön?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ota käyttöön"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Tämä ilmoitus hiljennettiin. Lähetä palautetta napauttamalla."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Tämän ilmoituksen tasoa nostettiin. Lähetä palautetta napauttamalla."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Tämän ilmoituksen tasoa laskettiin. Lähetä palautetta napauttamalla."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohjelmatilan tietoilmoitus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Voit nyt suurentaa näytön osan"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Laita päälle asetuksista"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hylkää"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Jotta voit jatkaa, <b><xliff:g id="APP">%s</xliff:g></b> tarvitsee pääsyn laitteesi mikrofoniin."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Jotta voit jatkaa, <b><xliff:g id="APP">%s</xliff:g></b> tarvitsee pääsyn laitteesi kameraan."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Laita päälle"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Anturin tietosuoja"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Sovelluskuvake"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Sovelluksen tuotemerkkikuva"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index b03b227..20365d0 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"accéder à vos activités physiques"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"prendre des photos et filmer des vidéos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Appareils Bluetooth à proximité"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"découvrir les appareils Bluetooth à proximité et s\'y connecter"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Appareils à proximité"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"découvrir les appareils à proximité et s\'y connecter"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Journaux d\'appels"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lire et écrire le journal des appels téléphoniques"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Téléphone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permet à l\'application de découvrir les appareils Bluetooth à proximité et de s\'y connecter"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"se connecter aux appareils Bluetooth associés"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permet à l\'application de se connecter aux appareils Bluetooth associés"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"envoyer annonces aux appareils Bluetooth à proxim."</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permet à l\'application d\'envoyer des annonces aux appareils Bluetooth à proximité"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"déterminer la position relative entre des appareils à bande ultralarge à proximité"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Autorisez l\'application à déterminer la position relative entre des appareils à bande ultralarge à proximité"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Information sur le service préféré de paiement NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement NFC comme les aides enregistrées et la route de destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"gérer la communication en champ proche"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Mise à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n\n•·Active le thème sombre\n•·Désactive ou limite l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »\n\n"<annotation id="url">"En savoir plus"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n\n•·Active le thème sombre\n•·Désactive ou limite l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Cette notification a été rétrogradée à Silencieuse. Touchez pour envoyer des commentaires."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Cette notification a été élevée d\'un niveau. Touchez pour envoyer des commentaires."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Cette notification a été abaissée d\'un niveau. Touchez pour envoyer des commentaires."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez agrandir une partie votre écran."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Fermer"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pour continuer, vous devez accorder l\'accès au microphone de votre appareil à l\'application <b><xliff:g id="APP">%s</xliff:g></b>."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Pour continuer, vous devez accorder l\'accès à l\'appareil photo de votre appareil à l\'application <b><xliff:g id="APP">%s</xliff:g></b>."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activer"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Débloquer le microphone de l\'appareil"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Débloquer l\'appareil photo de l\'appareil"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Pour <b><xliff:g id="APP">%s</xliff:g></b> ainsi que toutes les applications et tous les services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Débloquer"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Confidentialité des capteurs"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icône de l\'application"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Image de marque de l\'application"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index ff3cdf8..7afe476 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"accéder aux données d\'activité physique"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"prendre des photos et enregistrer des vidéos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Appareils Bluetooth à proximité"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"détecter les appareils Bluetooth à proximité et s\'y connecter"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Appareils à proximité"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"détecter des appareils à proximité et s\'y connecter"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Journaux d\'appels"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"Consulter et modifier les journaux d\'appels du téléphone"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Téléphone"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Autorise l\'appli à détecter et à associer les appareils Bluetooth à proximité"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"se connecter aux appareils Bluetooth associés"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Autorise l\'appli à se connecter à des appareils Bluetooth associés"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"déterminer position relative entre appareils ultra-wideband à proximité"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Autoriser l\'appli à déterminer la position relative entre des appareils ultra-wideband à proximité"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informations sur le service de paiement NFC préféré"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir des informations sur le service de paiement NFC préféré, y compris les ID d\'applications et les destinations de routage enregistrés."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"contrôler la communication en champ proche"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Mis à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n\n • active le thème sombre ;\n • désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Hey Google\".\n\n"<annotation id="url">"En savoir plus"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n\n• active le thème sombre ;\n • désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Hey Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Cette notification a été abaissée à la catégorie \"Silencieux\". Appuyez ici pour donner votre avis."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Cette notification a été élevée d\'un niveau. Appuyez ici pour donner votre avis."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Cette notification a été abaissée d\'un niveau. Appuyez ici pour donner votre avis."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Vous risquez d\'être à court de batterie plus tôt que prévu"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Économiseur de batterie activé pour prolonger l\'autonomie"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez désormais agrandir une partie de l\'écran"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Fermer"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pour continuer, <b><xliff:g id="APP">%s</xliff:g></b> a besoin d\'accéder au micro de votre appareil."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Pour continuer, <b><xliff:g id="APP">%s</xliff:g></b> a besoin d\'accéder à l\'appareil photo de votre appareil."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activer"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Confidentialité du capteur"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icône de l\'application"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Image de branding de l\'application"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 425e76b..123419b 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -174,7 +174,7 @@
<string name="httpErrorTooManyRequests" msgid="2149677715552037198">"Estanse a procesar demasiadas solicitudes. Téntao de novo máis tarde."</string>
<string name="notification_title" msgid="5783748077084481121">"Erro de inicio de sesión en <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="2341041749565687871">"Sincronizar"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="5766411446676388623">"Non se puido realizar a sincronización"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="5766411446676388623">"Non se puido realizar a vinculación"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="4562226280528716090">"Tentáronse eliminar demasiados elementos de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="5557552311566179924">"O almacenamento da tableta está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="watch" msgid="3479447988234030194">"O almacenamento do reloxo está cheo. Elimina algúns ficheiros para liberar espazo."</string>
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"acceder á túa actividade física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tirar fotos e gravar vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth próximos"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"detectar dispositivos Bluetooth próximos e conectarse a eles"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos próximos"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"detectar dispositivos próximos e conectarse a eles"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Rexistros de chamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ler e editar o rexistro de chamadas do teléfono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Teléfono"</string>
@@ -368,7 +368,7 @@
<string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"ler mensaxes de difusión móbil"</string>
<string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Permite á aplicación ler mensaxes de difusión móbil recibidas polo teu dispositivo. As alertas de difusión móbil envíanse nalgunhas localizacións para avisar de situacións de emerxencia. É posible que aplicacións maliciosas afecten ao rendemento ou funcionamento do teu dispositivo cando se recibe unha difusión móbil de emerxencia."</string>
<string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"ler feeds subscritos"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"Permite á aplicación obter detalles acerca dos feeds sincronizados actualmente."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"Permite á aplicación obter detalles acerca dos feeds vinculados actualmente."</string>
<string name="permlab_sendSms" msgid="7757368721742014252">"enviar e consultar mensaxes de SMS"</string>
<string name="permdesc_sendSms" msgid="6757089798435130769">"Permite á aplicación enviar mensaxes SMS. É posible que esta acción implique custos inesperados. É posible que as aplicacións maliciosas che custen diñeiro debido ao envío de mensaxes sen a túa confirmación."</string>
<string name="permlab_readSms" msgid="5164176626258800297">"ler as túas mensaxes de texto (SMS ou MMS)"</string>
@@ -521,27 +521,27 @@
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"Permite que a aplicación reciba paquetes enviados a todos os dispositivos a través dunha rede wifi utilizando enderezos de emisión múltiple, non só o teu dispositivo Android TV. Utiliza máis enerxía que o modo que non inclúe a emisión múltiple."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"Permite á aplicación recibir paquetes enviados a todos os dispositivos a través dunha rede wifi utilizando enderezos de multidifusión, non só o teu teléfono. Utiliza máis enerxía que o modo que non inclúe a multidifusión."</string>
<string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"acceder á configuración de Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"Permite á aplicación configurar a tableta Bluetooth local e descubrir e sincronizar con dispositivos remotos."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"Permite á aplicación configurar a tableta Bluetooth local e descubrir e vincular con dispositivos remotos."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"Permite que a aplicación configure o Bluetooth no dispositivo Android TV, descubra dispositivos remotos e se vincule con eles."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Permite á aplicación configurar o teléfono Bluetooth local e descubrir e sincronizar con dispositivos remotos."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Permite á aplicación configurar o teléfono Bluetooth local e descubrir e vincular con dispositivos remotos."</string>
<string name="permlab_accessWimaxState" msgid="7029563339012437434">"conectar e desconectar de WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="5372734776802067708">"Permite á aplicación determinar se WiMAX está activado e obter información acerca das redes WiMAX que están conectadas."</string>
<string name="permlab_changeWimaxState" msgid="6223305780806267462">"cambiar estado de WiMAX"</string>
<string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"Permite á aplicación conectar e desconectar a tableta de redes WiMAX."</string>
<string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"Permite que a aplicación conecte e desconecte o dispositivo Android TV de redes WiMAX."</string>
<string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Permite á aplicación conectar e desconectar o teléfono de redes WiMAX."</string>
- <string name="permlab_bluetooth" msgid="586333280736937209">"sincronizar con dispositivos Bluetooth"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Permite á aplicación ver a configuración do Bluetooth na tableta e efectuar e aceptar conexións con dispositivos sincronizados."</string>
+ <string name="permlab_bluetooth" msgid="586333280736937209">"vincular con dispositivos Bluetooth"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Permite á aplicación ver a configuración do Bluetooth na tableta e efectuar e aceptar conexións con dispositivos vinculados."</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Permite que a aplicación consulte a configuración do Bluetooth no dispositivo Android TV, e efectúe e acepte conexións con dispositivos vinculados."</string>
- <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Permite á aplicación ver a configuración do Bluetooth no teléfono e efectuar e aceptar conexións con dispositivos sincronizados."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Permite á aplicación ver a configuración do Bluetooth no teléfono e efectuar e aceptar conexións con dispositivos vinculados."</string>
<string name="permlab_bluetooth_scan" msgid="5402587142833124594">"detectar e vincular dispositivos Bluetooth"</string>
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que a aplicación detecte dispositivos Bluetooth próximos e se vincule a eles"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que a aplicación se conecte aos dispositivos Bluetooth vinculados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"enviar anuncios a dispositivos Bluetooth próximos"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que a aplicación envíe anuncios a dispositivos Bluetooth próximos"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar posición entre dispositivos próximos"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permite que a aplicación determine a posición relativa entre os dispositivos próximos que usen banda ultralarga"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información do servizo de pago de NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a aplicación obteña información do servizo de pago de NFC preferido, como as axudas rexistradas e o destino da ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Near Field Communication"</string>
@@ -661,12 +661,12 @@
<string-array name="face_error_vendor">
</string-array>
<string name="face_icon_content_description" msgid="465030547475916280">"Icona cara"</string>
- <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler a configuración de sincronización"</string>
- <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite á aplicación ler a configuración de sincronización dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se sincroniza cunha conta."</string>
- <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"activar e desactivar a sincronización"</string>
- <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"Permite a unha aplicación modificar a configuración de sincronización dunha conta. Por exemplo, esta acción pode utilizarse para activar a sincronización da aplicación Contactos cunha conta."</string>
- <string name="permlab_readSyncStats" msgid="3747407238320105332">"ler as estatísticas de sincronización"</string>
- <string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite a unha aplicación ler as estatísticas de sincronización dunha conta, incluído o historial de eventos de sincronización e a cantidade de datos sincronizados."</string>
+ <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler a configuración de vinculación"</string>
+ <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite á aplicación ler a configuración de vinculación dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se vincula cunha conta."</string>
+ <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"activar e desactivar a vinculación"</string>
+ <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"Permite a unha aplicación modificar a configuración de vinculación dunha conta. Por exemplo, esta acción pode utilizarse para activar a vinculación da aplicación Contactos cunha conta."</string>
+ <string name="permlab_readSyncStats" msgid="3747407238320105332">"ler as estatísticas de vinculación"</string>
+ <string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite a unha aplicación ler as estatísticas de vinculación dunha conta, incluído o historial de eventos de vinculación e a cantidade de datos vinculados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ler o almacenamento compartido"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite á aplicación ler o almacenamento compartido."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modificar ou eliminar o almacenamento compartido"</string>
@@ -1852,9 +1852,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado polo teu administrador"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado polo teu administrador"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para aumentar a duración da batería, a función Aforro de batería fai o seguinte:\n\n• Activa o tema escuro.\n• Desactiva ou restrinxe a actividade en segundo plano, algúns efectos visuais e outras funcións, como \"Ok Google\".\n\n"<annotation id="url">"Máis información"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para aumentar a duración da batería, a función Aforro de batería fai o seguinte:\n\n• Activa o tema escuro\n• Desactiva ou restrinxe a actividade en segundo plano, algúns efectos visuais e outras funcións, como \"Ok Google\""</string>
- <string name="data_saver_description" msgid="4995164271550590517">"Para contribuír a reducir o uso de datos, o aforro de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"Para contribuír a reducir o uso de datos, o aforro de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, poida que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Queres activar o aforro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"O nivel desta notificación diminuíu a Silenciosa. Toca para compartir a túa opinión."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación clasificouse nun nivel superior. Toca para compartir a túa opinión."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación clasificouse nun nivel inferior. Toca para compartir a túa opinión."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación da información do modo de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A batería pode esgotarse antes do habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Xa podes ampliar parte da pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Configuración"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignorar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> precisa acceder ao micrófono do dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> precisa acceder á cámara do dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloquea o micrófono do dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloquea a cámara do dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para <b><xliff:g id="APP">%s</xliff:g></b> e todas as aplicacións e servizos"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidade do sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icona de aplicación"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imaxe de marca da aplicación"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 956a39c..f0e3f77 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"તમારી શારીરિક પ્રવૃત્તિને ઍક્સેસ કરવી"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"કૅમેરા"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ચિત્રો લેવાની અને વીડિઓ રેકોર્ડ કરવાની"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"આસપાસના બ્લૂટૂથ ડિવાઇસ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"આસપાસના બ્લૂટૂથ ડિવાઇસ શોધો અને તેમની સાથે કનેક્ટ કરો"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"કૉલ લૉગ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ફોન કૉલ લૉગ વાંચો અને લખો"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ફોન"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ઍપને આસપાસના બ્લૂટૂથ ડિવાઇસ શોધવાની અને તેની સાથે જોડી કરવાની મંજૂરી આપે છે"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"જોડી કરેલા બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટ કરો"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ઍપને જોડી કરેલા બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટ કરવાની મંજૂરી આપે છે"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1606,7 +1612,7 @@
<string name="sending" msgid="206925243621664438">"મોકલી રહ્યાં છે…"</string>
<string name="launchBrowserDefault" msgid="6328349989932924119">"બ્રાઉઝર લોન્ચ કરીએ?"</string>
<string name="SetupCallDefault" msgid="5581740063237175247">"કૉલ સ્વીકારીએ?"</string>
- <string name="activity_resolver_use_always" msgid="5575222334666843269">"હંમેશા"</string>
+ <string name="activity_resolver_use_always" msgid="5575222334666843269">"હંમેશાં"</string>
<string name="activity_resolver_use_once" msgid="948462794469672658">"ફક્ત એક વાર"</string>
<string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s કાર્ય પ્રોફાઇલનું સમર્થન કરતું નથી"</string>
<string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"ટેબ્લેટ"</string>
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ઓકે"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n\n• ઘેરી થીમ ચાલુ કરે છે\n• બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “Ok Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે\n\n"<annotation id="url">"વધુ જાણો"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n\n• ઘેરી થીમ ચાલુ કરે છે\n• બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “ઓકે Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપને બૅકગ્રાઉન્ડમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ડેટા સેવર ચાલુ કરીએ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ચાલુ કરો"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"નોટિફિકેશનને સાઇલન્ટ પર અવનત કરવામાં આવ્યું. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"આ નોટિફિકેશનને ઉપલી રેંક આપવામાં આવી. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"આ નોટિફિકેશનને નીચલી રેંક આપવામાં આવી. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"હવે તમે તમારી સ્ક્રીનનો અમુક ભાગ મોટો કરી શકો છો"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"સેટિંગમાં ચાલુ કરો"</string>
<string name="dismiss_action" msgid="1728820550388704784">"છોડી દો"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ચાલુ રાખવા માટે, <b><xliff:g id="APP">%s</xliff:g></b>ને તમારા ડિવાઇસના માઇક્રોફોનના ઍક્સેસની જરૂર છે."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ચાલુ રાખવા માટે, <b><xliff:g id="APP">%s</xliff:g></b>ને તમારા ડિવાઇસના કૅમેરાના ઍક્સેસની જરૂર છે."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ચાલુ કરો"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"સેન્સર પ્રાઇવસી સંબંધિત નોટિફિકેશન"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ઍપ્લિકેશનનું આઇકન"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ઍપ્લિકેશનની બ્રાંડિંગ છબી"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index e01465b..8def350 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"शारीरिक गतिविधि की जानकारी पा सकता है"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"कैमरा"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"चित्र लेने और वीडियो रिकॉर्ड करने"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"आस-पास मौजूद ब्लूटूथ डिवाइस"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"आस-पास मौजूद ब्लूटूथ डिवाइसों को खोजें और उनसे कनेक्ट करें"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"आस-पास मौजूद डिवाइस"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"आस-पास मौजूद डिवाइस खोजें और उनसे कनेक्ट करें"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"कॉल लॉग"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"कॉल लॉग की जानकारी देखना और उसमें बदलाव करना"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"फ़ोन"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"अनुमति देने पर, ऐप्लिकेशन, आस-पास मौजूद ब्लूटूथ डिवाइसों को खोज पाएगा और उनसे जुड़ पाएगा"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"जोड़े गए ब्लूटूथ डिवाइसों से कनेक्ट करें"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"अनुमति देने पर, ऐप्लिकेशन, जोड़े गए ब्लूटूथ डिवाइसों से कनेक्ट कर पाएगा"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"आस-पास मौजूद Ultra-Wideband डिवाइसों के बीच की दूरी का पता लगाएं"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"ऐप्लिकेशन को आस-पास मौजूद Ultra-Wideband डिवाइसों के बीच की दूरी का पता लगाने की अनुमति दें"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC का इस्तेमाल करने वाली पैसे चुकाने की पसंदीदा सेवा की जानकारी"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"अगर ऐप्लिकेशन को अनुमति दी जाती है, तो वह पैसे चुकाने की आपकी उस पसंदीदा सेवा के बारे में जानकारी पा सकता है जो NFC का इस्तेमाल करती है. इसमें रजिस्टर किए गए डिवाइस और उनके आउटपुट के रूट जैसी जानकारी शामिल होती है."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"नियर फ़ील्ड कम्यूनिकेशन नियंत्रित करें"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"आपके व्यवस्थापक ने हटा दिया है"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ठीक है"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n• गहरे रंग वाली थीम चालू करता है\n• बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या इन्हें बंद कर देता है\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n• गहरे रंग वाली थीम चालू करता है\n• बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या इन्हें बंद कर देता है"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन पर टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"इस सूचना के मिलने पर होने वाली आवाज़ बंद कर दी गई है. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"इस सूचना को रैंकिंग में ऊपर किया गया था. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"इस सूचना को रैंकिंग में नीचे किया गया था. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"रूटीन मोड जानकारी की सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"अब आप अपनी स्क्रीन के किसी हिस्से को ज़ूम करके देख सकते हैं"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिंग में जाकर, इस सुविधा को चालू करें"</string>
<string name="dismiss_action" msgid="1728820550388704784">"खारिज करें"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"जारी रखने के लिए, <b><xliff:g id="APP">%s</xliff:g></b> को आपके डिवाइस का माइक्रोफ़ोन ऐक्सेस करने की ज़रूरत है."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"जारी रखने के लिए, <b><xliff:g id="APP">%s</xliff:g></b> को आपके डिवाइस का कैमरा ऐक्सेस करने की ज़रूरत है."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"चालू करें"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"सेंसर से जुड़ी निजता के बारे में सूचना"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ऐप्लिकेशन का आइकॉन"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ऐप्लिकेशन की ब्रैंड इमेज"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 3e90a63..8938dd2 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"pristupiti vašoj tjelesnoj aktivnosti"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparat"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"snimati fotografije i videozapise"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth uređaji u blizini"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"otkriti Bluetooth uređaje u blizini i povezati se s njima"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Uređaji u blizini"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"otkrivanje i povezivanje s uređajima u blizini"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Zapisnici poziva"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"čitati i pisati zapisnik poziva telefona"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -541,10 +541,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aplikaciji omogućuje otkrivanje i uparivanje Bluetooth uređaja u blizini"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezati se s uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Aplikaciji omogućuje povezivanje s uparenim Bluetooth uređajima"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"oglašavanje na Bluetooth uređajima u blizini"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Aplikaciji omogućuje oglašavanje na Bluetooth uređajima u blizini"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"odredite približni položaj između uređaja u blizini koji upotrebljavaju ultraširokopojasno povezivanje"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Dopušta aplikaciji da odredi približni položaj između uređaja u blizini koji upotrebljavaju ultraširokopojasno povezivanje"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o preferiranoj usluzi plaćanja NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Omogućuje aplikaciji primanje informacija o preferiranoj usluzi plaćanja NFC kao što su registrirana pomagala i odredište."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"upravljanje beskontaktnom komunikacijom (NFC)"</string>
@@ -1875,8 +1875,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao administrator"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao administrator"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"U redu"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Da bi se produljilo trajanje baterije, Štednja baterije:\n\n• Uključuje Tamnu temu.\n• Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\".\n\n"<annotation id="url">"Saznajte više"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Da bi se produljilo trajanje baterije, Štednja baterije:\n\n• Uključuje Tamnu temu.\n• Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjio podatkovni promet, značajka Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Štednju podatkovnog prometa?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
@@ -2105,6 +2107,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Obavijest je degradirana u bešumnu. Dodirnite da biste poslali povratne informacije."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Obavijest je više rangirana. Dodirnite da biste poslali povratne informacije."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Obavijest je niže rangirana. Dodirnite da biste poslali povratne informacije."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
@@ -2293,9 +2307,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sad možete povećati dio zaslona"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Da bi nastavila s radom, aplikacija <b><xliff:g id="APP">%s</xliff:g></b> treba pristupiti mikrofonu vašeg uređaja."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Da bi nastavila s radom, aplikacija <b><xliff:g id="APP">%s</xliff:g></b> treba pristupiti fotoaparatu vašeg uređaja."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Uključi"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Deblokiraj mikrofon uređaja"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokiraj fotoaparat uređaja"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za <b><xliff:g id="APP">%s</xliff:g></b> i sve aplikacije i usluge"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Deblokiraj"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatnost senzora"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikacije"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imidž robne marke aplikacije"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 9e61a2f..8a4cfab 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"hozzáférés a testmozgási adatokhoz"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotók és videók készítése"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Közeli Bluetooth-eszközök"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"közeli Bluetooth-eszközök felfedezése és csatlakozás hozzájuk"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Közeli eszközök"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"közeli eszközök felfedezése, és csatlakozás hozzájuk"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Hívásnaplók"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"hívásnapló olvasása és írása"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lehetővé teszi az alkalmazás számára a közeli Bluetooth-eszközök felfedezését és a velük való párosítást."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"csatlakozás párosított Bluetooth-eszközökhöz"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lehetővé teszi az alkalmazás számára a párosított Bluetooth-eszközökhöz való csatlakozást."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"közzététel a közeli Bluetooth-eszközök számára"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Lehetővé teszi az alkalmazás számára, hogy közzétegye jelenlétét a közeli Bluetooth-eszközök számára"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"közeli, ultraszélessávú eszközök közötti relatív pozíció meghatározása"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Az alkalmazás meghatározhatja a közeli, ultraszélessávú eszközök közötti relatív pozíciót"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferált NFC fizetési szolgáltatási információk"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Lehetővé teszi az alkalmazás számára preferált NFC fizetési szolgáltatási információk (pl. regisztrált alkalmazásazonosítók és útvonali cél) lekérését."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC technológia vezérlése"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"A rendszergazda által frissítve"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"A rendszergazda által törölve"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n\n• Bekapcsolja a sötét témát.\n• Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat.\n\n"<annotation id="url">"További információ"</annotation>"."</string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n\n• Bekapcsolja a sötét témát.\n• Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által jelenleg használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Bekapcsolás"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ezt az értesítést némára állította a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ezt az értesítést előrébb sorolta a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ezt az értesítést hátrébb sorolta a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Információs értesítés a rutinmódról"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Mostantól kinagyíthatja a képernyő egy részét"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bekapcsolás a Beállításokban"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Elvetés"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"A folytatáshoz a(z) <b><xliff:g id="APP">%s</xliff:g></b> alkalmazásnak hozzáférésre van szüksége az eszköze mikrofonjához."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"A folytatáshoz a(z) <b><xliff:g id="APP">%s</xliff:g></b> alkalmazásnak hozzáférésre van szüksége az eszköze kamerájához."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Bekapcsolás"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Az eszközmikrofon letiltásának feloldása"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Az eszközkamera letiltásának feloldása"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"A(z) <b><xliff:g id="APP">%s</xliff:g></b>, valamint az összes alkalmazás és szolgáltatás esetében"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Tiltásfeloldás"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Érzékelőkkel kapcsolatos adatvédelem"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Alkalmazás ikonja"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Alkalmazás márkaképe"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 5b14f3f..aebdbe6 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"հասանելիություն ֆիզիկական ակտիվությանը"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Տեսախցիկ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"լուսանկարել և տեսագրել"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Մոտակա Bluetooth սարքեր"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"հայտնաբերել մոտակա Bluetooth սարքերը և միանալ դրանց"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Մոտակա սարքեր"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"հայտնաբերել մոտակա սարքերը և միանալ դրանց"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Զանգերի մատյան"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"հեռախոսազանգերի մատյանի դիտում և գրանցում"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Հեռախոս"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Թույլ է տալիս հավելվածին հայտնաբերել և զուգակցել մոտակա Bluetooth սարքերը"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"միանալ զուգակցված Bluetooth սարքերի"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Թույլ է տալիս հավելվածին միանալ զուգակցված Bluetooth սարքերի"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"որոշել մոտակա UWB սարքերի միջև հարաբերական դիրքավորումը"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Թույլատրել հավելվածին որոշել գերլայնաշերտ կապի տեխնոլոգիան աջակցող մոտակա սարքերի միջև հարաբերական դիրքավորումը"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Տեղեկություններ NFC վճարային ծառայության մասին"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Թույլ է տալիս հավելվածին ստանալ նախընտրելի NFC վճարային ծառայության մասին տեղեկություններ (օր․՝ գրանցված լրացուցիչ սարքերի և երթուղու նպատակակետի մասին տվյալներ)։"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"վերահսկել Մոտ Տարածությամբ Հաղորդակցումը"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Եղավ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը՝\n\n• Միացնում է մուգ թեման։\n• Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգը։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը՝\n\n• Միացնում է մուգ թեման։\n• Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգը։"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար տվյալների ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի տնտեսումը"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Միացնել"</string>
@@ -1892,8 +1896,8 @@
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Մինչև <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Մինչև <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Մինչև ժ. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-ը (հաջորդ զարթուցիչը)"</string>
- <string name="zen_mode_forever" msgid="740585666364912448">"Մինչև չանջատեք"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Մինչև չանջատեք «Չանհանգստացնել» գործառույթը"</string>
+ <string name="zen_mode_forever" msgid="740585666364912448">"Մինչև անջատեք"</string>
+ <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Մինչև անջատեք «Չանհանգստացնել» գործառույթը"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Թաքցնել"</string>
<string name="zen_mode_feature_name" msgid="3785547207263754500">"Չանհանգստացնել"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Այս ծանուցման կարևորության մակարդակը իջեցվել է և դարձել անձայն։ Հպեք՝ կարծիք հայտնելու համար։"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Այս ծանուցման կարևորության մակարդակը բարձրացվել է։ Հպեք՝ կարծիք հայտնելու համար։"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Այս ծանուցման կարևորության մակարդակն իջեցվել է։ Հպեք՝ կարծիք հայտնելու համար։"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ծանուցում լիցքավորման մասին"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Մարտկոցը կարող է սովորականից շուտ սպառվել"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Մարտկոցի կյանքը երկարացնելու համար ակտիվացվել է մարտկոցի տնտեսման ռեժիմը"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Դուք կարող եք խոշորացնել ձեր էկրանի մի մասը"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Միացնել կարգավորումներում"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Փակել"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Շարունակելու համար <b><xliff:g id="APP">%s</xliff:g></b> հավելվածին անհրաժեշտ է սարքի խոսափողի օգտագործման թույլտվություն։"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Շարունակելու համար <b><xliff:g id="APP">%s</xliff:g></b> հավելվածին անհրաժեշտ է ձեր սարքի տեսախցիկի օգտագործման թույլտվություն։"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Միացնել"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Տվիչների գաղտնիություն"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Հավելվածի պատկերակ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Հավելվածի բրենդային պատկեր"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 5874371..bae2d48 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"mengakses aktivitas fisik Anda"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"mengambil gambar dan merekam video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Perangkat Bluetooth di Sekitar"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"temukan dan hubungkan ke perangkat Bluetooth di sekitar"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Perangkat di sekitar"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"menemukan dan terhubung ke perangkat di sekitar"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Log panggilan"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"membaca dan menulis log panggilan telepon"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telepon"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Mengizinkan aplikasi menemukan dan menyambungkan perangkat Bluetooth di sekitar"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"hubungkan ke perangkat Bluetooth yang disambungkan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Mengizinkan aplikasi terhubung ke perangkat Bluetooth yang disambungkan"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"menentukan posisi relatif antar-perangkat Ultra-Wideband di sekitar"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Mengizinkan aplikasi menentukan posisi relatif antar-perangkat Ultra-Wideband di sekitar"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informasi Layanan Pembayaran NFC Pilihan"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Mengizinkan aplikasi untuk mendapatkan informasi layanan pembayaran NFC pilihan seperti bantuan terdaftar dan tujuan rute."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrol NFC"</string>
@@ -1624,7 +1626,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Transmisi layar ke perangkat"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"Menelusuri perangkat…"</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Setelan"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Putuskan sambungan"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Putuskan koneksi"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"Memindai..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"Menyambung..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"Tersedia"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Diupdate oleh admin Anda"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Dihapus oleh admin Anda"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Oke"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai akan:\n\n• Mengaktifkan Tema gelap\n• Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”\n\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai akan:\n\n• Mengaktifkan Tema gelap\n• Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangi penggunaan data, Penghemat Data mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah diketuk."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Aktifkan Penghemat Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktifkan"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Notifikasi ini didemosikan menjadi Senyap. Ketuk untuk memberikan masukan."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Notifikasi ini diberi peringkat lebih tinggi. Ketuk untuk memberikan masukan."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Notifikasi ini diberi peringkat lebih rendah. Ketuk untuk memberikan masukan."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikasi info Mode Rutinitas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sekarang Anda dapat memperbesar sebagian layar"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktifkan di Setelan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Tutup"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Untuk melanjutkan, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses ke mikrofon perangkat."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Untuk melanjutkan, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses ke kamera perangkat."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktifkan"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privasi Sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikon aplikasi"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Brand image aplikasi"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 3f2b0d5..c23362e 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"fá aðgang að hreyfingu þinni"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Myndavél"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"taka myndir og taka upp myndskeið"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Nálæg Bluetooth-tæki"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"finna og tengjast nálægum Bluetooth-tækjum"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Nálæg tæki"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"finna og tengjast nálægum tækjum"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Símtalaskrár"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lesa og skrifa símtalaskrá síma"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Sími"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Leyfir forritinu að finna nálæg Bluetooth-tæki og parast við þau"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"tengjast pöruðum Bluetooth-tækjum"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Leyfir forritinu að tengjast pöruðum Bluetooth-tækjum"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"birta nálægum Bluetooth-tækjum auglýsingar"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Leyfir forritinu að birta nálægum Bluetooth-tækjum auglýsingar"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"ákvarða fjarlægð milli nálægra tækja með ofurbreiðband"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Leyfa forritinu að ákvarða fjarlægð milli nálægra tækja með ofurbreiðband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Upplýsingar um valda NFC-greiðsluþjónustu"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gerir forritinu kleift að fá valda NFC-greiðsluþjónustu, svo sem skráða aðstoð og áfangastað leiðar."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"stjórna nándarsamskiptum (NFC)"</string>
@@ -1852,9 +1852,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Kerfisstjóri uppfærði"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Kerfisstjóri eyddi"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Í lagi"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n\n•·Kveikir á dökku þema\n•·Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“\n\n"<annotation id="url">"Frekari upplýsingar"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n\n• Kveikir á dökku þema\n• Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“"</string>
- <string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan getur verið, svo dæmi sé tekið, að myndir eru ekki birtar fyrr en þú ýtir á þær."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan getur verið að myndir eru ekki birtar fyrr en þú ýtir á þær, svo dæmi sé tekið."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Kveikja á gagnasparnaði?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Kveikja"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Þessi tilkynning var gerð þögul. Ýttu til að senda ábendingu."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Þessi tilkynning fékk hærri stöðu. Ýttu til að senda ábendingu."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Þessi tilkynning fékk lægri stöðu. Ýttu til að senda ábendingu."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upplýsingatilkynning aðgerðastillingar"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nú geturðu stækkað hluta skjásins"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Kveikja á í stillingum"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hunsa"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Til að halda áfram þarf <b><xliff:g id="APP">%s</xliff:g></b> aðgang að hljóðnema tækisins."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Til að halda áfram þarf <b><xliff:g id="APP">%s</xliff:g></b> aðgang að myndavél tækisins."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Kveikja"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Opna á hljóðnema tækisins"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Opna fyrir myndavél tækisins"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Fyrir <b><xliff:g id="APP">%s</xliff:g></b> og öll forrit og þjónustur"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Opna á"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Persónuvernd skynjara"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Forritstákn"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Mynd af merki forrits"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 3f159da..80aaa37 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Consente di accedere all\'attività fisica"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"scattare foto e registrare video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivi Bluetooth nelle vicinanze"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"Rilevamento e connessione a dispositivi Bluetooth nelle vicinanze"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Consente di rilevare dispositivi nelle vicinanze e di connettersi a tali dispositivi"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"leggere e modificare il registro chiamate del telefono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Consente all\'app di rilevare e accoppiare dispositivi Bluetooth nelle vicinanze"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"Connessione a dispositivi Bluetooth accoppiati"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Consente all\'app di connettersi ai dispositivi Bluetooth accoppiati"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"Pubblicità su dispositivi Bluetooth vicini"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Consente all\'app di fare pubblicità sui dispositivi Bluetooth nelle vicinanze"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"Possibilità di stabilire la posizione relativa tra dispositivi a banda ultralarga nelle vicinanze"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Consenti all\'app di stabilire la posizione relativa tra dispositivi a banda ultralarga nelle vicinanze"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informazioni del servizio di pagamento NFC preferito"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Consente all\'app di recuperare informazioni del servizio di pagamento NFC preferito, quali destinazione della route e identificatori applicazione registrati."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controllo Near Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Aggiornato dall\'amministratore"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminato dall\'amministratore"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n• Attiva il tema scuro\n• Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Hey Google\"\n\n"<annotation id="url">"Scopri di più"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n• Attiva il tema scuro\n• Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Hey Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Attivare Risparmio dati?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string>
@@ -1901,7 +1903,7 @@
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Notte di un giorno feriale"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fine settimana"</string>
<string name="zen_mode_default_events_name" msgid="2280682960128512257">"Evento"</string>
- <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Sonno"</string>
+ <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Notte"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> sta disattivando alcuni suoni"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Questa notifica è stata retrocessa a Silenziosa. Tocca per dare un feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Questa notifica è stata posizionata più in alto. Tocca per dare un feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Questa notifica è stata posizionata più in basso. Tocca per dare un feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifica di informazioni sulla modalità Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Risparmio energetico attivo per far durare di più la batteria"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ora puoi ingrandire parte dello schermo"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Attiva nelle Impostazioni"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignora"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Per continuare, l\'app <b><xliff:g id="APP">%s</xliff:g></b> deve accedere al microfono del dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Per continuare, l\'app <b><xliff:g id="APP">%s</xliff:g></b> deve accedere alla videocamera del dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Attiva"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Sblocca il microfono del dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Sblocca la fotocamera del dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Per <b><xliff:g id="APP">%s</xliff:g></b>, nonché per tutti i servizi e le app"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Sblocca"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacy relativa ai sensori"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icona dell\'applicazione"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Immagine del branding dell\'applicazione"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index c270c4d..734224c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"גישה לפעילות הגופנית שלך"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"מצלמה"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"צילום תמונות והקלטת וידאו"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"מכשירי Bluetooth בקרבת מקום"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"גילוי מכשירי Bluetooth בקרבת מקום והתחברות אליהם"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"מכשירים קרובים"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"איתור מכשירים שנמצאים בקרבת מקום והתחברות אליהם"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"יומני שיחות"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"קריאה וכתיבה של יומן השיחות של הטלפון"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"טלפון"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"מאפשרת לאפליקציה לגלות מכשירי Bluetooth בקרבת מקום ולבצע התאמה איתם"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"התחברות למכשירי Bluetooth מתאימים"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"מאפשרת לאפליקציה להתחבר למכשירי Bluetooth מותאמים"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"פרסום במכשירי Bluetooth בקרבת מקום"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"האפליקציה תוכל לפרסם במכשירי Bluetooth בקרבת מקום"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"זיהוי מיקום יחסי בין מכשירי \'תחום רחב סרט\' קרובים"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"האפליקציה תזהה את המיקום היחסי בין מכשירים קרובים שמשדרים בטכנולוגיה \'תחום רחב סרט\'"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"פרטים על שירות תשלום מועדף ב-NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"מאפשרת לאפליקציה לקבל פרטים על שירות תשלום מועדף ב-NFC, כמו עזרים רשומים ויעד של נתיב."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"שליטה בתקשורת מטווח קצר"</string>
@@ -1898,8 +1898,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"עודכנה על ידי מנהל המערכת"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"נמחקה על ידי מנהל המערכת"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"אישור"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google\n\n"<annotation id="url">"למידע נוסף"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• משביתה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"להפעיל את חוסך הנתונים?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"הפעלה"</string>
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ההתראה הזו הורדה בדרגה ל\'שקטה\'. יש להקיש כדי לשלוח משוב."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"דירוג ההתראה הזו הוגבה. יש להקיש כדי לשלוח משוב."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ההתראה הזו דורגה נמוך יותר. יש להקיש כדי לשלוח משוב."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"התראת מידע לגבי מצב שגרתי"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"עכשיו אפשר להגדיל חלק מהמסך"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"הפעלה בהגדרות"</string>
<string name="dismiss_action" msgid="1728820550388704784">"סגירה"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"כדי להמשיך, האפליקציה <b><xliff:g id="APP">%s</xliff:g></b> צריכה גישה למיקרופון של המכשיר שלך."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"כדי להמשיך, האפליקציה <b><xliff:g id="APP">%s</xliff:g></b> צריכה גישה למצלמה של המכשיר שלך."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"הפעלה"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"ביטול חסימת המיקרופון של המכשיר"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"ביטול החסימה של מצלמת המכשיר"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"עבור <b><xliff:g id="APP">%s</xliff:g></b> ולכל האפליקציות והשירותים"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"ביטול חסימה"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"פרטיות חיישנים"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"סמל האפליקציה"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"תדמית המותג של האפליקציה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 50a3b1b..b38d9dc 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"身体活動にアクセス"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"カメラ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"写真と動画の撮影"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"付近の Bluetooth デバイス"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"付近の Bluetooth デバイスの検出と接続"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"付近のデバイス"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"付近のデバイスの検出と接続"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"通話履歴"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"通話履歴の読み取りと書き込み"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"電話"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"付近の Bluetooth デバイスの検出とペア設定をアプリに許可します"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ペア設定された Bluetooth デバイスへの接続"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ペア設定された Bluetooth デバイスへの接続をアプリに許可します"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"付近の Bluetooth デバイスへの広告の配信"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"付近の Bluetooth デバイスへの広告の配信をアプリに許可します"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"付近の Ultra Wideband デバイス間の相対位置の特定"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"付近の Ultra Wideband デバイス間の相対位置の特定をアプリに許可します"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"優先される NFC お支払いサービスの情報"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"登録されている支援やルートの目的地など、優先される NFC お支払いサービスの情報を取得することをアプリに許可します。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFCの管理"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"管理者により更新されています"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"管理者により削除されています"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n\n• ダークテーマを ON にする\n• バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能を OFF にする、または制限する\n\n"<annotation id="url">"詳細"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n\n• ダークテーマを ON にする\n• バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能を OFF にする、または制限する"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータを送受信することはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ON にする"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"この通知の重要度がサイレントに下がりました。タップしてフィードバックをお送りください。"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"この通知の重要度が上がりました。タップしてフィードバックをお送りください。"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"この通知の重要度が下がりました。タップしてフィードバックをお送りください。"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ルーティン モード情報の通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"通常の充電を行う前に電池が切れる可能性があります"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"画面の一部を拡大できるようになりました"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"[設定] で ON にする"</string>
<string name="dismiss_action" msgid="1728820550388704784">"閉じる"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"続行するには、<b><xliff:g id="APP">%s</xliff:g></b> にデバイスのマイクへのアクセスを許可する必要があります。"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"続行するには、<b><xliff:g id="APP">%s</xliff:g></b> にデバイスのカメラへのアクセスを許可する必要があります。"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ON にする"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"デバイスのマイクのブロックを解除してください"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"デバイスのカメラのブロックを解除してください"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> とすべてのアプリ、サービス"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"ブロックを解除"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"センサー プライバシー"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"アプリのアイコン"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"アプリのブランド イメージ"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index d977f7f..a14c551 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ფიზიკური აქტივობაზე წვდომა"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"კამერა"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ფოტოებისა და ვიდეოების გადაღება"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ახლომახლო Bluetooth მოწყობილობები"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ახლომახლო Bluetooth მოწყობილობების აღმოჩენა და მათთან დაკავშირება"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"ახლომახლო მოწყობილობები"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ახლომახლო მოწყობილობების აღმოჩენა და დაკავშირება"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ზარების ჟურნალები"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ზარების ჟურნალის წაკითხვა და მასში ჩაწერა"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ტელეფონი"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"საშუალებას აძლევს აპს, აღმოაჩინოს ახლომახლო Bluetooth მოწყობილობები დასაწყვილებლად"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"დაწყვილებულ Bluetooth მოწყობილობებთან დაკავშირება"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"საშუალებას აძლევს აპს, დაუკავშირდეს დაწყვილებულ Bluetooth მოწყობილობებს"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"ახლ. Bluetooth მოწყობილობებზე რეკლამის განთავსება"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"საშუალებას აძლევს აპს, რეკლამა განათავსოს ახლომახლო Bluetooth მოწყობილობებზე"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"შედარებითი პოზიციის დადგენა ახლომახლო ულტრაფართო სიხშირის მოწყობილობების შესახებ"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"ნებას რთავს აპს, დაადგინოს შედარებითი პოზიცია ახლომახლო ულტრაფართო სიხშირის მოწყობილობების შესახებ"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"უპირატესი NFC გადახდის სერვისის ინფორმაცია"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"საშუალებას აძლევს აპს, მიიღოს უპირატესი NFC გადახდის სერვისის ინფორმაცია, მაგალითად, რეგისტრირებული დახმარება და დანიშნულება."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ახლო მოქმედების რადიოკავშირი (NFC) მართვა"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"კარგი"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ბატარეის მუშაობის გახანგრძლივების მიზნით, ბატარეის დამზოგველი:\n\n• ჩართავს ბნელ თემას\n• გამორთავს ან ზღუდავს ფონურ აქტივობას, გარკვეულ ვიზუალურ ეფექტებს და სხვა ფუნქციებს, მაგალითად, „Hey Google“\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ბატარეის მუშაობის გახანგრძლივების მიზნით, ბატარეის დამზოგი:\n\n• ჩართავს ბნელ თემას\n• გამორთავს ან შეზღუდავს ფონურ აქტივობას, გარკვეულ ვიზუალურ ეფექტებს და სხვა ფუნქციებს, მაგალითად, „Hey Google“"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ჩართვა"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ეს შეტყობინება ჩამოქვეითდა და გახდა „ჩუმი“. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ეს შეტყობინება დაწინაურდა. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ეს შეტყობინება ჩამოქვეითდა. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ახლა უკვე შეგიძლიათ ეკრანის ნაწილის გადიდება"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ჩართვა პარამეტრებში"</string>
<string name="dismiss_action" msgid="1728820550388704784">"უარყოფა"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"გასაგრძელებლად <b><xliff:g id="APP">%s</xliff:g></b>-ს თქვენი მოწყობილობის მიკროფონზე წვდომა სჭირდება."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"გასაგრძელებლად <b><xliff:g id="APP">%s</xliff:g></b>-ს თქვენი მოწყობილობის კამერაზე წვდომა სჭირდება."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ჩართვა"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"მოწყობილობის მიკროფონის განბლოკვა"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"მოწყობილობის კამერის განბლოკვა"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"აპისთვის <b><xliff:g id="APP">%s</xliff:g></b> და სხვა აპებისა და მომსახურებებისთვის"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"განბლოკვა"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"სენსორის კონფიდენციალურობა"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"აპლიკაციის ხატულა"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"აპლიკაციის ბრენდის სურათი"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 0da10d2..8dbe6ee 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"іс-қимыл дерегін алу"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"суретке түсіріп, бейне жазу"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Маңайдағы Bluetooth құрылғылары"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"маңайдағы Bluetooth құрылғыларын анықтау және жұптау"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Маңайдағы құрылғылар"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"маңайдағы құрылғыларды анықтау және жалғау"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Қоңырау журналдары"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"телефонның қоңыраулар журналын оқу және жазу"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Қолданбаға маңайдағы Bluetooth құрылғыларын анықтап, жұптауға рұқсат береді."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"жұпталған Bluetooth құрылғыларына қосылу"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Қолданбаға жұпталған Bluetooth құрылғыларына қосылуға рұқсат береді."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"маңайдағы кеңжолақты құрылғылардың бір-біріне қатысты орнын анықтау"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Қолданбаға маңайдағы кеңжолақты құрылғылардың бір-біріне қатысты орнын анықтауға мүмкіндік береді."</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Таңдаулы NFC төлеу қызметі туралы ақпарат"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Қолданба тіркелген көмектер және баратын жер маршруты сияқты таңдаулы NFC төлеу қызметі туралы ақпаратты ала алатын болады."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC функциясын басқару"</string>
@@ -1290,7 +1292,7 @@
<string name="volume_icon_description_notification" msgid="579091344110747279">"Хабар дыбысының қаттылығы"</string>
<string name="ringtone_default" msgid="9118299121288174597">"Әдепкі рингтон"</string>
<string name="ringtone_default_with_actual" msgid="2709686194556159773">"Әдепкі (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
- <string name="ringtone_silent" msgid="397111123930141876">"Ешқандай"</string>
+ <string name="ringtone_silent" msgid="397111123930141876">"Жоқ"</string>
<string name="ringtone_picker_title" msgid="667342618626068253">"Қоңырау әуендері"</string>
<string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Дабыл сигналдары"</string>
<string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Хабарландыру сигналдары"</string>
@@ -1852,9 +1854,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Әкімші жаңартқан"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Әкімші жойған"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Жарайды"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Батарея жұмысының ұзақтығын арттыру үшін Батареяны үнемдеу режимі:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді не шектейді.\n\n"<annotation id="url">"Толығырақ"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Батарея ұзағырақ жұмыс істеуі үшін, Батареяны үнемдеу режимі:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді."</string>
- <string name="data_saver_description" msgid="4995164271550590517">"Дерек шығынын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"Дерек шығынын азайту үшін Трафикті үнемдеу режимінде кейбір қолданбаларға деректі фондық режимде жіберуге және алуға тыйым салынады. Ашық тұрған қолданба деректі шектеулі шамада пайдаланады (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикті үнемдеу функциясын қосу керек пе?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Қосу"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Бұл хабарландырудың маңыздылық деңгейі \"Үнсіз\" санатына төмендетілді. Пікір қалдыру үшін түртіңіз."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Бұл хабарландырудың маңыздылық деңгейі көтерілді. Пікір қалдыру үшін түртіңіз."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Бұл хабарландырудың маңыздылық деңгейі төмендетілді. Пікір қалдыру үшін түртіңіз."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режим туралы хабарландыру"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея заряды азаюы мүмкін"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарея ұзаққа жетуі үшін, Батареяны үнемдеу режимі іске қосылды"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Енді экранның бір бөлігін ұлғайтуға болады."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Параметрлер бөлімінен қосу"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Қабылдамау"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Жалғастыру үшін <b><xliff:g id="APP">%s</xliff:g></b> қолданбасы құрылғыңыздың микрофонына рұқсат алу керек."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Жалғастыру үшін <b><xliff:g id="APP">%s</xliff:g></b> қолданбасы құрылғыңыздың камерасына рұқсат алу керек."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Қосу"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Датчикке қатысты құпиялылық"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Қолданба белгішесі"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Қолданба брендін ілгері жылжыту кескіні"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 5740b99..e294f38 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ចូលប្រើសកម្មភាពរាងកាយរបស់អ្នក"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"កាមេរ៉ា"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ថតរូប និងថតវីដេអូ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ឧបករណ៍ប៊្លូធូសដែលនៅជិត"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ស្វែងរក និងភ្ជាប់ទៅឧបករណ៍ប៊្លូធូសដែលនៅជិត"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"ឧបករណ៍ដែលនៅជិត"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ស្វែងរក និងភ្ជាប់ទៅឧបករណ៍ដែលនៅជិត"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"កំណត់ហេតុហៅទូរសព្ទ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"អាន និងសរសេរកំណត់ហេតុហៅទូរសព្ទ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ទូរសព្ទ"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"អនុញ្ញាតឱ្យកម្មវិធីស្វែងរក និងផ្គូផ្គងឧបករណ៍ប៊្លូធូសដែលនៅជិត"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ភ្ជាប់ទៅឧបករណ៍ប៊្លូធូសដែលបានផ្គូផ្គង"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"អនុញ្ញាតឱ្យកម្មវិធីភ្ជាប់ទៅឧបករណ៍ប៊្លូធូសដែលបានផ្គូផ្គង"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"កំណត់ចម្ងាយពាក់ព័ន្ធរវាងឧបករណ៍ Ultra-Wideband ដែលនៅជិត"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"អនុញ្ញាតឱ្យកម្មវិធីកំណត់ចម្ងាយពាក់ព័ន្ធរវាងឧបករណ៍ Ultra-Wideband ដែលនៅជិត"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ព័ត៌មានអំពីសេវាបង់ប្រាក់តាម NFC ជាអាទិភាព"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"អនុញ្ញាតឱ្យកម្មវិធីទទួលបានព័ត៌មានអំពីសេវាបង់ប្រាក់តាម nfc ជាអាទិភាពដូចជា គោលដៅផ្លូវ និងព័ត៌មានកំណត់អត្តសញ្ញាណកម្មវិធី ដែលបានចុះឈ្មោះជាដើម។"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ពិនិត្យការទាក់ទងនៅក្បែរ (NFC)"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"លុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"យល់ព្រម"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ដើម្បីបង្កើនកម្រិតថាមពលថ្ម មុខងារសន្សំថ្ម៖\n\n• បើករចនាប័ទ្មងងឹត\n• បិទ ឬដាក់កំហិតលើសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលជារូបភាពមួយចំនួន និងមុខងារផ្សេងទៀតដូចជា “Hey Google” ជាដើម\n\n"<annotation id="url">"ស្វែងយល់បន្ថែម"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ដើម្បីបង្កើនកម្រិតថាមពលថ្ម មុខងារសន្សំថ្ម៖\n\n• បើករចនាប័ទ្មងងឹត\n• បិទ ឬដាក់កំហិតលើសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលរូបភាពមួយចំនួន និងមុខងារផ្សេងទៀតដូចជា “Ok Google” ជាដើម"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"បើក"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ការជូនដំណឹងនេះត្រូវបានបន្ទាបតំណែងទៅស្ងាត់។ សូមចុចដើម្បីផ្ដល់មតិកែលម្អ។"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ការជូនដំណឹងនេះត្រូវបានចាត់ថ្នាក់ខ្ពស់ជាងមុន។ សូមចុចដើម្បីផ្ដល់មតិកែលម្អ។"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ការជូនដំណឹងនេះត្រូវបានចាត់ថ្នាក់ទាបជាងមុន។ សូមចុចដើម្បីផ្ដល់មតិកែលម្អ។"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ការជូនដំណឹងព័ត៌មានរបស់មុខងារទម្លាប់"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ថ្មអាចនឹងអស់ មុនពេលសាកថ្មធម្មតា"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"បានបើកដំណើរការមុខងារសន្សំថ្ម ដើម្បីបង្កើនកម្រិតថាមពលថ្ម"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ឥឡូវនេះ អ្នកអាចពង្រីកផ្នែកនៃអេក្រង់របស់អ្នកបានហើយ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"បើកនៅក្នុងការកំណត់"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ច្រានចោល"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ដើម្បីបន្ត <b><xliff:g id="APP">%s</xliff:g></b> ត្រូវការសិទ្ធិចូលប្រើមីក្រូហ្វូនរបស់ឧបករណ៍អ្នក។"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ដើម្បីបន្ត <b><xliff:g id="APP">%s</xliff:g></b> ត្រូវការសិទ្ធិចូលប្រើកាមេរ៉ារបស់ឧបករណ៍អ្នក។"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"បើក"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ឯកជនភាពឧបករណ៍ចាប់សញ្ញា"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"រូបកម្មវិធី"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"រូបភាពផ្សព្វផ្សាយម៉ាកកម្មវិធី"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 222f771..a030715 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ನಿಮ್ಮ ದೈಹಿಕ ಚಟುವಟಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ಕ್ಯಾಮರಾ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಲು, ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳು"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಿ ಮತ್ತು ಅವುಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ಕರೆಯ ಲಾಗ್"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ಪೋನ್ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಓದಿ ಮತ್ತು ಬರೆಯಿರಿ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ಫೋನ್"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಮತ್ತು ಅವುಗಳಿಗೆ ಜೋಡಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ಜೋಡಿಸಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ಜೋಡಿಸಲಾಗಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ಸರಿ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n\n• ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n•ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ದೃಶ್ಯಾತ್ಮಕ ಎಫೆಕ್ಟ್ಗಳು ಮತ್ತು “ಹೇ Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ\n\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n\n• ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n• ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್ಗಳು ಮತ್ತು “Ok Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ಆನ್ ಮಾಡಿ"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ಈ ಅಧಿಸೂಚನೆಗೆ ಸೈಲೆಂಟ್ಗೆ ಹಿಂಬಡ್ತಿ ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ಈ ಅಧಿಸೂಚನೆಗೆ ಮೇಲಿನ ಸ್ಥಾನವನ್ನು ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ಈ ಅಧಿಸೂಚನೆಗೆ ಕೆಳಗಿನ ಸ್ಥಾನವನ್ನು ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ಚಾರ್ಜ್ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ನೀವು ಇದೀಗ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಭಾಗವನ್ನು ಹಿಗ್ಗಿಸಬಹುದು"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಆನ್ ಮಾಡಿ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ವಜಾಗೊಳಿಸಿ"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ಮುಂದುವರಿಯಲು, <b><xliff:g id="APP">%s</xliff:g></b> ಗೆ ನಿಮ್ಮ ಸಾಧನದ ಮೈಕ್ರೋಫೋನ್ನ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ಮುಂದುವರಿಯಲು, <b><xliff:g id="APP">%s</xliff:g></b> ಗೆ ನಿಮ್ಮ ಸಾಧನದ ಕ್ಯಾಮರಾದ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ಆನ್ ಮಾಡಿ"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ಸೆನ್ಸರ್ ಗೌಪ್ಯತೆ"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ಅಪ್ಲಿಕೇಶನ್ ಬ್ರ್ಯಾಂಡಿಂಗ್ ಚಿತ್ರ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index c4d8a7b..aa64179 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"신체 활동 정보에 액세스"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"카메라"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"사진 및 동영상 촬영"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"근처의 블루투스 기기"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"근처의 블루투스 기기를 찾고 연결"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"근처 기기"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"근처 기기 검색 및 연결"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"통화 기록"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"통화 기록 읽고 쓰기"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"전화"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"앱이 근처의 블루투스 기기를 찾고 페어링하도록 허용"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"페어링된 블루투스 기기에 연결"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"앱이 페어링된 블루투스 기기에 연결하도록 허용"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"근처 초광대역 기기 간 상대적 위치 파악"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"앱이 근처의 초광대역 기기 간 상대적 위치를 파악하도록 허용"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"기본 NFC 결제 서비스 정보"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"앱이 등록된 AID와 경로 목적지 같은 기본 NFC 결제 서비스 정보를 확인하도록 허용합니다."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC(Near Field Communication) 제어"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"관리자에 의해 업데이트되었습니다."</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"관리자에 의해 삭제되었습니다."</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"확인"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"배터리 수명을 늘리기 위해 절전 모드가 다음과 같이 작동합니다.\n\n• 어두운 테마를 사용 설정합니다.\n• 백그라운드 활동, 일부 시각 효과 및 \'Hey Google\'과 같은 기타 기능을 사용 중지하거나 제한합니다.\n\n"<annotation id="url">"자세히 알아보기"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"배터리 수명을 연장하기 위해 절전 모드가 다음과 같이 작동합니다.\n\n• 어두운 테마를 사용 설정합니다.\n• 백그라운드 활동, 일부 시각 효과 및 \'Hey Google\' 등의 기타 기능을 사용 중지하거나 제한합니다."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"데이터 절약 모드를 사용 설정하시겠습니까?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"사용 설정"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"이 알림의 중요도가 무음으로 하향되었습니다. 의견을 보내려면 탭하세요."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"이전에 이 알림의 중요도는 더 높았습니다. 의견을 보내려면 탭하세요."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"이전에 이 알림의 중요도는 더 낮았습니다. 의견을 보내려면 탭하세요."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"루틴 모드 정보 알림"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"배터리 수명을 연장하기 위해 절전 모드가 활성화되었습니다."</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"이제 화면 일부를 확대할 수 있습니다."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"설정에서 사용 설정"</string>
<string name="dismiss_action" msgid="1728820550388704784">"닫기"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"계속하려면 <b><xliff:g id="APP">%s</xliff:g></b>에서 기기 마이크에 액세스해야 합니다."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"계속하려면 <b><xliff:g id="APP">%s</xliff:g></b>에서 기기 카메라에 액세스해야 합니다."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"사용"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"센서 개인정보 보호"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"애플리케이션 아이콘"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"애플리케이션 브랜드 이미지"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 67889de..86aa419 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"кыймыл-аракеттериңизге көз салып турганга мүмкүнчүлүк алат"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"сүрөт жана видео тартууга"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Жакын жердеги Bluetooth түзмөктөрү"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"жакын жердеги Bluetooth түзмөктөрүн аныктоо жана туташуу"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Жакын жердеги түзмөктөр"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"жакын жердеги түзмөктөрдү аныктоо жана туташуу"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Чалуулар тизмеси"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"телефондогу чалуулар тизмесин окуу жана жазуу"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -391,8 +391,8 @@
<string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"Бул колдонмо башка колдонмолордун же экрандын башка бөлүгүнүн үстүндө көрүнүшү мүмкүн. Ал колдонмолорду пайдаланууга же алардын көрсөтүлүшүнө тоскоолдук жаратышы мүмкүн."</string>
<string name="permlab_runInBackground" msgid="541863968571682785">"фондо иштей берсин"</string>
<string name="permdesc_runInBackground" msgid="4344539472115495141">"Бул колдонмо фондо иштей берет. Батареяңыз тез эле отуруп калышы мүмкүн."</string>
- <string name="permlab_useDataInBackground" msgid="783415807623038947">"фондо дайын-даректерди өткөрө берсин"</string>
- <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"Бул колдонмо фондо дайын-даректерди өткөрө берет. Дайындарды көбүрөөк өткөрүшү мүмкүн."</string>
+ <string name="permlab_useDataInBackground" msgid="783415807623038947">"фондо маалыматтарды өткөрө берсин"</string>
+ <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"Бул колдонмо фондо маалыматтарды өткөрө берет. Дайындарды көбүрөөк өткөрүшү мүмкүн."</string>
<string name="permlab_persistentActivity" msgid="464970041740567970">"колдонмону үзгүлтүксүз иштетүү"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"Колдонмого өзүнүн бөлүктөрүн эстутумда туруктуу кармоого уруксат берет.Бул эстутумдун башка колдонмолорго жетиштүүлүгүн чектеши жана телефондун иштешин жайлатышы мүмкүн."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"Колдонмого өз бөлүктөрүн эстутумда туруктуу сактоого уруксат берет. Бул башка колдонмолор үчүн жеткиликтүү болгон эстутумду чектеп, Android TV түзмөгүңүздүн иштешин жайлатышы мүмкүн."</string>
@@ -423,14 +423,14 @@
<string name="permdesc_readCallLog" msgid="8964770895425873433">"Бул колдонмо чалууларыңыздын таржымалын окуй алат."</string>
<string name="permlab_writeCallLog" msgid="670292975137658895">"чалуулар тизмегин жаздыруу"</string>
<string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Колдонмого планшетиңиздин чалуулар тизмегин, анын ичинде, чыгыш жана кириш чалууларына тиешелүү берилиштерди өзгөртүү уруксатын берет. Зыяндуу колдонмолор муну колдонуп чалуулар тизмегин өзгөртө же жок кыла алышат."</string>
- <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Колдонмого Android TV түзмөгүңүздүн чалуулар тизмесин, анын ичинде кирүүчү жана чыгуучу чалуулар тууралуу дайын-даректерди өзгөртүүгө уруксат берет. Зыянкеч колдонмолор ал уруксатты колдонуп чалуулар тизмеңизди тазалап же өзгөртүп коюшу мүмкүн."</string>
+ <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Колдонмого Android TV түзмөгүңүздүн чалуулар тизмесин, анын ичинде кирүүчү жана чыгуучу чалуулар тууралуу маалыматтарды өзгөртүүгө уруксат берет. Зыянкеч колдонмолор ал уруксатты колдонуп чалуулар тизмеңизди тазалап же өзгөртүп коюшу мүмкүн."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Колдонмого телефонуңуздун чалуулар тизмегин, анын ичинде, чыгыш жана кириш чалууларына тиешелүү берилиштерди өзгөртүү уруксатын берет. Зыяндуу колдонмолор муну колдонуп чалуулар тизмегин өзгөртө же жок кыла алышат."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"дене-бой сенсорлоруна (жүрөктүн кагышын өлчөгүчтөр сыяктуу) уруксат"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу дайын-даректерди көрүп туруу мүмкүнчүлүгүн берет."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу маалыматтарды көрүп туруу мүмкүнчүлүгүн берет."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Жылнаамадагы иш-чараларды жана алардын чоо-жайын окуу"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бул колдонмо планшетиңизде сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайын-даректерди бөлүшүп же сактай алат."</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бул колдонмо планшетиңизде сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы маалыматтарды бөлүшүп же сактай алат."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Бул колдонмо Android TV түзмөгүңүздө сакталган жылнаама иш-чараларынын баарын окуп, ошондой эле жылнаама дайындарын бөлүшүп же сактай алат."</string>
- <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Бул колдонмо телефонуңузда сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайын-даректерди бөлүшүп же сактай алат."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Бул колдонмо телефонуңузда сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы маалыматтарды бөлүшүп же сактай алат."</string>
<string name="permlab_writeCalendar" msgid="6422137308329578076">"ээсинен уруксат албай, күнбаракка иш-аракеттерди кошуу же өзгөртүү жана конокторго чакыруу жөнөтүү"</string>
<string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Бул колдонмо планшетиңизге жылнаама иш-чараларын кошуп, алып салып же өзгөртүшү мүмкүн. Бул колдонмо жылнаама ээсинин атынан билдирүүлөрдү жөнөтүп же ээсине эскертпестен иш-чараларды өзгөртүшү мүмкүн."</string>
<string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Бул колдонмо Android TV түзмөгүңүзгө жылнаама иш-чараларын кошуп, ошондой эле аларды өчүрүшү же өзгөртүшү мүмкүн. Бул колдонмо жылнаама ээсинин атынан билдирүүлөрдү жөнөтүп же ээсине эскертпестен иш-чараларды өзгөртүшү мүмкүн."</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Колдонмого жакын жердеги Bluetooth түзмөктөрүн аныктап, жупташтырууга уруксат берет"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"жупташтырылган Bluetooth түзмөктөрү"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Колдонмого жупташтырылган Bluetooth түзмөктөрү менен байланышууга уруксат берет"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"кең тилкелүү тармак аркылуу туташа турган жакын жердеги түзмөктөрдү аныктоо"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Колдонмо кең тилкелүү тармак аркылуу туташа турган жакын жердеги түзмөктөрдү аныктай алат"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Тандалган NFC төлөм кызматы жөнүндө маалымат"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Колдонмого катталган жардам же көздөлгөн жерге маршрут сыяктуу тандалган nfc төлөм кызматы жөнүндө маалыматты алууга уруксат берүү."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication көзөмөлү"</string>
@@ -724,9 +726,9 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Сырсөз эрежелерин коюу"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Экран кулпусун ачуу аракеттерин көзөмөлдөө"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, планшетти кулпулаңыз же планшеттеги бардык дайын-даректерди тазалап салыңыз."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, планшетти кулпулаңыз же планшеттеги бардык маалыматтарды тазалап салыңыз."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Экрандын кулпусун ачуу учурунда сырсөздөр канча жолу туура эмес терилгенин тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, Android TV түзмөгүңүздү кулпулап же Android TV түзмөгүңүздөгү бардык дайын-даректериңизди тазалап салуу."</string>
- <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, телефонду кулпулаңыз же телефондогу бардык дайын-даректерди тазалап салыңыз."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, телефонду кулпулаңыз же телефондогу бардык маалыматтарды тазалап салыңыз."</string>
<string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Экрандын кулпусун ачуу учурунда туура эмес терилген сырсөздөрдү тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, планшетти кулпулап же бул колдонуучунун бардык дайындарын тазалап салуу."</string>
<string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Экрандын кулпусун ачуу учурунда сырсөздөр канча жолу туура эмес терилгенин тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, Android TV түзмөгүңүздү кулпулап же колдонуучунун бардык дайындарын тазалап салуу."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Экрандын кулпусун ачуу учурунда туура эмес терилген сырсөздөрдү тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, телефонду кулпулап же бул колдонуучунун бардык дайындарын тазалап салуу."</string>
@@ -735,9 +737,9 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Экранды кулпулоо"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Экран качан жана кантип кулпулана турганын чечет."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Бардык маалыматты өчүрүү"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен планшеттеги бардык дайын-даректерди өчүрөт."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен планшеттеги бардык маалыматтарды өчүрөт."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Android TV түзмөгүңүздүн дайындарын эскертүүсүз кайра башынан жөндөө аркылуу тазалоо."</string>
- <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен телефондогу бардык дайын-даректерди өчүрөт."</string>
+ <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен телефондогу бардык маалыматтарды өчүрөт."</string>
<string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"Колдонуучунун дайындарын тазалоо"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Бул колдонуучунун ушул планшеттеги дайындарын эскертүүсүз тазалоо."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Бул Android TV түзмөгүндөгү бул колдонуучу дайындарын эскертүүсүз тазалоо."</string>
@@ -1691,7 +1693,7 @@
<string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"КҮЙҮК"</string>
<string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ӨЧҮК"</string>
<string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> кызматына түзмөгүңүздү толугу менен көзөмөлдөөгө уруксат бересизби?"</string>
- <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Эгер <xliff:g id="SERVICE">%1$s</xliff:g> күйгүзүлсө, түзмөгүңүз дайын-даректерди шифрлөөнү күчтөндүрүү үчүн экраныңыздын кулпусун пайдаланбайт."</string>
+ <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Эгер <xliff:g id="SERVICE">%1$s</xliff:g> күйгүзүлсө, түзмөгүңүз маалыматтарды шифрлөөнү күчтөндүрүү үчүн экраныңыздын кулпусун пайдаланбайт."</string>
<string name="accessibility_service_warning_description" msgid="291674995220940133">"Толук көзөмөл атайын мүмкүнчүлүктөрдү пайдаланууга керек, бирок калган көпчүлүк колдонмолорго кереги жок."</string>
<string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Экранды көрүп, көзөмөлдөө"</string>
<string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Кызмат экрандагы нерселерди окуп, материалды башка колдонмолордун үстүнөн көрсөтөт."</string>
@@ -1852,9 +1854,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Администраторуңуз жаңыртып койгон"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Администраторуңуз жок кылып салган"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ЖАРАЙТ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Батареяны көбүрөөк убакытка жеткирүү үчүн Батареяны үнөмдөгүч режиминде:\n\n• Караңгы тема күйгүзүлөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Батареяны көбүрөөк убакытка жеткирүү үчүн Батареяны үнөмдөгүч режими:\n\n• Караңгы тема күйгүзүлөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string>
- <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайын-даректерди фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайын-даректерди жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор маалыматтарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо маалыматтарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Күйгүзүү"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Бул билдирменин маанилүүлүгү Үнсүз болуп төмөндөтүлдү. Пикир билдирүү үчүн таптап коюңуз."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Бул билдирменин маанилүүлүгү жогорулатылды. Пикир билдирүү үчүн таптап коюңуз."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Бул билдирменин маанилүүлүгү төмөндөтүлдү. Пикир билдирүү үчүн таптап коюңуз."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режимдин адаттагы билдирмеси"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Эми экрандын бир бөлүгүн чоңойто аласыз"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Жөндөөлөрдөн күйгүзүү"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Жабуу"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Улантуу үчүн <b><xliff:g id="APP">%s</xliff:g></b> колдонмосуна түзмөгүңүздүн микрофонун пайдаланууга уруксат беришиңиз керек."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Улантуу үчүн <b><xliff:g id="APP">%s</xliff:g></b> колдонмосуна түзмөгүңүздүн камерасын пайдаланууга уруксат беришиңиз керек."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Күйгүзүү"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Сенсордун купуялыгы"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Колдонмонун сүрөтчөсү"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Колдонмонун брендинин сүрөтү"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index ae1e36e..0b53554 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ເຂົ້າເຖິງກິດຈະກຳທາງກາຍະພາບຂອງທ່ານ"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ກ້ອງ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ຖ່າຍຮູບ ແລະບັນທຶກວິດີໂອ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ຄົ້ນພົບ ແລະ ເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງ"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"ອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ຄົ້ນພົບ ແລະ ເຊື່ອມຕໍ່ຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ບັນທຶກການໂທ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ອ່ານ ແລະ ຂຽນບັນທຶກການໂທ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ໂທລະສັບ"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ອະນຸຍາດໃຫ້ແອັບຄົ້ນພົບ ແລະ ຈັບຄູ່ອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງໄດ້"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth ທີ່ຈັບຄູ່ໄວ້"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ອະນຸຍາດໃຫ້ແອັບເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth ທີ່ຈັບຄູ່ແລ້ວໄດ້"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"ໂຄສະນາຫາອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງໄດ້"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"ອະນຸຍາດໃຫ້ແອັບໂຄສະນາຫາອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງໄດ້"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"ກຳນົດຕຳແໜ່ງທີ່ສຳພັນກັນລະຫວ່າງອຸປະກອນ Ultra-Wideband ທີ່ຢູ່ໃກ້ຄຽງ"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"ອະນຸຍາດໃຫ້ແອັບກຳນົດຕຳແໜ່ງທີ່ສຳພັນກັນລະຫວ່າງອຸປະກອນ Ultra-Wideband ທີ່ຢູ່ໃກ້ຄຽງ"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ຂໍ້ມູນບໍລິການການຈ່າຍເງິນ NFC ທີ່ຕ້ອງການ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ອະນຸຍາດໃຫ້ແອັບຮັບຂໍ້ມູນບໍລິການການຈ່າຍເງິນ NFC ທີ່ຕ້ອງການໄດ້ ເຊັ່ນ: ການຊ່ວຍເຫຼືອແບບລົງທະບຽນ ແລະ ປາຍທາງເສັ້ນທາງ."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ຄວບຄຸມ Near Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ຖືກອັບໂຫລດໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ຖືກລຶບອອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ຕົກລົງ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ເພື່ອຍືດອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດແບັດເຕີຣີຈະ:\n\n• ເປີດໃຊ້ຮູບແບບສີສັນມືດ\n• ປິດ ຫຼື ຈຳກັດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກດ້ານພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດອື່ນໆ ເຊັ່ນ: “Ok Google”\n\n"<annotation id="url">"ສຶກສາເພີ່ມເຕີມ"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ເພື່ອຍືດອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດແບັດເຕີຣີຈະ:\n\n• ເປີດໃຊ້ຮູບແບບສີສັນມືດ\n• ປິດ ຫຼື ຈຳກັດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກດ້ານພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດອື່ນໆ ເຊັ່ນ: “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດອິນເຕີເນັດຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ເປີດຕົວປະຢັດອິນເຕີເນັດບໍ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ເປີດໃຊ້"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ການແຈ້ງເຕືອນນີ້ຖືກຫຼຸດລະດັບເປັນປິດສຽງແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ການແຈ້ງເຕືອນນີ້ຖືກເລື່ອນລະດັບຂຶ້ນແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ການແຈ້ງເຕືອນນີ້ຖືກຫຼຸດລະດັບລົງແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ຕອນນີ້ທ່ານສາມາດຂະຫຍາຍບາງສ່ວນຂອງໜ້າຈໍໄດ້ແລ້ວ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ເປີດໃຊ້ໃນການຕັ້ງຄ່າ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ປິດໄວ້"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ເພື່ອດຳເນີນການຕໍ່, <b><xliff:g id="APP">%s</xliff:g></b> ຕ້ອງການສິດເຂົ້າເຖິງໄມໂຄຣໂຟນອຸປະກອນທ່ານ."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ເພື່ອດຳເນີນການຕໍ່, <b><xliff:g id="APP">%s</xliff:g></b> ຕ້ອງການສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບຂອງອຸປະກອນທ່ານ."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ເປີດໃຊ້"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"ຍົກເລີກການບລັອກໄມໂຄຣໂຟນອຸປະກອນ"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"ຍົກເລີກການບລັອກອຸປະກອນກ້ອງຖ່າຍຮູບ"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"ສຳລັບ <b><xliff:g id="APP">%s</xliff:g></b> ແລະ ແອັບ ແລະ ບໍລິການທັງໝົດ"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"ຍົກເລີກການບລັອກ"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ຄວາມເປັນສ່ວນຕົວເຊັນເຊີ"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ໄອຄອນແອັບພລິເຄຊັນ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ຮູບແບຣນແອັບພລິເຄຊັນ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 8744a8b..5a0b665 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"galimybė pasiekti fizinę veiklą"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparatas"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotografuoti ir filmuoti"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"„Bluetooth“ įrenginiai netoliese"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"aptikti „Bluetooth“ įrenginius netoliese ir prisijungti prie jų"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Įrenginiai netoliese"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"aptikti netoliese esančius įrenginius ir prisijungti prie jų"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Skambučių žurnalai"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"skaityti ir rašyti telefono skambučių žurnalą"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefonas"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Leidžiama programai aptikti ir susieti „Bluetooth“ įrenginius netoliese"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"prisijungimas prie susietų „Bluetooth“ įrenginių"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Leidžiama programai prisijungti prie susietų „Bluetooth“ įrenginių"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"reklamuoti netoliese es. „Bluetooth“ įrenginiuose"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Programai leidžiama reklamuoti netoliese esančiuose „Bluetooth“ įrenginiuose"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"nustatyti apyt. netoliese es. itin plataus dažnio juostos įreng. poziciją"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Leisti programai nustatyti apytikslę netoliese esančių itin plataus dažnio juostos įrenginių poziciją"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Pageidaujama ARL mokėjimo paslaugos informacija"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Programai leidžiama gauti pageidaujamą ARL mokamos paslaugos informaciją, pvz., užregistruotą pagalbą ir maršrutų tikslus."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"valdyti artimo lauko perdavimą (angl. „Near Field Communication“)"</string>
@@ -1898,8 +1898,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Atnaujino administratorius"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Ištrynė administratorius"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Gerai"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Kad akumuliatorius veiktų ilgiau, Akumuliatoriaus tausojimo priemonė:\n\n• įjungia tamsiąją temą;\n• išjungia arba apriboja veiklą fone, kai kuriuos vaizdinius efektus ir kitas funkcijas, pvz., „Ok Google“.\n\n"<annotation id="url">"Sužinokite daugiau"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Kad akumuliatorius veiktų ilgiau, Akumuliatoriaus tausojimo priemonė:\n\n• įjungia tamsiąją temą;\n• išjungia arba apriboja veiklą fone, kai kuriuos vaizdinius efektus ir kitas funkcijas, pvz., „Ok Google“."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Įj. Duomenų taupymo priemonę?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Įjungti"</string>
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Šio pranešimo svarba sumažinta iki begarsio lygio. Palieskite, kad pateiktumėte atsiliepimą."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Šio pranešimo svarba padidinta. Palieskite, kad pateiktumėte atsiliepimą."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Šio pranešimo svarba sumažinta. Palieskite, kad pateiktumėte atsiliepimą."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Veiksmų sekos režimo informacijos pranešimas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Dabar galite padidinti dalį ekrano"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Įjungti nustatymuose"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Atmesti"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Kad būtų galima tęsti, <b><xliff:g id="APP">%s</xliff:g></b> reikalinga prieiga prie įrenginio mikrofono."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Kad būtų galima tęsti, <b><xliff:g id="APP">%s</xliff:g></b> reikalinga prieiga prie įrenginio fotoaparato."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Įjungti"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Panaikinkite įrenginio mikrofono blokavimą"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Panaikinkite įrenginio fotoaparato blokavimą"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> ir visoms programoms bei paslaugoms"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Panaikinti blokavimą"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Jutiklių privatumas"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Programos piktograma"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Programos prekės ženklo vaizdas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b341f32..b4edfc6 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"piekļūt jūsu fiziskajām aktivitātēm"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"uzņemt attēlus un ierakstīt videoklipus"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Tuvumā esošas Bluetooth ierīces"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"atrast tuvumā esošas Bluetooth ierīces un izveidot savienojumu ar tām"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Tuvumā esošās ierīces"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"tuvumā esošu ierīču meklēšana un savienojuma izveide ar tām"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Zvanu žurnāli"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lasīt un rakstīt tālruņa zvanu žurnālu"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Tālrunis"</string>
@@ -541,10 +541,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Ļauj lietotnei atrast un savienot pārī tuvumā esošas Bluetooth ierīces."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"piekļūt pārī savienotām Bluetooth ierīcēm"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Ļauj lietotnei piekļūt pārī savienotām Bluetooth ierīcēm."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"reklamēšana tuvumā esošās Bluetooth ierīcēs"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Atļauj lietotnei veikt reklamēšanu tuvumā esošās Bluetooth ierīcēs"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"novietojuma noteikšana starp tuvu esošām ultraplatjoslas ierīcēm"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Atļaut lietotnei noteikt relatīvo atrašanās vietu starp tuvumā esošām ultraplatjoslas ierīcēm"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informācija par vēlamo NFC maksājumu pakalpojumu"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ļauj lietotnei iegūt informāciju par vēlamo NFC maksājumu pakalpojumu, piemēram, par reģistrētajiem lietojumprogrammu ID un maršruta galamērķi."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolē tuvlauka saziņu"</string>
@@ -1875,8 +1875,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Atjaunināja administrators"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Dzēsa administrators"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Labi"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Lai paildzinātu akumulatora darbības laiku, ieslēdzot akumulatora enerģijas taupīšanas režīmu, tiek veiktas tālāk norādītās darbības.\n\n• Tiek ieslēgts tumšais motīvs.\n• Tiek izslēgtas vai ierobežotas fonā veiktās darbības, daži vizuālie efekti un citas funkcijas, piemēram, “Ok Google”.\n\n"<annotation id="url">"Uzzināt vairāk"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Lai paildzinātu akumulatora darbības laiku, ieslēdzot akumulatora enerģijas taupīšanas režīmu, tiek veiktas tālāk norādītās darbības.\n\n• Tiek ieslēgts tumšais motīvs.\n• Tiek izslēgtas vai ierobežotas fonā veiktās darbības, daži vizuālie efekti un citas funkcijas, piemēram, “Ok Google”."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vai ieslēgt datu lietojuma samazinātāju?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ieslēgt"</string>
@@ -2105,6 +2107,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Šī paziņojuma svarīgums tika pazemināts, un paziņojums tiks rādīts bez skaņas. Lai sniegtu atsauksmes, pieskarieties."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Šī paziņojuma rangs tika paaugstināts. Lai sniegtu atsauksmes, pieskarieties."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Šī paziņojuma rangs tika pazemināts. Lai sniegtu atsauksmes, pieskarieties."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatīvs paziņojums par akumulatoru"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Aktivizēts akumulatora enerģijas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
@@ -2293,9 +2307,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Tagad varat palielināt ekrāna daļu."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ieslēgt sadaļā Iestatījumi"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Nerādīt"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Lai turpinātu, lietotnei <b><xliff:g id="APP">%s</xliff:g></b> nepieciešama piekļuve jūsu ierīces mikrofonam."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Lai turpinātu, lietotnei <b><xliff:g id="APP">%s</xliff:g></b> nepieciešama piekļuve jūsu ierīces kamerai."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Ieslēgt"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Atbloķējiet ierīces mikrofonu"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Atbloķējiet ierīces kameru"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Lietotnei <b><xliff:g id="APP">%s</xliff:g></b> un visām lietotnēm un pakalpojumiem"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Atbloķēt"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensoru konfidencialitāte"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Lietojumprogrammas ikona"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Lietojumprogrammas zīmola attēls"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index d38e931..fce03ff 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"пристапете до вашата физичка активност"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"фотографира и снима видео"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Уреди со Bluetooth во близина"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"да открива и да се поврзува со уреди со Bluetooth во близина"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Уреди во близина"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"да открива и да се поврзува со уреди во близина"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Евиденција на повици"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"чита и пишува евиденција на повици во телефонот"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозволува апликацијата да открива и да се поврзува со спарени уреди со Bluetooth во близина"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"да се поврзува со спарени уреди со Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозволува апликацијата да се поврзува со спарени уреди со Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"да рекламира на уреди со Bluetooth во близина"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Дозволува апликацијата да рекламира на уреди со Bluetooth во близина"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"да ја одреди релативната положба помеѓу уредите со ултраширок појас во близина"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Дозволува апликацијата да ја одреди релативната положба помеѓу уредите со ултраширок појас во близина"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информации за претпочитаната услуга за плаќање преку NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволува апликацијата да добие информации за претпочитаната услуга за плаќање преку NFC, како регистрирани помагала и дестинација на маршрутата."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контролирај комуникација на блиско поле"</string>
@@ -1280,7 +1280,7 @@
<string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Поставено ѕвонење на тивко"</string>
<string name="volume_call" msgid="7625321655265747433">"Јачина на звук на дојдовен повик"</string>
<string name="volume_bluetooth_call" msgid="2930204618610115061">"Јачина на звук на дојдовен повик преку Bluetooth"</string>
- <string name="volume_alarm" msgid="4486241060751798448">"Јачина на звук на аларм"</string>
+ <string name="volume_alarm" msgid="4486241060751798448">"Јачина на звук за аларм"</string>
<string name="volume_notification" msgid="6864412249031660057">"Јачина на звук на известување"</string>
<string name="volume_unknown" msgid="4041914008166576293">"Јачина на звук"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Јачина на звук на Bluetooth"</string>
@@ -1492,7 +1492,7 @@
<string name="vpn_text_long" msgid="278540576806169831">"Поврзани сте на <xliff:g id="SESSION">%s</xliff:g>. Допрете за да управувате со мрежата."</string>
<string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Поврзување со секогаш вклучена VPN..."</string>
<string name="vpn_lockdown_connected" msgid="2853127976590658469">"Поврзани со секогаш вклучена VPN"</string>
- <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Исклучено од секогаш вклучената VPN"</string>
+ <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Не е поврзано со секогаш вклучената VPN"</string>
<string name="vpn_lockdown_error" msgid="4453048646854247947">"Не може да се поврзе на секогаш вклучената VPN"</string>
<string name="vpn_lockdown_config" msgid="8331697329868252169">"Променете ја мрежата или поставките за VPN"</string>
<string name="upload_file" msgid="8651942222301634271">"Избери датотека"</string>
@@ -1624,7 +1624,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Префрли екран на уред"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"Се бараат уреди..."</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Поставки"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Исклучи"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Прекини врска"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"Скенирање..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"Се поврзува..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"Достапна"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ажурирано од администраторот"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Избришано од администраторот"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Во ред"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n\n• вклучува темна тема\n• исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Hey Google“\n\n"<annotation id="url">"Дознајте повеќе"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n\n• вклучува темна тема\n• исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Hey Google“"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Одредена апликација што ја користите ќе може да користи интернет, но можеби тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажуваат додека не ги допрете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Да се вклучи „Штедач на интернет“?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Вклучи"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Приоритетноста на известувањево е намалена на „Тивко“. Допрете за да дадете повратни информации."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Известувањево е рангирано повисоко. Допрете за да дадете повратни информации."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Известувањево е рангирано пониско. Допрете за да дадете повратни информации."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известување за информации за режимот за рутини"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Сега може да зголемувате дел од екранот"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Вклучи во „Поставки“"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Отфрли"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"За да продолжи, на <b><xliff:g id="APP">%s</xliff:g></b> ѝ е потребен пристап до микрофонот на уредот."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"За да продолжи, на <b><xliff:g id="APP">%s</xliff:g></b> ѝ е потребен пристап до камерата на уредот."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Вклучи"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Одблокирајте го пристапот до микрофонот на уредот"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Одблокирајте го пристапот до камерата на уредот"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"За <b><xliff:g id="APP">%s</xliff:g></b> и сите апликации и услуги"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Одблокирај"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Приватност на сензорот"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Икона за апликацијата"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Слика за брендирање на апликацијата"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 0c61cf2..e50fb7bd 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ശാരീരിക പ്രവർത്തനം ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ക്യാമറ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ചിത്രങ്ങളെടുത്ത് വീഡിയോ റെക്കോർഡുചെയ്യുക"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്തി കണക്റ്റ് ചെയ്യുക"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"സമീപമുള്ള ഉപകരണങ്ങൾ"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"സമീപമുള്ള ഉപകരണങ്ങൾ കണ്ടെത്തി അവയിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"കോൾ ലോഗ്"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ഫോൺ കോൾ ലോഗ് വായിക്കുകയും എഴുതുകയും ചെയ്യുക"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ഫോണ്"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്താനും ജോടിയാക്കാനും ആപ്പിനെ അനുവദിക്കുന്നു"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ജോടിയായ Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യൂ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ജോടിയാക്കിയ Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"സമീപമുള്ള അൾട്രാ-വെെഡ്ബാൻഡ് ഉപകരണങ്ങൾ തമ്മിലുള്ള ആപേക്ഷിക സ്ഥാനം നിർണ്ണയിക്കൂ"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"സമീപമുള്ള അൾട്രാ-വെെഡ്ബാൻഡ് ഉപകരണങ്ങൾ തമ്മിലുള്ള ആപേക്ഷിക സ്ഥാനം നിർണ്ണയിക്കാൻ ആപ്പിനെ അനുവദിക്കുക"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"തിരഞ്ഞെടുത്ത NFC പേയ്മെന്റ് സേവനത്തെ സംബന്ധിച്ച വിവരങ്ങൾ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"റൂട്ട് ലക്ഷ്യസ്ഥാനം, രജിസ്റ്റർ ചെയ്തിരിക്കുന്ന സഹായങ്ങൾ എന്നിവ പോലുള്ള, തിരഞ്ഞെടുത്ത NFC പേയ്മെന്റ് സേവനത്തെ സംബന്ധിച്ച വിവരങ്ങൾ ലഭിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"സമീപ ഫീൽഡുമായുള്ള ആശയവിനിമയം നിയന്ത്രിക്കുക"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"നിങ്ങളുടെ അഡ്മിൻ അപ്ഡേറ്റ് ചെയ്യുന്നത്"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"നിങ്ങളുടെ അഡ്മിൻ ഇല്ലാതാക്കുന്നത്"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ശരി"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ബാറ്ററി ലെെഫ് വർദ്ധിപ്പിക്കാൻ, \'ബാറ്ററി ലാഭിക്കൽ\' ഇനിപ്പറയുന്നവ ചെയ്യുന്നു:\n\n•ഡാർക്ക് തീം ഓണാക്കുന്നു\n•പശ്ചാത്തല ആക്റ്റിവിറ്റി, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, “Ok Google” പോലുള്ള മറ്റ് ഫീച്ചറുകൾ എന്നിവ ഓഫാക്കുകയോ നിയന്ത്രിക്കുകയോ ചെയ്യന്നു\n\n"<annotation id="url">"കൂടുതലറിയുക"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ബാറ്ററി ലെെഫ് വർദ്ധിപ്പിക്കാൻ, \'ബാറ്ററി ലാഭിക്കൽ\' ഇനിപ്പറയുന്നവ ചെയ്യുന്നു:\n\n• ഡാർക്ക് തീം ഓണാക്കുന്നു\n• പശ്ചാത്തല ആക്റ്റിവിറ്റി, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, “Ok Google” പോലുള്ള മറ്റ് ഫീച്ചറുകൾ എന്നിവ ഓഫാക്കുകയോ നിയന്ത്രിക്കുകയോ ചെയ്യുന്നു"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിനായി പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്പുകളെ ഡാറ്റാ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്സസ് ചെയ്യാനാകും, എന്നാൽ വല്ലപ്പോഴും മാത്രമെ സംഭവിക്കുന്നുള്ളു. ഇതിനർത്ഥം, ഉദാഹരണമായി നിങ്ങൾ ടാപ്പ് ചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ പ്രദർശിപ്പിക്കുകയില്ല എന്നാണ്."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ഓണാക്കുക"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ഈ അറിയിപ്പിനെ നിശബ്ദമാക്കി തരം താഴ്ത്തി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ഈ അറിയിപ്പിന് ഉയർന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ഈ അറിയിപ്പിന് താഴ്ന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ബാറ്ററി ലൈഫ് വര്ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"നിങ്ങളുടെ സ്ക്രീനിന്റെ ഒരു ഭാഗം ഇപ്പോൾ മാഗ്നിഫൈ ചെയ്യാനാകും"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ക്രമീകരണത്തിൽ ഓണാക്കുക"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ഡിസ്മിസ് ചെയ്യുക"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"തുടരാൻ, <b><xliff:g id="APP">%s</xliff:g></b> ആപ്പിന് നിങ്ങളുടെ ഉപകരണത്തിന്റെ മൈക്രോഫോണിലേക്ക് ആക്സസ് നൽകേണ്ടതുണ്ട്."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"തുടരാൻ, <b><xliff:g id="APP">%s</xliff:g></b> ആപ്പിന് നിങ്ങളുടെ ഉപകരണത്തിന്റെ ക്യാമറയിലേക്ക് ആക്സസ് നൽകേണ്ടതുണ്ട്."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ഓണാക്കുക"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"സെൻസർ സ്വകാര്യത"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ആപ്പ് ഐക്കൺ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"അപ്ലിക്കേഷൻ ബ്രാൻഡിംഗ് ഇമേജ്"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 71c5268..87ee801 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -303,7 +303,7 @@
<string name="android_system_label" msgid="5974767339591067210">"Андройд систем"</string>
<string name="user_owner_label" msgid="8628726904184471211">"Хувийн профайл руу сэлгэх"</string>
<string name="managed_profile_label" msgid="7316778766973512382">"Ажлын профайл руу сэлгэх"</string>
- <string name="permgrouplab_contacts" msgid="4254143639307316920">"Харилцагчдын хаяг"</string>
+ <string name="permgrouplab_contacts" msgid="4254143639307316920">"Харилцагчид"</string>
<string name="permgroupdesc_contacts" msgid="9163927941244182567">"харилцагч руугаа хандах"</string>
<string name="permgrouplab_location" msgid="1858277002233964394">"Байршил"</string>
<string name="permgroupdesc_location" msgid="1995955142118450685">"энэ төхөөрөмжийн байршилд хандалт хийх"</string>
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"таны биеийн дасгал хөдөлгөөнд хандах"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камер"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"зураг авах, бичлэг хийх"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Ойролцоох Bluetooth төхөөрөмжүүд"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ойролцоох Bluetooth төхөөрөмжүүдийг илрүүлж, холбогдох"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Ойролцоох төхөөрөмжүүд"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ойролцоох төхөөрөмжүүдийг илрүүлж, холбогдох"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Дуудлагын жагсаалт"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"утасны дуудлагын жагсаалтыг унших болон бичих"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Утас"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aппыг ойролцоох Bluetooth төхөөрөмжүүдийг илрүүлж, хослуулахыг зөвшөөрдөг"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"хослуулсан Bluetooth төхөөрөмжүүдэд холбогдох"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Аппыг хослуулсан Bluetooth төхөөрөмжүүдэд холбогдохыг зөвшөөрдөг"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"Ойролцоох Bluetooth төхөөрөмжүүдэд сурталчлах"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Аппад ойролцоох Bluetooth төхөөрөмжүүдэд сурталчлахыг зөвшөөрнө"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"ойролцоох ультра өргөн зурвасын төхөөрөмжүүдийн хоорондох холбоотой байрлалыг тодорхойлох"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Аппад ойролцоох ультра өргөн зурвасын төхөөрөмжүүдийн хоорондох холбоотой байрлалыг тодорхойлохыг зөвшөөрөх"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Сонгосон NFC төлбөрийн үйлчилгээний мэдээлэл"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Бүртгүүлсэн төхөөрөмж болон маршрутын хүрэх цэг зэрэг сонгосон nfc төлбөрийн үйлчилгээний мэдээллийг авахыг аппад зөвшөөрдөг."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ойролцоо талбарын холбоог удирдах"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Таны админ шинэчилсэн"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Таны админ устгасан"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгч:\n\n•Бараан загварыг асаадаг\n•Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарладаг\n\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Батарей хэмнэгч нь батарейн ажиллах хугацааг уртасгахын тулд:\n\n• Бараан загварыг асаадаг\n• Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарладаг"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь ар талд ажиллаж буй зарим апп-н өгөгдлийг илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч тогтмол хандахгүй. Энэ нь жишээлбэл зургийг товших хүртэл харагдахгүй гэсэн үг юм."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Дата хэмнэгчийг асаах уу?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Асаах"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Энэ мэдэгдлийг Чимээгүй болгож зэргийг нь бууруулсан байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Энэ мэдэгдлийг дээгүүр зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Энэ мэдэгдлийг доогуур зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Та одоо дэлгэцийнхээ хэсгийг томруулах боломжтой"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Тохиргоонд асаана уу"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Үл хэрэгсэх"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Үргэлжлүүлэхийн тулд, <b><xliff:g id="APP">%s</xliff:g></b> таны төхөөрөмжийн микрофонд хандах шаардлагатай."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Үргэлжлүүлэхийн тулд <b><xliff:g id="APP">%s</xliff:g></b> таны төхөөрөмжийн камерт хандах шаардлагатай."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Асаах"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Төхөөрөмжийн микрофоныг блокоос гаргах"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Төхөөрөмжийн камерыг блокоос гаргах"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> болон бүх апп, үйлчилгээнд"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Блокоос гаргах"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Мэдрэгчийн нууцлал"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Аппын дүрс тэмдэг"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Аппын брэнд зураг"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index fec8804..01b767e 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"शारीरिक अॅक्टिव्हिटी अॅक्सेस करा"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"कॅमेरा"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"चित्रे काढण्याची आणि व्हिडिओ रेकॉर्ड करण्याची"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"जवळपासची ब्लूटूथ डिव्हाइस"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"जवळपासची ब्लूटूथ डिव्हाइस शोधा आणि ती कनेक्ट करा"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"जवळपासची डीव्हाइस"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"जवळपास असलेली डिव्हाइस शोध आणि त्यांच्याशी कनेक्ट करा"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"कॉल लॉग"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"फोन कॉल लॉग वाचा आणि लिहा"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"फोन"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ॲपला जवळपासची ब्लूटूथ डिव्हाइस शोधण्यासाठी आणि ती पेअर करण्यासाठी अनुमती देते"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"पेअर केलेल्या ब्लूटूथ डिव्हाइसशी कनेक्ट करा"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"पेअर केलेल्या ब्लूटूथ डिव्हाइसशी कनेक्ट करण्यासाठी ॲपला अनुमती द्या"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"जवळच्या अल्ट्रा-वाइडबँड डिव्हाइसदरम्यानचे संबंधित स्थान निर्धारित करा"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"ॲपला जवळच्या अल्ट्रा-वाइडबँड डिव्हाइसदरम्यानचे संबंधित स्थान निर्धारित करण्याची अनुमती द्या"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"प्राधान्यकृत NFC पेमेंट सेवा माहिती"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"नोंदणीकृत एड्स आणि मार्ग गंतव्यस्थान सारखी प्राधान्यकृत एनएफसी पेमेंट सेवेची माहिती मिळवण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"फील्ड जवळील कम्युनिकेशन नियंत्रित करा"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"आपल्या प्रशासकाने अपडेट केले"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"आपल्या प्रशासकाने हटवले"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ओके"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर:\n\n•गडद थीम सुरू करते\n•बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यांसारखी वैशिष्ट्ये बंद किंवा मर्यादित करते.\n\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर:\n\n• गडद थीम सुरू करते\n• बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि “Ok Google” यांसारखी इतर वैशिष्ट्ये बंद किंवा मर्यादित करते"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अॅप्सना बॅकग्राउंडमध्ये डेटा पाठवण्यास किंवा मिळवण्यास डेटा सर्व्हर प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अॅप डेटा अॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असे होऊ शकते."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेव्हर सुरू करायचे?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"सुरू करा"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ही सूचना सायलंट करण्यात आली आहे. फीडबॅक देण्यासाठी टॅप करा."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"हा सूचनेला उच्च रँक करण्यात आले. फीडबॅक देण्यासाठी टॅप करा."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"या सूचनेला कमी रँक करण्यात आले. फीडबॅक देण्यासाठी टॅप करा."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनक्रम मोडची माहिती सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"चार्जिंगची सामान्य पातळी गाठेपर्यंत कदाचित बॅटरी संपू शकते"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर सुरू केला आहे"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"आता तुम्ही तुमच्या स्क्रीनचा एखादा भाग मॅग्निफाय करू शकता"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिंग्ज मध्ये सुरू करा"</string>
<string name="dismiss_action" msgid="1728820550388704784">"डिसमिस करा"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"पुढे सुरू ठेवण्यासाठी, <b><xliff:g id="APP">%s</xliff:g></b> ला तुमच्या डिव्हाइसचा मायक्रोफोन अॅक्सेस करण्याची आवश्यकता आहे."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"पुढे सुरू ठेवण्यासाठी, <b><xliff:g id="APP">%s</xliff:g></b> ला तुमच्या डिव्हाइसचा कॅमेरा अॅक्सेस करण्याची आवश्यकता आहे."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"सुरू करा"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"सेन्सरशी संबंधित गोपनीयतेबाबत सूचना"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ॲप्लिकेशन आयकन"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"अॅप्लिकेशन ब्रॅंडिंग इमेज"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 7f4f430..d5fe785 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"akses aktiviti fizikal anda"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ambil gambar dan rakam video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Peranti Bluetooth yang Berdekatan"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"temukan dan sambung kepada peranti Bluetooth yang berdekatan"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Peranti berdekatan"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"temukan dan sambung kepada peranti yang berdekatan"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Log panggilan"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"baca dan tulis log panggilan telefon"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Membenarkan apl menemukan dan berganding dengan peranti Bluetooth yang berdekatan"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"sambung kepada peranti Bluetooth yang digandingkan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Membenarkan apl untuk menyambung kepada peranti Bluetooth yang digandingkan"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"tentukan kedudukan relatif antara peranti Ultrajalur Lebar berdekatan"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Benarkan apl menentukan kedudukan relatif antara peranti Ultrajalur Lebar berdekatan"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Maklumat Perkhidmatan Pembayaran NFC Pilihan"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Membenarkan apl mendapatkan maklumat perkhidmatan pembayaran nfc pilihan seperti bantuan berdaftar dan destinasi laluan."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"mengawal Komunikasi Medan Dekat"</string>
@@ -1160,7 +1162,7 @@
<string name="redo" msgid="7231448494008532233">"Buat semula"</string>
<string name="autofill" msgid="511224882647795296">"Autolengkap"</string>
<string name="textSelectionCABTitle" msgid="5151441579532476940">"Pemilihan teks"</string>
- <string name="addToDictionary" msgid="8041821113480950096">"Tambah ke kamus"</string>
+ <string name="addToDictionary" msgid="8041821113480950096">"Tambahkan pada kamus"</string>
<string name="deleteText" msgid="4200807474529938112">"Padam"</string>
<string name="inputMethod" msgid="1784759500516314751">"Kaedah input"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Dikemas kini oleh pentadbir anda"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Dipadamkan oleh pentadbir anda"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Untuk melanjutkan hayat bateri, Penjimat Bateri:\n\n• Menghidupkan Tema gelap\n• Mematikan atau mengehadkan aktiviti latar belakang, sesetengah kesan visual dan ciri lain seperti “Ok Google”\n\n"<annotation id="url">"Ketahui lebih lanjut"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Untuk melanjutkan hayat bateri, Penjimat Bateri:\n\n•Menghidupkan Tema gelap\n• Mematikan atau mengehadkan aktiviti latar belakang, sesetengah kesan visual dan ciri-ciri lain seperti “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Hidupkan Penjimat Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Hidupkan"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Pemberitahuan ini telah diturun taraf kepada Senyap. Ketik untuk memberikan maklum balas."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Pemberitahuan ini berada di kedudukan lebih tinggi. Ketik untuk memberikan maklum balas."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Pemberitahuan ini berada di kedudukan lebih rendah. Ketik untuk memberikan maklum balas."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Pemberitahuan maklumat Mod Rutin"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateri mungkin habis sebelum pengecasan biasa"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Kini anda boleh membesarkan sebahagian skrin anda"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Hidupkan dalam Tetapan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Tolak"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Untuk meneruskan proses, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses kepada mikrofon peranti anda."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Untuk meneruskan proses, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses kepada kamera peranti anda."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Hidupkan"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privasi Penderia"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikon aplikasi"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imej jenama aplikasi"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 5885136..5f6a26a5 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -276,7 +276,7 @@
<string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"၉၉၉+"</string>
<string name="notification_hidden_text" msgid="2835519769868187223">"အကြောင်းကြားချက်အသစ်"</string>
<string name="notification_channel_virtual_keyboard" msgid="6465975799223304567">"ပကတိအသွင်ကီးဘုတ်"</string>
- <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"ကီးဘုတ် ခလုတ်ခုံ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"စက်၏ ကီးဘုတ်"</string>
<string name="notification_channel_security" msgid="8516754650348238057">"လုံခြုံရေး"</string>
<string name="notification_channel_car_mode" msgid="2123919247040988436">"ကားမုဒ်"</string>
<string name="notification_channel_account" msgid="6436294521740148173">"အကောင့် အခြေအနေ"</string>
@@ -319,14 +319,14 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"သင့်ကိုယ်လက်လှုပ်ရှားမှုကို ဝင်ကြည့်ရန်"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ကင်မရာ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံ ရိုက်ပြီးနောက် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များကို ရှာဖွေပြီးချိတ်ဆက်မည်"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"အနီးတစ်ဝိုက်ရှိ စက်များ"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"အနီးတစ်ဝိုက်ရှိ စက်များကို ရှာဖွေပြီးချိတ်ဆက်မည်"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ခေါ်ဆိုမှတ်တမ်း"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ဖုန်းခေါ်ဆိုထားသော မှတ်တမ်း ဖတ်ပြီး ရေးရန်"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ဖုန်း"</string>
<string name="permgroupdesc_phone" msgid="270048070781478204">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string>
<string name="permgrouplab_sensors" msgid="9134046949784064495">"စက်၏ အာရုံခံစနစ်များ"</string>
- <string name="permgroupdesc_sensors" msgid="2610631290633747752">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string>
+ <string name="permgroupdesc_sensors" msgid="2610631290633747752">"သင်၏အရေးပြီးသော ကျန်းမာရေးလက္ခဏာဆိုင်ရာ အာရုံခံကိရိယာဒေတာကို ရယူရန်"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များကို ရှာဖွေပြီးတွဲချိတ်ရန် အက်ပ်ကိုခွင့်ပြုမည်"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"တွဲချိတ်ထားသော ဘလူးတုသ်စက်များနှင့် ချိတ်ဆက်ခြင်း"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"တွဲချိတ်ထားသော ဘလူးတုသ်သုံးစက်များနှင့် ချိတ်ဆက်ရန် အက်ပ်ကိုခွင့်ပြုမည်"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များတွင် ကြော်ငြာခြင်း"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များတွင် ကြော်ငြာရန် အက်ပ်အား ခွင့်ပြုမည်"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"အနီးတစ်ဝိုက်ရှိ ‘အလွန်ကျယ်ပြန့်သော လှိုင်းအလျားသုံးစက်များ’ ကြား ဆက်စပ်နေရာကို သတ်မှတ်ခြင်း"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"အနီးတစ်ဝိုက်ရှိ ‘အလွန်ကျယ်ပြန့်သော လှိုင်းအလျားသုံးစက်များ’ ကြား ဆက်စပ်နေရာကို သတ်မှတ်ရန် အက်ပ်ကို ခွင့်ပြုမည်"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ဦးစားပေး NFC ငွေပေးချေမှုဆိုင်ရာ ဝန်ဆောင်မှု အချက်အလက်များ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"အက်ပ်အား ဦစားပေး NFC ငွေပေးချေမှုဆိုင်ရာ ဝန်ဆောင်မှု အချက်အလက်များဖြစ်သည့် မှတ်ပုံတင်ထားသော အကူအညီများနှင့် သွားလာရာ လမ်းကြောင်းတို့ကို ရယူရန် ခွင့်ပြုသည်။"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communicationအား ထိန်းချုပ်ရန်"</string>
@@ -1285,12 +1285,12 @@
<string name="volume_unknown" msgid="4041914008166576293">"အသံအတိုးအကျယ်"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"ဘလူးတုသ်သံအတိုးအကျယ်"</string>
<string name="volume_icon_description_ringer" msgid="2187800636867423459">"ဖုန်းမြည်သံအတိုးအကျယ်"</string>
- <string name="volume_icon_description_incall" msgid="4491255105381227919">"ခေါ်ဆိုနေခြင်းအသံအတိုးအကျယ်"</string>
+ <string name="volume_icon_description_incall" msgid="4491255105381227919">"ဖုန်းခေါ်သံအတိုးအကျယ်"</string>
<string name="volume_icon_description_media" msgid="4997633254078171233">"မီဒီယာအသံအတိုးအကျယ်"</string>
<string name="volume_icon_description_notification" msgid="579091344110747279">"အကြောင်းကြားသံအတိုးအကျယ်"</string>
<string name="ringtone_default" msgid="9118299121288174597">"မူရင်းမြည်သံ"</string>
<string name="ringtone_default_with_actual" msgid="2709686194556159773">"မူရင်း (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
- <string name="ringtone_silent" msgid="397111123930141876">"တစ်ခုမျှမဟုတ်"</string>
+ <string name="ringtone_silent" msgid="397111123930141876">"မရှိ"</string>
<string name="ringtone_picker_title" msgid="667342618626068253">"မြည်သံများ"</string>
<string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"နှိုးစက်သံ"</string>
<string name="ringtone_picker_title_notification" msgid="6387191794719608122">"အကြောင်းကြားချက်အသံ"</string>
@@ -1386,9 +1386,9 @@
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"မျှဝေပါ"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"ငြင်းပယ်ပါ"</string>
<string name="select_input_method" msgid="3971267998568587025">"ထည့်သွင်းရေး နည်းကို ရွေးရန်"</string>
- <string name="show_ime" msgid="6406112007347443383">"စက်၏ကီးဘုတ်ကိုအသုံးပြုနေစဉ် ၎င်းကိုမျက်နှာပြင်ပေါ်တွင် ထားပါ"</string>
+ <string name="show_ime" msgid="6406112007347443383">"စက်၏ကီးဘုတ် ဖွင့်ထားစဉ်တွင် ၎င်းကို ဖန်သားပြင်ပေါ်တွင် ဆက်ထားပါ"</string>
<string name="hardware" msgid="1800597768237606953">"ပကတိအသွင်ကီးဘုတ်ပြရန်"</string>
- <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"ရုပ်ပိုင်းဆိုင်ရာ အသွင်အပြင်ကို ပြင်ဆင်သတ်မှတ်ပါ"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"စက်၏ ကီးဘုတ်ကို ပြင်ဆင်သတ်မှတ်ပါ"</string>
<string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ"</string>
<string name="fast_scroll_alphabet" msgid="8854435958703888376">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="2529539945421557329">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က- \n\n• မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည်\n• နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်သည် သို့မဟုတ် ကန့်သတ်သည်\n\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က-\n\n•မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည်\n•နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်သည် သို့မဟုတ် ကန့်သတ်သည်"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ပါ"</string>
@@ -2026,7 +2028,7 @@
<string name="autofill_save_type_debit_card" msgid="3169397504133097468">"ဒက်ဘစ် ကတ်"</string>
<string name="autofill_save_type_payment_card" msgid="6555012156728690856">"ငွေပေးချေမှုကတ်"</string>
<string name="autofill_save_type_generic_card" msgid="1019367283921448608">"ကတ်"</string>
- <string name="autofill_save_type_username" msgid="1018816929884640882">"အသုံးပြုသူအမည်"</string>
+ <string name="autofill_save_type_username" msgid="1018816929884640882">"သုံးသူအမည်"</string>
<string name="autofill_save_type_email_address" msgid="1303262336895591924">"အီးမေးလ်လိပ်စာ"</string>
<string name="etws_primary_default_message_earthquake" msgid="8401079517718280669">"စိတ်ငြိမ်ငြိမ်ထားပြီး အနီးအနားတဝိုက်တွင် ခိုနားစရာ နေရာရှာပါ။"</string>
<string name="etws_primary_default_message_tsunami" msgid="5828171463387976279">"ကမ်းရိုးတန်းနှင့် မြစ်ကမ်းရိုးတစ်လျှောက်ရှိ နေရာဒေသတို့မှ ချက်ချင်းထွက်ခွာပြီး ဘေးကင်းရာကုန်းမြင့်ဒေသသို့ ပြောင်းရွှေ့ပါ။"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ဤအကြောင်းကြားချက်ကို \'အသံတိတ်ခြင်း\' သို့ ပြန်ချိန်ညှိထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ဤအကြောင်းကြားချက်ကို အဆင့်တိုးထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ဤအကြောင်းကြားချက်ကို အဆင့်လျှော့ထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ဖန်သားပြင်တစ်စိတ်တစ်ပိုင်းကို ယခုချဲ့နိုင်ပါပြီ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"\'ဆက်တင်များ\' တွင် ဖွင့်ရန်"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ပယ်ရန်"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ဆက်လက်လုပ်ဆောင်ရန် <b><xliff:g id="APP">%s</xliff:g></b> က သင့်စက်၏ မိုက်ခရိုဖုန်းကို အသုံးပြုခွင့်ရရန် လိုအပ်သည်။"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ဆက်လက်လုပ်ဆောင်ရန် <b><xliff:g id="APP">%s</xliff:g></b> က သင့်စက်၏ ကင်မရာကို အသုံးပြုခွင့်ရရန် လိုအပ်သည်။"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ဖွင့်ရန်"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"စက်၏မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်ရန်"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"စက်၏ကင်မရာကို ပြန်ဖွင့်ရန်"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b>၊ အက်ပ်နှင့် ဝန်ဆောင်မှုအားလုံးအတွက်"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"ပြန်ဖွင့်ရန်"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"အာရုံခံကိရိယာ လုံခြုံရေး"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"အပလီကေးရှင်း သင်္ကေတ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"အပလီကေးရှင်း ကုန်အမှတ်တံဆိပ်ပုံ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 526fb85..ec8d9d5 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"tilgang til den fysiske aktiviteten din"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ta bilder og ta opp video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-enheter i nærheten"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"oppdage og koble til Bluetooth-enheter i nærheten"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Enheter i nærheten"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"oppdage og koble til enheter i nærheten"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Samtalelogger"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lese og skrive samtaleloggen"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lar appen oppdage og koble til Bluetooth-enheter i nærheten"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"koble til tilkoblede Bluetooth-enheter"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lar appen koble til tilkoblede Bluetooth-enheter"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"vise til Bluetooth-enheter i nærheten"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Lar appen vise annonser til Bluetooth-enheter i nærheten"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"fastslå relativ posisjon mellom enheter som bruker ultrabredbånd"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"tillate at appen fastslår den relative posisjonen mellom enheter i nærheten som bruker ultrabredbånd"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informasjon om prioritert NFC-betalingstjeneste"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gir appen tilgang til informasjon om prioritert NFC-betalingstjeneste, for eksempel registrerte hjelpemidler og destinasjon."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontroller overføring av data med NFC-teknologi"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Oppdatert av administratoren din"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet av administratoren din"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"For å forlenge batterilevetiden gjør Batterisparing dette:\n\n• slår på mørkt tema\n• slår av eller begrenser bakgrunnsaktivitet, enkelte visuelle effekter og andre funksjoner, for eksempel «Hey Google»\n\n"<annotation id="url">"Finn ut mer"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"For å forlenge batterilevetiden gjør Batterisparing dette:\n\n• slår på mørkt tema\n• slår av eller begrenser bakgrunnsaktivitet, enkelte visuelle effekter og andre funksjoner, for eksempel «Hey Google»"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Datasparing hindrer noen apper fra å sende og motta data i bakgrunnen, for å redusere dataforbruket. Aktive apper kan bruke data, men kanskje ikke så mye som ellers – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Slå på"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Dette varselet ble nedgradert til lydløst. Trykk for å gi tilbakemelding."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Dette varselet ble rangert høyere. Trykk for å gi tilbakemelding."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Dette varselet ble rangert lavere. Trykk for å gi tilbakemelding."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Varsel med informasjon om rutinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan gå tomt før den vanlige ladingen"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nå kan du forstørre en del av skjermen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Slå på i innstillingene"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Avvis"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"For å fortsette må <b><xliff:g id="APP">%s</xliff:g></b> ha tilgang til enhetsmikrofonen."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"For å fortsette må <b><xliff:g id="APP">%s</xliff:g></b> ha tilgang til enhetskameraet."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Slå på"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Opphev blokkeringen av enhetsmikrofonen"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Opphev blokkeringen av enhetskameraet"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"For <b><xliff:g id="APP">%s</xliff:g></b> og alle apper og tjenester"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Opphev blokkeringen"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorpersonvern"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Appikon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Merkevareprofilen til appen"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 1c2c2ab..894edcf 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -320,9 +320,11 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"आफ्नो शारीरिक क्रियाकलापको डेटामाथि पहुँच राख्नु"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"क्यामेरा"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"फोटो खिच्नुका साथै भिडियो रेकर्ड गर्नुहोस्"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"नजिकै रहेका ब्लुटुथ चल्ने यन्त्रहरू"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"नजिकै रहेका ब्लुटुथ चल्ने यन्त्रहरू भेट्टाउने र ती यन्त्रहरूसँग कनेक्ट गर्ने"</string>
- <string name="permgrouplab_calllog" msgid="7926834372073550288">"कलका लगहरू"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
+ <string name="permgrouplab_calllog" msgid="7926834372073550288">"कल लग"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"फोन कलको लग पढ्नुहोस् र लेख्नुहोस्"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"फोन"</string>
<string name="permgroupdesc_phone" msgid="270048070781478204">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
@@ -360,7 +362,7 @@
<string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"एपलाई आगमन फोन कलको जवाफ दिन अनुमति दिन्छ।"</string>
<string name="permlab_receiveSms" msgid="505961632050451881">"टेक्स्ट म्यासेजहरू (SMS) प्राप्त गर्नुहोस्"</string>
<string name="permdesc_receiveSms" msgid="1797345626687832285">"एपलाई SMS सन्देशहरू प्राप्त गर्न र प्रक्रिया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string>
- <string name="permlab_receiveMms" msgid="4000650116674380275">"पाठ सन्देश (MMS) प्राप्त गर्नुहोस्"</string>
+ <string name="permlab_receiveMms" msgid="4000650116674380275">"टेक्स्ट म्यासेज (MMS) प्राप्त गर्नुहोस्"</string>
<string name="permdesc_receiveMms" msgid="958102423732219710">"एपलाई MMS सन्देशहरू प्राप्त गर्न र प्रकृया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string>
<string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"मोबाइल प्रसारणसम्बन्धी सन्देशहरू फर्वार्ड गर्नुहोस्"</string>
<string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"मोबाइल प्रसारणसम्बन्धी सन्देशहरू प्राप्त हुनासाथै तिनीहरूलाई फर्वार्ड गर्नका लागि यसले एपलाई मोबाइल प्रसारण मोड्युलमा जोडिने अनुमति दिन्छ। तपाईंलाई कतिपय स्थानमा आपत्कालीन अवस्थाका बारेमा जानकारी दिनका लागि मोबाइल प्रसारणसम्बन्धी अलर्टहरू पठाइन्छ। हानिकारक एपहरूले आपत्कालीन मोबाइल प्रसारण प्राप्त हुँदा तपाईंको यन्त्रलाई कार्य सम्पादन गर्ने वा सञ्चालित हुने क्रममा हस्तक्षेप गर्न सक्छन्।"</string>
@@ -413,9 +415,9 @@
<string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"एपलाई प्रसारण समाप्त भइसकेपछि पनि रहिरहने स्टिकी प्रसारणहरू पठाउने अनुमति दिन्छ। यो सुविधाको अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग हुने भएकाले तपाईंको Android टिभी यन्त्र सुस्त वा अस्थिर हुन सक्छ।"</string>
<string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"औपचारिक प्रसारणलाई पठाउनको लागि एक एपलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले फोनलाई ढिलो र अस्थिर बनाउन सक्छ।"</string>
<string name="permlab_readContacts" msgid="8776395111787429099">"तपाईँका सम्पर्कहरू पढ्नुहोस्"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
- <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"एपलाई तपाईंको Android टिभी डिभाइसमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android टिभी डिभाइसमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
- <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"एपलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सेभ गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
+ <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"एपलाई तपाईंको Android टिभी डिभाइसमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android टिभी डिभाइसमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सेभ गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
+ <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"एपलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सेभ गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string>
<string name="permlab_writeContacts" msgid="8919430536404830430">"तपाईँका सम्पर्कहरू परिवर्तन गर्नुहोस्"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"एपलाई तपाईंको ट्याब्लेटमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string>
<string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"एपलाई तपाईंको Android टिभी डिभाइसमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string>
@@ -535,10 +537,14 @@
<string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ट्याब्लेटमा ब्लुटुथको कन्फिगुरेसनलाई हेर्न र बनाउन र जोडी उपकरणहरूसँग जडानहरूलाई स्वीकार गर्न एपलाई अनुमति दिन्छ।"</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"एपलाई तपाईंको Android टिभी डिभाइसको ब्लुटुथको कन्फिगुरेसन हेर्ने तथा जोडा बनाइएका यन्त्रहरूसँग जोडिने वा ती यन्त्रहरूले पठाएका जोडिने अनुरोध स्वीकार्ने अनुमति दिन्छ।"</string>
<string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"एपलाई फोनमा ब्लुटुथको कन्फिगरेसन हेर्न र जोडी भएका उपकरणहरूसँग जडानहरू बनाउन र स्वीकार गर्न अनुमति दिन्छ।"</string>
- <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"नजिकै रहेका ब्लुटुथ चल्ने यन्त्रहरू भेट्टाउने र ती यन्त्रहरूसँग कनेक्ट गर्ने"</string>
- <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"यो अनुमति दिइएमा एपले नजिकै रहेका ब्लुटुथ चल्ने यन्त्रहरू भेट्टाउन र ती यन्त्रहरूसँग कनेक्ट गर्न सक्छ"</string>
+ <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"नजिकै रहेका ब्लुटुथ चल्ने डिभाइसहरू भेट्टाउने र ती यन्त्रहरूसँग कनेक्ट गर्ने"</string>
+ <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"यो अनुमति दिइएमा एपले नजिकै रहेका ब्लुटुथ चल्ने डिभाइसहरू भेट्टाउन र ती यन्त्रहरूसँग कनेक्ट गर्न सक्छ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"लिंक गरिएका ब्लुटुथ चल्ने यन्त्रहरूसँग कनेक्ट गर्ने"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"यो अनुमति दिइएमा एपले लिंक गरिएका ब्लुटुथ चल्ने यन्त्रहरूसँग कनेक्ट गर्न सक्छ"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -577,8 +583,7 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"कुनै पनि PIN, ढाँचा वा पासवर्ड सेट गरिएको छैन"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"प्रमाणित गर्ने क्रममा त्रुटि भयो"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"स्क्रिन लक प्रयोग गर्नुहोस्"</string>
- <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"जारी राख्न आफ्नो स्क्रिन लक हाल्नुहोस्"</string>
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फिंगरप्रिन्ट प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
@@ -665,8 +670,7 @@
<string name="face_name_template" msgid="3877037340223318119">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"फेस अनलक प्रयोग गर्नुहोस्"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"फेस अनलक वा स्क्रिन लक प्रयोग गर्नुहोस्"</string>
- <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
- <skip />
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"जारी राख्न आफ्नो अनुहारको सहायताले पुष्टि गर्नुहोस्"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी राख्न आफ्नो फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -744,7 +748,7 @@
<string name="policydesc_resetPassword" msgid="4626419138439341851">"स्क्रिन लक परिवर्तन गर्नुहोस्।"</string>
<string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रिन लक गर्ने"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"कसरी र कहिले स्क्रिन लक गर्ने नियन्त्रण गर्नुहोस्।"</string>
- <string name="policylab_wipeData" msgid="1359485247727537311">"सबै डेटा मेट्नुहोस्"</string>
+ <string name="policylab_wipeData" msgid="1359485247727537311">"सबै डेटा मेट्ने"</string>
<string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"एउटा फ्याक्ट्रि डेटा रिसेट गरेर चेतावनी नआउँदै ट्याबल्टको डेटा मेट्नुहोस्।"</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"फ्याक्ट्री डेटा रिसेट गरेर चेतावनी नदिइकन आफ्नो Android टिभी डिभाइसको डेटा मेटाउनुहोस्।"</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"एउटा फ्याक्ट्रि डेटा रिसेट गरेर चेतावनी नदिइकन फोनको डेटा मेट्न।"</string>
@@ -940,7 +944,7 @@
<string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"पासवर्ड:"</string>
<string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"साइन इन गर्नुहोस्"</string>
<string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"अमान्य प्रयोगकर्तानाम वा पासवर्ड"</string>
- <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"तपाईँको एक-पटके पाठ सन्देश वा पासवर्ड बिर्सनुभयो?\n भ्रमण गर्नुहोस"<b>"google.com/accounts/recovery"</b></string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"तपाईँको एक-पटके टेक्स्ट म्यासेज वा पासवर्ड बिर्सनुभयो?\n भ्रमण गर्नुहोस"<b>"google.com/accounts/recovery"</b></string>
<string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"जाँच गर्दै..."</string>
<string name="lockscreen_unlock_label" msgid="4648257878373307582">"खोल्नुहोस्"</string>
<string name="lockscreen_sound_on_label" msgid="1660281470535492430">"आवाज चालु छ।"</string>
@@ -1372,7 +1376,7 @@
<string name="usb_midi_notification_title" msgid="7404506788950595557">"USB मार्फत MIDI सेवा सक्रिय गरियो"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB सहायक उपकरण जडान गरियो"</string>
<string name="usb_notification_message" msgid="4715163067192110676">"थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
- <string name="usb_power_notification_message" msgid="7284765627437897702">"जडान गरिएको यन्त्र चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
+ <string name="usb_power_notification_message" msgid="7284765627437897702">"कनेक्ट गरिएको डिभाइस चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"एनालग अडियोको सहायक उपकरण पत्ता लाग्यो"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"USB डिबगिङ सक्रिय गरिएको छ"</string>
@@ -1583,7 +1587,7 @@
<string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ड्राइभ"</string>
<string name="storage_usb" msgid="2391213347883616886">"USB भण्डारण"</string>
<string name="extract_edit_menu_button" msgid="63954536535863040">"सम्पादन गर्नुहोस्"</string>
- <string name="data_usage_warning_title" msgid="9034893717078325845">"डेटासम्बन्धी चेतावनी"</string>
+ <string name="data_usage_warning_title" msgid="9034893717078325845">"डेटाको खपतसम्बन्धी चेतावनी"</string>
<string name="data_usage_warning_body" msgid="1669325367188029454">"तपाईंले <xliff:g id="APP">%s</xliff:g> डेटा प्रयोग गर्नुभयो"</string>
<string name="data_usage_mobile_limit_title" msgid="3911447354393775241">"मोबाइल डेटाको अधिकतम सीमा पुगेको छ"</string>
<string name="data_usage_wifi_limit_title" msgid="2069698056520812232">"Wi-Fi डेटा सीमा पुग्यो"</string>
@@ -1634,7 +1638,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"स्क्रिन उपकरणमा कास्ट गर्नुहोस्"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"उपकरणको खोजी गरिँदै..."</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"सेटिंङहरू"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"विच्छेदन गर्नुहोस्"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"डिस्कनेक्ट गर्नुहोस्"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"स्क्यान गर्दै ..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"जडान हुँदै..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"उपलब्ध"</string>
@@ -1668,7 +1672,7 @@
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"PIN कोडहरू मेल खाएन"</string>
<string name="kg_login_too_many_attempts" msgid="699292728290654121">"निकै धेरै ढाँचा कोसिसहरू"</string>
<string name="kg_login_instructions" msgid="3619844310339066827">"अनलक गर्नको लागि, तपाईँको Google खाताको साथ साइन इन गर्नुहोस्।"</string>
- <string name="kg_login_username_hint" msgid="1765453775467133251">"एक-पटके पाठ सन्देश (इमेल)"</string>
+ <string name="kg_login_username_hint" msgid="1765453775467133251">"एक-पटके टेक्स्ट म्यासेज (इमेल)"</string>
<string name="kg_login_password_hint" msgid="3330530727273164402">"पासवर्ड"</string>
<string name="kg_login_submit_button" msgid="893611277617096870">"साइन इन गर्नुहोस्"</string>
<string name="kg_login_invalid_input" msgid="8292367491901220210">"अमान्य प्रयोगकर्तानाम वा पासवर्ड।"</string>
@@ -1862,9 +1866,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"तपाईंका प्रशासकले मेट्नुभएको"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ठिक छ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ब्याट्री सेभरले डिभाइसको ब्याट्री बढी समय टिकाउन:\n\n•अँध्यारो थिम सक्रिय गर्छ\n•पृष्ठभूमिका गतिविधि, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ\n\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ब्याट्री सेभरले डिभाइसको ब्याट्री बढी समय टिकाउन:\n\n• अँध्यारो थिम अन गर्छ\n• पृष्ठभूमिका क्रियाकलाप, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू अफ गर्छ वा सीमित पार्छ"</string>
- <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्न डेटा सर्भरले केही एपलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटा चलाउन सक्छ, तर पहिला भन्दा कम अन्तरालमा मात्र। उदाहरणका लागि, तपाईले छविहरूमा ट्याप नगरेसम्म ती छविहरू देखिँदैनन्।"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"डेटा सेभरले डेटा खपत कम गर्न केही एपहरूलाई ब्याकग्राउन्डमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले अहिले प्रयोग गरिरहनुभएको एपले सीमित रूपमा मात्र डेटा चलाउन पाउँछ। उदाहरणका लागि, तपाईंले फोटोमा ट्याप गर्नुभयो भने मात्र फोटो देखिन्छ नत्र देखिँदैन।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभर सक्रिय गर्ने हो?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"सक्रिय गर्नुहोस्"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2082,6 +2088,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"यस सूचनालाई कम महत्त्वपूर्ण ठानी यसका लागि साइलेन्ट मोड सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"यस सूचनालाई धेरै महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"यस सूचनालाई कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string>
@@ -2269,9 +2287,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"तपाईं अब स्क्रिनको जुनसुकै भाग जुम इन गर्न सक्नुहुन्छ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिङमा गई यो सुविधा अन गर्नुहोस्"</string>
<string name="dismiss_action" msgid="1728820550388704784">"हटाउनुहोस्"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको डिभाइसको माइक्रोफोन प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको डिभाइसको क्यामेरा प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"अन गर्नुहोस्"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"सेन्सरसम्बन्धी गोपनीयता"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"एप जनाउने आइकन"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"एपको ब्रान्डिङ फोटो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 95edb64..a8e0c0e 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"toegang tot je fysieke activiteit"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"foto\'s maken en video opnemen"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-apparaten in de buurt"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"bluetooth-apparaten in de buurt vinden en er verbinding mee maken"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Apparaten in de buurt"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"apparaten in de buurt vinden en er verbinding mee maken"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Gesprekslijsten"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"gesprekslijst lezen en schrijven"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefoon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Hiermee kan de app bluetooth-apparaten in de buurt vinden en koppelen"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"verbinding maken met gekoppelde bluetooth-apparaten"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Hiermee kan de app verbinding maken met gekoppelde bluetooth-apparaten"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"adverteren op bluetooth-apparaten in de buurt"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Hiermee kan de app adverteren op bluetooth-apparaten in de buurt"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"relatieve positie tussen ultrabreedbandapparaten in de buurt bepalen"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"De app toestaan om de relatieve positie tussen ultrabreedbandapparaten in de buurt te bepalen"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informatie over voorkeursservice voor NFC-betaling"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Hiermee kun je zorgen dat de app informatie krijgt over de voorkeursservice voor NFC-betaling, zoals geregistreerde hulpmiddelen en routebestemmingen."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication regelen"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Geüpdatet door je beheerder"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Verwijderd door je beheerder"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donkere thema aanzetten\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken\n\n"<annotation id="url">"Meer informatie"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema aanzetten.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing aanzetten?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aanzetten"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Deze melding is verlaagd naar Stil. Tik om feedback te geven."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Deze melding is hoger geclassificeerd. Tik om feedback te geven."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Deze melding is lager geclassificeerd. Tik om feedback te geven."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatiemelding voor routinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Je kunt nu een deel van je scherm vergroten"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aanzetten in Instellingen"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Sluiten"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> heeft toegang tot de microfoon van je apparaat nodig om door te gaan."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> heeft toegang tot de camera van je apparaat nodig om door te gaan."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aanzetten"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Blokkeren van apparaatmicrofoon opheffen"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Blokkeren van apparaatcamera opheffen"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Voor <b><xliff:g id="APP">%s</xliff:g></b> en alle andere apps en services"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Blokkeren opheffen"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorprivacy"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"App-icoon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Merkafbeelding voor app"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 487b8a5..2536fa0 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ଆପଣଙ୍କ ଶାରୀରିକ କାର୍ଯ୍ୟକଳାପ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"କ୍ୟାମେରା"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ଫଟୋ ନିଏ ଓ ଭିଡିଓ ରେକର୍ଡ କରେ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜି ସଂଯୋଗ କରନ୍ତୁ"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକ"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜି ସଂଯୋଗ କରନ୍ତୁ"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"କଲ୍ ଲଗ୍"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ଫୋନ୍ କଲ୍ ଲଗ୍ ପଢ଼ନ୍ତୁ ଓ ଲେଖନ୍ତୁ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ଫୋନ୍"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜି ପେୟାର୍ କରିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ପେୟାର୍ କରାଯାଇଥିବା ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ ସହ ସଂଯୋଗ କର"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ପେୟାର୍ କରାଯାଇଥିବା ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ ସହ ସଂଯୋଗ କରିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକରେ ବିଜ୍ଞାପନ ଦିଅନ୍ତୁ"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକରେ ବିଜ୍ଞାପନ ଦେବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"ଆଖପାଖର ଅଲଟ୍ରା-ୱାଇଡବ୍ୟାଣ୍ଡ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପେକ୍ଷିକ ଅବସ୍ଥିତିକୁ ନିର୍ଦ୍ଧାରଣ କର"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"ଆଖପାଖର ଅଲଟ୍ରା-ୱାଇଡବ୍ୟାଣ୍ଡ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପେକ୍ଷିକ ଅବସ୍ଥିତିକୁ ନିର୍ଦ୍ଧାରଣ କରିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ପସନ୍ଦର NFC ପେମେଣ୍ଟ ସେବା ସୂଚନା"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ପଞ୍ଜିକୃତ ଯନ୍ତ୍ର ଏବଂ ମାର୍ଗ ଲକ୍ଷସ୍ଥଳ ପରି ପସନ୍ଦର nfc ପେମେଣ୍ଟ ସେବା ସୂଚନା ପାଇବାକୁ ଆପ୍ ଅନୁମତି କରିଥାଏ।"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେଶନ୍ ଉପରେ ନିୟନ୍ତ୍ରଣ ରଖନ୍ତୁ"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ଆପଣଙ୍କ ଆଡମିନ୍ ଅପଡେଟ୍ କରିଛନ୍ତି"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ଆପଣଙ୍କ ଆଡମିନ୍ ଡିଲିଟ୍ କରିଛନ୍ତି"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ଠିକ୍ ଅଛି"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n•ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n•ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n• ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n• ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଇମେଜଗୁଡ଼ିକୁ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ସେଗୁଡ଼ିକ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍ ଚାଲୁ କରିବେ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ଚାଲୁ କରନ୍ତୁ"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ଏହି ବିଜ୍ଞପ୍ତିକୁ ନୀରବ ଭାବେ ଡିମୋଟ୍ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ଏହି ବିଜ୍ଞପ୍ତିର ରେଙ୍କ ଉପରକୁ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ଏହି ବିଜ୍ଞପ୍ତିର ରେଙ୍କ ତଳକୁ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ନିୟମିତ ମୋଡ୍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ଆପଣ ଏବେ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଅଂଶକୁ ମ୍ୟାଗ୍ନିଫାଏ କରିପାରିବେ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ସେଟିଂସରେ ଚାଲୁ କରନ୍ତୁ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ଖାରଜ କରନ୍ତୁ"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ଜାରି ରଖିବାକୁ, <b><xliff:g id="APP">%s</xliff:g></b> ଆପଣଙ୍କ ଡିଭାଇସର ମାଇକ୍ରୋଫୋନକୁ ଆକ୍ସେସ୍ ଆବଶ୍ୟକ କରେ।"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ଜାରି ରଖିବାକୁ, <b><xliff:g id="APP">%s</xliff:g></b> ଆପଣଙ୍କ ଡିଭାଇସର କ୍ୟାମେରାକୁ ଆକ୍ସେସ୍ ଆବଶ୍ୟକ କରେ।"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"ଡିଭାଇସର ମାଇକ୍ରୋଫୋନକୁ ଅନବ୍ଲକ୍ କରନ୍ତୁ"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"ଡିଭାଇସର କ୍ୟାମେରାକୁ ଅନବ୍ଲକ୍ କରନ୍ତୁ"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> ଏବଂ ସମସ୍ତ ଆପ୍ ଓ ସେବା ପାଇଁ"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"ଅନବ୍ଲକ୍ କରନ୍ତୁ"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ସେନ୍ସର୍ ଗୋପନୀୟତା"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ଆପ୍ଲିକେସନ୍ ଆଇକନ୍"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ଆପ୍ଲିକେସନ୍ ବ୍ରାଣ୍ଡିଂ ଛବି"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 39fb734..fc8a56b 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ਆਪਣੀ ਸਰੀਰਕ ਸਰਗਰਮੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ਕੈਮਰਾ"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ਤਸਵੀਰਾਂ ਲੈਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨੂੰ ਖੋਜੋ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ਕਾਲ ਲੌਗ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ਫ਼ੋਨ ਦੇ ਕਾਲ ਲੌਗ ਨੂੰ ਪੜ੍ਹੋ ਅਤੇ ਲਿਖੋ"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ਫ਼ੋਨ"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ਐਪ ਨੂੰ ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਜੋੜਾਬੱਧ ਕਰਨ ਦਿੰਦੀ ਹੈ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ਜੋੜਾਬੱਧ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ਐਪਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਦਿੰਦੀ ਹੈ"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ਠੀਕ ਹੈ"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n\n• ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n• ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ\n\n"<annotation id="url">"ਹੋਰ ਜਾਣੋ"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n\n• ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ\n• ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ਚਾਲੂ ਕਰੋ"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਘਟਾ ਕੇ ਸ਼ਾਂਤ \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਵਧਾ ਦਿੱਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਘਟਾ ਦਿੱਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ਹੁਣ ਤੁਸੀਂ ਆਪਣੀ ਸਕ੍ਰੀਨ ਦਾ ਕੁਝ ਹਿੱਸਾ ਵੱਡਦਰਸ਼ੀ ਕਰ ਸਕਦੇ ਹੋ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰੋ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ਖਾਰਜ ਕਰੋ"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ਜਾਰੀ ਰੱਖਣ ਲਈ, <b><xliff:g id="APP">%s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ।"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"ਜਾਰੀ ਰੱਖਣ ਲਈ, <b><xliff:g id="APP">%s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੈਮਰਾ ਤੱਕ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ।"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ਚਾਲੂ ਕਰੋ"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ਸੈਂਸਰ ਪਰਦੇਦਾਰੀ"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ਐਪਲੀਕੇਸ਼ਨ ਪ੍ਰਤੀਕ"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਬ੍ਰਾਂਡ ਵਾਲਾ ਚਿੱਤਰ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 3d1b19f..0d07cab 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"dostęp do aktywności fizycznej"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Aparat"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"robienie zdjęć i nagrywanie filmów"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Urządzenia Bluetooth w pobliżu"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"wykrywanie urządzeń Bluetooth w pobliżu i łączenie się z nimi"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Urządzenia w pobliżu"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"wykrywanie urządzeń w pobliżu i łączenie się z nimi"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Rejestry połączeń"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"odczytywanie i zapisywanie rejestru połączeń telefonicznych"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -544,10 +544,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Zezwala na wykrywanie i parowanie przez aplikację urządzeń Bluetooth w pobliżu"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"łączenie ze sparowanymi urządzeniami Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Zezwala na łączenie aplikacji ze sparowanymi urządzeniami Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"określanie względnego położenia urządzeń ultraszerokopasmowych w pobliżu"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Zezwól na określanie przez aplikację względnego położenia urządzeń ultraszerokopasmowych w pobliżu"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacje o preferowanych usługach płatniczych NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pozwala aplikacji uzyskiwać informacje o preferowanych usługach płatniczych NFC, np. zarejestrowanych pomocach i miejscach docelowych tras."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolowanie łączności Near Field Communication"</string>
@@ -1395,14 +1397,14 @@
<string name="perm_costs_money" msgid="749054595022779685">"to może generować dodatkowe koszty"</string>
<string name="dlg_ok" msgid="5103447663504839312">"OK"</string>
<string name="usb_charging_notification_title" msgid="1674124518282666955">"Ładowanie urządzenia przez USB"</string>
- <string name="usb_supplying_notification_title" msgid="5378546632408101811">"Ładowanie podłączonego urządzenia przez USB"</string>
+ <string name="usb_supplying_notification_title" msgid="5378546632408101811">"Ładowanie połączonego urządzenia przez USB"</string>
<string name="usb_mtp_notification_title" msgid="1065989144124499810">"Przesyłanie plików przez USB włączone"</string>
<string name="usb_ptp_notification_title" msgid="5043437571863443281">"Tryb PTP przez USB włączony"</string>
<string name="usb_tether_notification_title" msgid="8828527870612663771">"Tethering USB włączony"</string>
<string name="usb_midi_notification_title" msgid="7404506788950595557">"Tryb MIDI przez USB włączony"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"Podłączono akcesorium USB"</string>
<string name="usb_notification_message" msgid="4715163067192110676">"Kliknij, by wyświetlić więcej opcji."</string>
- <string name="usb_power_notification_message" msgid="7284765627437897702">"Ładowanie podłączonego urządzenia. Kliknij, by wyświetlić więcej opcji."</string>
+ <string name="usb_power_notification_message" msgid="7284765627437897702">"Ładowanie połączonego urządzenia. Kliknij, by wyświetlić więcej opcji."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Wykryto analogowe urządzenie audio"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Podłączone urządzenie nie jest zgodne z tym telefonem. Kliknij, by dowiedzieć się więcej."</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"Podłączono moduł debugowania USB"</string>
@@ -1898,8 +1900,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Zaktualizowany przez administratora"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Usunięty przez administratora"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Aby wydłużyć czas pracy na baterii, funkcja Oszczędzanie baterii:\n\n• włącza ciemny motyw,\n• wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”.\n\n"<annotation id="url">"Więcej informacji"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n\n• włącza ciemny motyw,\n• wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Włączyć Oszczędzanie danych?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Włącz"</string>
@@ -2138,6 +2142,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"To powiadomienie zostało zmienione na Ciche. Kliknij, by przesłać opinię."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Podniesiono ważność tego powiadomienia. Kliknij, by przesłać opinię."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Obniżono ważność tego powiadomienia. Kliknij, by przesłać opinię."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Powiadomienie z informacją o trybie rutynowym"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
@@ -2327,9 +2343,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Możesz teraz powiększyć część ekranu"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Włącz w Ustawieniach"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odrzuć"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Aby kontynuować, musisz przyznać aplikacji „<xliff:g id="APP">%s</xliff:g>” dostęp do mikrofonu urządzenia."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Aby kontynuować, musisz przyznać aplikacji „<xliff:g id="APP">%s</xliff:g>” dostęp do aparatu urządzenia."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Włącz"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Poufność danych z czujników"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikacji"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Wizerunek marki aplikacji"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index da2c0e4..69da283 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"acessar sua atividade física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tire fotos e grave vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth por perto"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"descobrir e se conectar a dispositivos Bluetooth por perto"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos por perto"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"descobrir e se conectar a dispositivos por perto"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registro de chamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ler e gravar o registro de chamadas telefônicas"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que o app descubra e se pareie a dispositivos Bluetooth por perto"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conecte-se a dispositivos Bluetooth pareados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que o app se conecte a dispositivos Bluetooth pareados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"anunciar em dispositivos Bluetooth por perto"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que o app seja anunciado em dispositivos Bluetooth por perto"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar o posicionamento relativo entre dispositivos de banda ultralarga por perto"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permitir que o app determine o posicionamento relativo entre dispositivos de banda ultralarga por perto"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações preferidas de serviço de pagamento por NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n• ativa o tema escuro;\n• desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n• ativa o tema escuro;\n• desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar \"Economia de dados\"?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Agora você pode ampliar parte da tela"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Configurações"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dispensar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar o microfone do dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar a câmera do dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Ativar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloquear o microfone do dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloquear a câmera do dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para <b><xliff:g id="APP">%s</xliff:g></b> e todos os apps e serviços"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidade do sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ícone do aplicativo"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imagem da marca do aplicativo"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1db4835..04e282f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"aceder à sua atividade física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Câmara"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tirar fotos e gravar vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth próximos"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"descubra e ligue-se a dispositivos Bluetooth próximos"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos próximos"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"descubra e estabeleça ligação a dispositivos próximos"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registos de chamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ler e escrever o registo de chamadas do telemóvel"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telemóvel"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que a app descubra e sincronize com dispositivos Bluetooth próximos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ligar-se a dispositivos Bluetooth sincronizados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que a app se ligue a dispositivos Bluetooth sincronizados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"mostrar anúncios a dispositivos Bluetooth próximos"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que a app apresente anúncios a dispositivos Bluetooth próximos"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar posição relativa dispos. de banda ultralarga próximos"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permita que a app determine a posição relativa entre os dispositivos de banda ultralarga próximos"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações de serviços de pagamento com NFC preferenciais"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a app obtenha informações de serviços de pagamento com NFC preferenciais, como apoios registados e destino da rota."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlo Near Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu gestor"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado pelo seu gestor"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n\n•Ativa o tema escuro.\n•Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n\n• Ativa o tema escuro.\n•·Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada app que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Pretende ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi despromovida para Silenciosa. Toque para fornecer feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação passou para uma classificação superior. Toque para fornecer feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação passou para uma classificação inferior. Toque para fornecer feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informações do Modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pode ficar sem bateria antes do carregamento habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Poupança de bateria ativada para prolongar a duração da bateria"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Já pode ampliar o ecrã parcialmente"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Definições"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignorar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, a app <b><xliff:g id="APP">%s</xliff:g></b> precisa de acesso ao microfone do dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, a app <b><xliff:g id="APP">%s</xliff:g></b> precisa de acesso à câmara do dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Ativar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloqueie o microfone do dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloqueie a câmara do dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para a app <b><xliff:g id="APP">%s</xliff:g></b> e todas as apps e serviços"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidade dos sensores"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ícone de aplicação."</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imagem de branding da aplicação."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index da2c0e4..69da283 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"acessar sua atividade física"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"tire fotos e grave vídeos"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispositivos Bluetooth por perto"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"descobrir e se conectar a dispositivos Bluetooth por perto"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivos por perto"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"descobrir e se conectar a dispositivos por perto"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registro de chamadas"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ler e gravar o registro de chamadas telefônicas"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefone"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que o app descubra e se pareie a dispositivos Bluetooth por perto"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conecte-se a dispositivos Bluetooth pareados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que o app se conecte a dispositivos Bluetooth pareados"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"anunciar em dispositivos Bluetooth por perto"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Permite que o app seja anunciado em dispositivos Bluetooth por perto"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"determinar o posicionamento relativo entre dispositivos de banda ultralarga por perto"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permitir que o app determine o posicionamento relativo entre dispositivos de banda ultralarga por perto"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações preferidas de serviço de pagamento por NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n• ativa o tema escuro;\n• desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n• ativa o tema escuro;\n• desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar \"Economia de dados\"?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Agora você pode ampliar parte da tela"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Configurações"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dispensar"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar o microfone do dispositivo."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar a câmera do dispositivo."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Ativar"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Desbloquear o microfone do dispositivo"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Desbloquear a câmera do dispositivo"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para <b><xliff:g id="APP">%s</xliff:g></b> e todos os apps e serviços"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Desbloquear"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacidade do sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ícone do aplicativo"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imagem da marca do aplicativo"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 5d581cd..8c145bf2 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"accesați activitatea fizică"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera foto"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotografieze și să înregistreze videoclipuri"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Dispozitive Bluetooth din apropiere"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"să descopere și să se conecteze la dispozitive Bluetooth din apropiere"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispozitive din apropiere"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"descoperiți dispozitive din apropiere și conectați-vă la acestea"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Jurnale de apeluri"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"să citească și să scrie jurnalul de apeluri telefonice"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -541,10 +541,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite aplicației să descopere și să asocieze dispozitive Bluetooth din apropiere"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"să se conecteze la dispozitive Bluetooth asociate"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite aplicației să se conecteze la dispozitive Bluetooth asociate"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Permiteți-i aplicației să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informații despre serviciul de plăți NFC preferat"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite aplicației să obțină informații despre serviciul de plăți NFC preferat, de exemplu, identificatorii de aplicație înregistrați și destinația traseului."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlare schimb de date prin Near Field Communication"</string>
@@ -1875,8 +1877,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizat de administratorul dvs."</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Șters de administratorul dvs."</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Pentru a mări autonomia bateriei, Economisirea bateriei:\n\n•·activează tema întunecată;\n•·dezactivează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții, cum ar fi „Ok Google”.\n\n"<annotation id="url">"Aflați mai multe"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Pentru a mări autonomia bateriei, Economisirea bateriei:\n\n• activează tema întunecată;\n• dezactivează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții, cum ar fi „Ok Google”."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Activați Economizorul de date?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activați"</string>
@@ -2105,6 +2109,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Notificarea a fost mutată în jos la Silențioasă. Atingeți pentru a oferi feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Notificarea a fost mutată la un nivel superior. Atingeți pentru a oferi feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Notificarea a fost mutată la un nivel inferior. Atingeți pentru a oferi feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificare pentru informații despre modul Rutină"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
@@ -2293,9 +2309,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Acum puteți mări o parte a ecranului"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activați din Setări"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Respingeți"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pentru a continua, <b><xliff:g id="APP">%s</xliff:g></b> necesită acces la microfonul dispozitivului."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Pentru a continua, <b><xliff:g id="APP">%s</xliff:g></b> necesită acces la camera dispozitivului."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Activați"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Confidențialitatea privind senzorii"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Pictograma aplicației"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imaginea de branding a aplicației"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 58d10ea..4612662 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"доступ к данным о физической активности"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"снимать фото и видео"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Устройства Bluetooth поблизости"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"находить устройства Bluetooth поблизости и подключаться к ним"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Устройства поблизости"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"находить устройства поблизости и подключаться к ним"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Список вызовов"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"чтение и запись телефонных звонков"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Приложение сможет находить устройства Bluetooth поблизости и подключаться к ним."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"доступ к подключенным устройствам Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"У приложения будет доступ к подключенным устройствам Bluetooth."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"Передача рекламы на устройства Bluetooth рядом"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Приложение сможет передавать рекламу на устройства Bluetooth поблизости."</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"Определять относительное позиционирование устройств с технологией сверхширокополосной связи поблизости"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Приложение сможет определять относительное позиционирование устройств с технологией сверхширокополосной связи поблизости"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Сведения о предпочтительном платежном сервисе NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Приложение сможет получать сведения о предпочтительном платежном сервисе NFC (например, зарегистрированные идентификаторы AID и конечный пункт маршрута)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Управление NFC-модулем"</string>
@@ -1898,8 +1898,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Обновлено администратором"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Удалено администратором"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\n\n• включается тёмная тема;\n• отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\").\n\n"<annotation id="url">"Подробнее…"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\n\n• включается тёмная тема;\n• отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\")."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"В режиме экономии трафика фоновая передача данных для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Включить экономию трафика?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Включить"</string>
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Уровень важности этого уведомления был понижен до \"Без звука\". Нажмите, чтобы отправить отзыв."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Уровень важности этого уведомления был повышен. Нажмите, чтобы отправить отзыв."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Уровень важности этого уведомления был понижен. Нажмите, чтобы отправить отзыв."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Уведомление о батарее"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея может разрядиться"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Теперь можно увеличивать часть экрана."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Включить в настройках"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Закрыть"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Чтобы продолжить, предоставьте приложению <b><xliff:g id="APP">%s</xliff:g></b> доступ к микрофону устройства."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Чтобы продолжить, предоставьте приложению <b><xliff:g id="APP">%s</xliff:g></b> доступ к камере устройства."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Включить"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Разблокируйте микрофон устройства"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Разблокируйте камеру устройства"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Для приложения <b><xliff:g id="APP">%s</xliff:g></b> и всех приложений и сервисов."</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Разблокировать"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Конфиденциальность датчиков"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Значок приложения"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Образ бренда приложения"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 541dbb8..5523d8f 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ඔබේ ශාරීරික ක්රියාකාරකමට ප්රවේශ වන්න"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"කැමරාව"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"පින්තූර ගැනීම සහ වීඩියෝ පටිගත කිරීම"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"අවට බ්ලූටූත් උපාංග"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"අවට ඇති බ්ලූටූත් උපාංග සොයා ගන්න සහ සම්බන්ධ වන්න"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"අවට උපාංග"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"අවට උපාංග සොයා ගැනීම සහ ඒවාට සම්බන්ධ වීම"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ඇමතුම් ලොග"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"දුරකථන ඇමතුම් ලොගය කියවන්න සහ ලියන්න"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"දුරකථනය"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"අවට ඇති බ්ලූටූත් උපාංග සොයා ගැනීමට සහ යුගල කිරීමට යෙදුමට ඉඩ දෙයි"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"යුගල කළ බ්ලූටූත් උපාංගවලට සම්බන්ධ වන්න"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"යුගල කළ බ්ලූටූත් උපාංග සමඟ සම්බන්ධ වීමට යෙදුමට ඉඩ දෙයි"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"අවට ඇති බ්ලූටූත් උපාංගවලට වෙළඳ ප්රචාරණය කරන්න"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"අවට ඇති බ්ලූටූත් උපාංගවලට වෙළඳ ප්රචාරණය කිරීමට යෙදුමට ඉඩ දෙයි"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"අවට අල්ට්රා-වයිඩ්බෑන්ඩ් උපාංග අතර සාපේක්ෂ පිහිටීම නිර්ණය"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"අවට ඇති අල්ට්රා-වයිඩ්බෑන්ඩ් උපාංග අතර සාපේක්ෂ පිහිටීම නිර්ණය කිරීමට යෙදුමට ඉඩ දීම"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"කැමති NFC ගෙවීම් සේවා තොරතුරු"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ලියාපදිංචි කළ ආධාර සහ ගමන් මාර්ග ගමනාන්ත වැනි කැමති nfc ගෙවීම් සේවා තොරතුරු ලබා ගැනීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ආසන්න ක්ෂේත්ර සන්නිවේදනය පාලනය කරන්න"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ඔබගේ පරිපාලක මඟින් මකා දමා ඇත"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"හරි"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"බැටරියේ ජීව කාලය දික් කිරීමට, බැටරි සුරැකුම:\n\n•අඳුරු තේමාව ක්රියාත්මක කරයි\n•පසුබිමේ ක්රියාකාරකම, සමහර දෘශ්ය ප්රයෝග සහ “Hey Google” වැනි වෙනත් විශේෂාංග ක්රියාවිරහිත කරයි නැතහොත් අවහිර කරයි\n\n"<annotation id="url">"තව දැන ගන්න"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"බැටරියේ ජීව කාලය දික් කිරීමට, බැටරි සුරැකුම:\n\n•අඳුරු තේමාව ක්රියාත්මක කරයි\n•පසුබිමේ ක්රියාකාරකම, සමහර දෘශ්ය ප්රයෝග සහ “Hey Google” වැනි වෙනත් විශේෂාංග ක්රියාවිරහිත කරයි නැතහොත් අවහිර කරයි"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"දත්ත සුරැකුම ක්රියාත්මක කරන්නද?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ක්රියාත්මක කරන්න"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"මෙම දැනුම්දීම නිහඬ වෙත පහත දමන ලදී. ප්රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"මෙම දැනුම්දීම ඉහළට ශ්රේණිගත කරන ලදී. ප්රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"මෙම දැනුම්දීම පහළට ශ්රේණිගත කරන ලදී. ප්රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"දිනචරියා ප්රකාර තතු දැනුම්දීම"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්රිය කෙරිණි"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"ඔබට දැන් ඔබගේ තිරයේ කොටසක් විශාලනය කළ හැකිය"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"සැකසීම් තුළ ක්රියාත්මක කරන්න"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ඉවත ලන්න"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"දිගටම කර ගෙන යාමට, <b><xliff:g id="APP">%s</xliff:g></b> හට ඔබගේ උපාංගයෙහි මයික්රෆෝනයට ප්රවේශය අවශ්යයි."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"දිගටම කර ගෙන යාමට, <b><xliff:g id="APP">%s</xliff:g></b> හට ඔබගේ උපාංගයෙහි කැමරාවට ප්රවේශය අවශ්යයි."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ක්රියාත්මක කරන්න"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"උපාංග මයික්රෆෝනය අවහිර කිරීම ඉවත් කරන්න"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"උපාංග කැමරාව අවහිර කිරීම ඉවත් කරන්න"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> සහ සියලු යෙදුම් සහ සේවා සඳහා"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"අවහිර කිරීම ඉවත් කරන්න"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"සංවේදක පෞද්ගලිකත්වය"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"යෙදුම් නිරූපකය"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"යෙදුම් සන්නම් කිරීමේ රූපය"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index dd3babc..b2ee98a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"prístup k vašej fyzickej aktivite"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotenie a natáčanie videí"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Zariadenia Bluetooth nablízku"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"objaviť a pripojiť sa k zariadeniam s rozhraním Bluetooth nablízku"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Zariadenia v okolí"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"objavovať a pripájať zariadenia v okolí"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Zoznam hovorov"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"čítať a zapisovať do zoznamu hovorov"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefón"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Umožňuje aplikácii objaviť zariadenia s rozhraním Bluetooth nablízku a spárovať sa s nimi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"pripojiť sa k spárovaným zariadeniam Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Umožňuje aplikácii pripojiť sa k spárovaným zariadeniam s rozhraním Bluetooth"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"zobrazovanie reklamy v zariad. Bluetooth v okolí"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Umožňuje aplikácii zobrazovať reklamu v zariadeniach s rozhraním Bluetooth v okolí"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"určovať relatívnu polohu medzi zariadeniami so ultraširokopásmovým pripojením v okolí"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Povoľte aplikácii určovať relatívnu polohu medzi zariadeniami s ultraširokopásmovým pripojením v okolí"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferované informácie platenej služby NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikácii získavať preferované informácie platenej služby NFC, napríklad o registrovanej pomoci a trasách k cieľu."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ovládať technológiu NFC"</string>
@@ -1898,9 +1898,11 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizoval správca"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Odstránil správca"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Šetrič batérie predlžuje výdrž batérie:\n\n• zapnutím tmavého motívu;\n• vypnutím alebo obmedzením aktivity na pozadí, niektorých vizuálnych efektov a ďalších funkcií, ako napríklad kľúčového výrazu „Hey Google“.\n\n"<annotation id="url">"Ďalšie informácie"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Šetrič batérie predlžuje výdrž batérie:\n\n• zapnutím tmavého motívu;\n• vypnutím alebo obmedzením aktivity na pozadí, niektorých vizuálnych efektov a ďalších funkcií, ako napríklad kľúčového výrazu „Hey Google“."</string>
- <string name="data_saver_description" msgid="4995164271550590517">"S cieľom znížiť spotrebu dát bráni šetrič dát niektorým aplikáciám odosielať alebo prijímať dáta na pozadí. Aplikácia, ktorú práve používate, môže využívať dáta, ale možno to bude robiť menej často. Znamená to napríklad, že sa nezobrazia obrázky, kým na ne neklepnete."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
+ <string name="data_saver_description" msgid="4995164271550590517">"S cieľom znížiť spotrebu dát bráni šetrič dát niektorým aplikáciám odosielať alebo prijímať dáta na pozadí. Aplikácia, ktorú práve používate, môže využívať dáta, ale možno to bude robiť menej často. Môže to napríklad znamenať, že sa obrázky zobrazia, až keď na ne klepnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnúť šetrič dát?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnúť"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Toto upozornenie bolo znížené na Tiché. Klepnutím nám poskytnite spätnú väzbu."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Toto upozornenie bolo preradené vyššie. Klepnutím nám poskytnite spätnú väzbu."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Toto upozornenie bolo preradené nižšie. Klepnutím nám poskytnite spätnú väzbu."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upozornenie s informáciami o rutinnom režime"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batéria sa môže vybiť pred obvyklým nabitím"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bol aktivovaný šetrič batérie na predĺženie výdrže batérie"</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Teraz môžete zväčšiť časť obrazovky"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Zapnúť v Nastaveniach"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Zavrieť"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ak chcete pokračovať, <b><xliff:g id="APP">%s</xliff:g></b> požaduje prístup k mikrofónu zariadenia."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Ak chcete pokračovať, <b><xliff:g id="APP">%s</xliff:g></b> požaduje prístup k fotoaparátu zariadenia."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Zapnúť"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Odblokujte mikrofón zariadenia"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Odblokujte fotoaparát zariadenia"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Pre aplikáciu <b><xliff:g id="APP">%s</xliff:g></b> a všetky aplikácie a služby"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Odblokovať"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Ochrana súkromia senzorov"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikácie"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imidž značky aplikácie"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index ab6d108..d62aee7 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"dostop do vaše telesne dejavnosti"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparat"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotografiranje in snemanje videoposnetkov"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Naprave Bluetooth v bližini"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"odkrivanje naprav Bluetooth v bližini in povezovanje z njimi"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Naprave v bližini"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"odkrivanje naprav v bližini in povezovanje z njimi"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Dnevniki klicev"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"branje in zapisovanje dnevnika klicev v telefonu"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -544,10 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aplikaciji omogoča odkrivanje naprav Bluetooth v bližini in seznanjanje z njimi."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezovanje s seznanjenimi napravami Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Aplikaciji omogoča povezovanje s seznanjenimi napravami Bluetooth."</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"oglaševanje v napravah Bluetooth v bližini"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Aplikaciji dovoljuje oglaševanje v napravah Bluetooth v bližini."</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"določanje relativne oddaljenosti med napravami UWB v bližini"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Aplikaciji dovoli, da določi relativno oddaljenost med napravami UWB v bližini."</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Podatki o prednostni storitvi za plačevanje prek povezave NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Aplikaciji omogoča pridobivanje podatkov o prednostni storitvi za plačevanje prek povezave NFC, kot so registrirani pripomočki in cilj preusmeritve."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"nadzor nad komunikacijo s tehnologijo bližnjega polja"</string>
@@ -1666,7 +1666,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Predvajanje zaslona v napravo"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"Iskanje naprav …"</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Nastavitve"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Prekinitev povezave"</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Prekini povezavo"</string>
<string name="media_route_status_scanning" msgid="8045156315309594482">"Pregledovanje ..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"Vzpostavljanje povezave ..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"Na voljo"</string>
@@ -1898,8 +1898,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Posodobil skrbnik"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisal skrbnik"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"V redu"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Funkcija varčevanja z energijo baterije podaljša čas delovanja baterije tako:\n\n• vklopi temno temo,\n• izklopi ali omeji dejavnost v ozadju, nekatere vizualne učinke in druge funkcije, kot je »Hey Google«.\n\n"<annotation id="url">"Več o tem"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Funkcija varčevanja z energijo baterije podaljša čas delovanja baterije tako:\n\n• vklopi temno temo;\n• izklopi ali omeji dejavnost v ozadju, nekatere vizualne učinke in druge funkcije, kot je »Hey Google«."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Zaradi zmanjševanja prenesene količine podatkov funkcija varčevanja s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko prenaša podatke, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vklop varčevanja s podatki?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Vklop"</string>
@@ -2138,6 +2140,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"To obvestilo je bilo uvrščeno nižje – med obvestila brez zvoka. Dotaknite se, če želite poslati povratne informacije."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"To obvestilo je bilo uvrščeno višje. Dotaknite se, če želite poslati povratne informacije."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"To obvestilo je bilo uvrščeno nižje. Dotaknite se, če želite poslati povratne informacije."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutinsko informativno obvestilo o načinu delovanja"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se bo morda izpraznila, preden jo običajno priključite na polnjenje"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo baterije za podaljšanje časa delovanja baterije"</string>
@@ -2327,9 +2341,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Zdaj lahko povečate samo del zaslona."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Vklopite v nastavitvah"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Opusti"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Za nadaljevanje potrebuje aplikacija <b><xliff:g id="APP">%s</xliff:g></b> dostop do mikrofona v napravi."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Za nadaljevanje potrebuje aplikacija <b><xliff:g id="APP">%s</xliff:g></b> dostop do fotoaparata v napravi."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Vklopi"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Odblokiranje mikrofona v napravi"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Odblokiranje fotoaparata v napravi"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za aplikacijo <b><xliff:g id="APP">%s</xliff:g></b> ter vse aplikacije in storitve"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Odblokiraj"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Zasebnost pri uporabi tipal"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikacije"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Podoba blagovne znamke aplikacije"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index c8727bb..5575f16 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"qasje në aktivitetin tënd fizik"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"bëj fotografi dhe regjistro video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Pajisjet me Bluetooth në afërsi"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"të zbulojë dhe të lidhet me pajisjet me Bluetooth në afërsi"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Evidencat e telefonatave"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"lexo dhe shkruaj evidencën e telefonatave"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefoni"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lejon që aplikacioni të zbulojë dhe të çiftohet me pajisjet me Bluetooth në afërsi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"të lidhet me pajisjet e çiftuara me Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lejon që aplikacioni të lidhet me pajisjet e çiftuara me Bluetooth"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -742,8 +748,8 @@
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Spastroji të dhënat e këtij përdoruesi në këtë tablet pa paralajmërim."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Spastroji të dhënat e këtij përdoruesi në këtë pajisje Android TV pa paralajmërim."</string>
<string name="policydesc_wipeData_secondaryUser" product="default" msgid="2788325512167208654">"Spastroji të dhënat e këtij përdoruesi në këtë telefon pa paralajmërim."</string>
- <string name="policylab_setGlobalProxy" msgid="215332221188670221">"Cakto përfaqësuesin global të pajisjes"</string>
- <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Cakto përfaqësuesin global të pajisjes që të përdoret kur të aktivizohet politika. Vetëm pronari i pajisjes mund ta caktojë përfaqësuesin global."</string>
+ <string name="policylab_setGlobalProxy" msgid="215332221188670221">"Cakto proxy-in global të pajisjes"</string>
+ <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Cakto proxy-in global të pajisjes që të përdoret kur të aktivizohet politika. Vetëm pronari i pajisjes mund ta caktojë proxy-in global."</string>
<string name="policylab_expirePassword" msgid="6015404400532459169">"Cakto skadimin e fjalëkalimit të kyçjes së ekranit"</string>
<string name="policydesc_expirePassword" msgid="9136524319325960675">"Ndrysho se sa shpesh duhet të ndërrohet fjalëkalimi, kodi PIN ose modeli i kyçjes së ekranit."</string>
<string name="policylab_encryptedStorage" msgid="9012936958126670110">"Cakto enkriptimin e hapësirës ruajtëse"</string>
@@ -1358,7 +1364,7 @@
<string name="usb_supplying_notification_title" msgid="5378546632408101811">"Pajisja e lidhur po karikohet nëpërmjet USB-së"</string>
<string name="usb_mtp_notification_title" msgid="1065989144124499810">"Transferimi i skedarëve nëpërmjet USB-së u aktivizua"</string>
<string name="usb_ptp_notification_title" msgid="5043437571863443281">"PTP nëpërmjet USB-së u aktivizua"</string>
- <string name="usb_tether_notification_title" msgid="8828527870612663771">"Ndarja e internetit nëpërmjet USB-së u aktivizua"</string>
+ <string name="usb_tether_notification_title" msgid="8828527870612663771">"Ndarja e internetit përmes USB-së u aktivizua"</string>
<string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI nëpërmjet USB-së u aktivizua"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"Aksesori i USB-së u lidh"</string>
<string name="usb_notification_message" msgid="4715163067192110676">"Trokit për më shumë opsione."</string>
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Përditësuar nga administratori"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Fshirë nga administratori"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Në rregull"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Për të rritur kohëzgjatjen e baterisë, \"Kursyesi i baterisë\":\n\n• Aktivizon \"Temën e errët\"\n• Çaktivizon ose kufizon aktivitetin në sfond, disa efekte vizuale dhe veçori të tjera si “Ok Google”\n\n"<annotation id="url">"Mëso më shumë"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Për të rritur kohëzgjatjen e baterisë, \"Kursyesi i baterisë\":\n\n• Aktivizon \"Temën e errët\"\n• Çaktivizon ose kufizon aktivitetin në sfond, disa efekte vizuale dhe veçori të tjera si “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivizo"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ky njoftim është ulur në nivel si në heshtje. Trokit për të dhënë komente."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ky njoftim është renditur më lart. Trokit për të dhënë komente."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ky njoftim është renditur më poshtë. Trokit për të dhënë komente."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"\"Kursyesi i baterisë\" u aktivizua për të rritur kohëzgjatjen e baterisë"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Tani mund të zmadhosh pjesë të ekranit tënd"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivizo te \"Cilësimet\""</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hiq"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Për të vazhduar, <b><xliff:g id="APP">%s</xliff:g></b> ka nevojë të qaset në mikrofonin e pajisjes sate."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Për të vazhduar, <b><xliff:g id="APP">%s</xliff:g></b> ka nevojë të qaset në kamerën e pajisjes sate."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktivizo"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatësia e sensorit"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona e aplikacionit"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imazhi i vendosjes së aplikacionit të markës"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 7a15ee0..d404f8c 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -322,8 +322,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"приступ физичким активностима"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"снима слике и видео"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth уређаји у близини"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"откривање и повезивање са Bluetooth уређајима у близини"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Уређаји у близини"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"откривање уређаја у близини и повезивање са њима"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Евиденције позива"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"читање и писање евиденције позива на телефону"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -541,10 +541,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозвољава апликацији да открива Bluetooth уређаје у близини и упарује се са њима"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"повезивање са упареним Bluetooth уређајима"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозвољава апликацији да се повезује са упареним Bluetooth уређајима"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"оглашавање на Bluetooth уређајима у близини"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Дозвољава апликацији да се оглашава на Bluetooth уређајима у близини"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"одређивање раздаљине између уређаја ултра-широког појаса у близини"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Дозвољава апликацији да одређује релативну раздаљину између уређаја ултра-широког појаса у близини"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информације о жељеној NFC услузи за плаћање"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозвољава апликацији да преузима информације о жељеној NFC услузи за плаћање, попут регистрованих идентификатора апликација и одредишта преусмеравања."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контрола комуникације у ужем пољу (Near Field Communication)"</string>
@@ -1875,8 +1875,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Ажурирао је администратор"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Избрисао је администратор"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Потврди"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Да би се продужило трајање батерије, Уштеда батерије:\n\n• укључује тамну тему\n• искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример „Ок Google“\n\n"<annotation id="url">"Сазнајте више"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Да би се продужило трајање батерије, Уштеда батерије:\n\n• укључује тамну тему\n• искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример, „Ок Google“"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Желите да укључите Уштеду података?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Укључи"</string>
@@ -2105,6 +2107,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ово обавештење је деградирано у Нечујно. Додирните да бисте навели повратне информације."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ово обавештење је рангирано више. Додирните да бисте навели повратне информације."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ово обавештење је рангирано ниже. Додирните да бисте навели повратне информације."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Обавештење о информацијама Рутинског режима"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
@@ -2293,9 +2307,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Сада можете да увећате део екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Укључите у Подешавањима"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Одбаци"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> захтева приступ микрофону уређаја ради настављања."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> захтева приступ камери уређаја ради настављања."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Укључи"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Одблокирајте микрофон уређаја"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Одблокирајте камеру уређаја"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"За <b><xliff:g id="APP">%s</xliff:g></b> и све апликације и услуге"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Одблокирај"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Приватност сензора"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Икона апликације"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Имиџ бренда апликације"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 0631772..4dc2ecf 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -305,7 +305,7 @@
<string name="managed_profile_label" msgid="7316778766973512382">"Byt till jobbprofilen"</string>
<string name="permgrouplab_contacts" msgid="4254143639307316920">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="9163927941244182567">"få tillgång till dina kontakter"</string>
- <string name="permgrouplab_location" msgid="1858277002233964394">"Plats"</string>
+ <string name="permgrouplab_location" msgid="1858277002233964394">"plats"</string>
<string name="permgroupdesc_location" msgid="1995955142118450685">"komma åt enhetens platsuppgifter"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"få tillgång till din kalender"</string>
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"åtkomst till data om fysisk aktivitet"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ta bilder och spela in video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Bluetooth-enheter i närheten"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"hitta och ansluta till Bluetooth-enheter i närheten"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Enheter i närheten"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"upptäcka och ansluta till enheter i närheten"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Samtalsloggar"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"läsa och skriva samtalslogg"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tillåter appen att hitta och parkoppla Bluetooth-enheter i närheten"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ansluta till parkopplade Bluetooth-enheter"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tillåter appen att ansluta till parkopplade Bluetooth-enheter"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"annonsera till Bluetooth-enheter i närheten"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Tillåter appen att annonsera till Bluetooth-enheter i närheten"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"fastställa relativ position för Ultra Wideband-enheter i närheten"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Tillåt att appen fastställer den relativa positionen mellan Ultra Wideband-enheter i närheten"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Information kopplad till standardtjänsten för NFC-betalning"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillåter att appen hämtar information kopplad till standardtjänsten för NFC-betalning, till exempel registrerade hjälpmedel och ruttdestinationer."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrollera närfältskommunikationen"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Administratören uppdaterade paketet"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratören raderade paketet"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batterisparläget förlänger batteritiden genom att\n\n• aktivera mörkt tema\n• inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”\n\n"<annotation id="url">"Läs mer"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batterisparläget förlänger batteritiden genom att\n\n• aktivera Mörkt tema\n• inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vill du aktivera Databesparing?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivera"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Den här aviseringen har ändrats till Tyst. Tryck för att lämna feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Den här aviseringen har fått högre rankning. Tryck för att lämna feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Den här aviseringen har fått lägre rankning. Tryck för att lämna feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Avisering om rutinläge"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan ta slut innan du brukar ladda det"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nu kan du förstora delar av skärmen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivera i inställningarna"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Stäng"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> behöver behörighet till enhetens mikrofon för att fortsätta."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> behöver behörighet till enhetens kamera för att fortsätta."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aktivera"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Återaktivera enhetens mikrofon"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Återaktivera enhetens kamera"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"För <b><xliff:g id="APP">%s</xliff:g></b> och alla appar och tjänster"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Återaktivera"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorintegritet"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Appikon"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Appens varumärkesbild"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 67f64c2..0156787 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ifikie shughuli zako za kimwili"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ipige picha na kurekodi video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Vifaa vyenye Bluetooth Vilivyo Karibu"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"kutambua na kuunganisha kwenye vifaa vyenye Bluetooth vilivyo karibu"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Vifaa vilivyo karibu"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"kutambua na kuunganisha kwenye vifaa vilivyo karibu"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Rekodi ya nambari za simu"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"kusoma na kuandika rekodi ya nambari za simu"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Simu"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Huruhusu programu itambue na kuoanisha kwenye vifaa vyenye Bluetooth vilivyo karibu"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kuunganisha kwenye vifaa vyenye Bluetooth vilivyooanishwa"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Huruhusu programu iunganishe kwenye vifaa vyenye Bluetooth vilivyooanishwa"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"kutangaza kwenye vifaa vyenye Bluetooth vilivyo karibu"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Huruhusu programu itangaze kwenye vifaa vyenye Bluetooth vilivyo karibu"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"kubainisha nafasi kati ya vifaa vyenye Bendi Pana Zaidi vilivyo karibu"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Ruhusu programu ibainishe nafasi kati ya vifaa vyenye Bendi Pana Zaidi vilivyo karibu"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Maelezo ya Huduma Inayopendelewa ya Malipo ya NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Huruhusu programu kupata maelezo ya huduma inayopendelewa ya malipo ya nfc kama vile huduma zilizosajiliwa na njia."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kudhibiti Mawasiliano ya Vifaa Vilivyokaribu (NFC)"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Imesasishwa na msimamizi wako"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Imefutwa na msimamizi wako"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Sawa"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n\n• Huwasha Mandhari meusi\n• Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\"\n\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n\n• Huwasha Mandhari meusi\n• Huzima au kudhibiti shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chinichini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ungependa Kuwasha Kiokoa Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Washa"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Arifa hii ilishushwa hadhi kuwa Kimya. Gusa ili utoe maoni."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Arifa hii imeorodheshwa katika nafasi ya juu. Gusa ili utoe maoni."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Arifa hii imeorodheshwa katika nafasi ya chini. Gusa ili utoe maoni."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Arifa ya maelezo ya Hali ya Kawaida"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Huenda betri itakwisha chaji mapema"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sasa unaweza kukuza sehemu ya skrini yako"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Washa katika Mipangilio"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ondoa"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ili uendelee, <b><xliff:g id="APP">%s</xliff:g></b> inahitaji ruhusa ya kufikia maikrofoni ya kifaa chako."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Ili uendelee, <b><xliff:g id="APP">%s</xliff:g></b> inahitaji ruhusa ya kufikia kamera ya kifaa chako."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Washa"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Ondoa kizuizi kwenye maikrofoni ya kifaa"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Ondoa kizuizi kwenye kamera ya kifaa"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Kwa ajili ya <b><xliff:g id="APP">%s</xliff:g></b> na programu na huduma zote"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Ondoa kizuizi"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Faragha ya Kitambuzi"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Aikoni ya programu"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Picha ya kuweka chapa kwenye programu"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 6e86c20..e625c8bb 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"உடல் செயல்பாட்டைக் கண்காணிக்கும்"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"கேமரா"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"படங்கள் மற்றும் வீடியோக்கள் எடுக்கலாம்"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"அருகிலுள்ள புளூடூத் சாதனங்கள்"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"அருகிலுள்ள புளூடூத் சாதனங்களைக் கண்டறிந்து அவற்றுடன் இணையும்"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"அருகிலுள்ள சாதனங்கள்"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"அருகிலுள்ள சாதனங்களைக் கண்டறிந்து அவற்றுடன் இணையும்"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"அழைப்புப் பதிவுகள்"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"மொபைல் அழைப்புப் பதிவைப் படிக்கும், எழுதும்"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ஃபோன்"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"அருகிலுள்ள புளூடூத் சாதனங்களைக் கண்டறிந்து அவற்றுடன் இணைவதற்கு ஆப்ஸை அனுமதிக்கும்"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"இணைக்கப்பட்ட புளூடூத் சாதனங்களுடன் இணைத்தல்"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"இணைக்கப்பட்ட புளூடூத் சாதனங்களுடன் இணைவதற்கு ஆப்ஸை அனுமதிக்கும்"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"அருகிலுள்ள புளூடூத் சாதனங்களுக்கு தெரியப்படுத்தல்"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"அருகிலுள்ள புளூடூத் சாதனங்களுக்குத் தெரியப்படுத்த ஆப்ஸை அனுமதிக்கும்"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"அருகிலுள்ள அல்ட்ரா-வைடுபேண்ட் சாதனங்களுக்கிடையிலான தூரத்தைத் தீர்மானித்தல்"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"அருகிலுள்ள அல்ட்ரா-வைடுபேண்ட் சாதனங்களுக்கிடையிலான தூரத்தைத் தீர்மானிக்க ஆப்ஸை அனுமதிக்கும்"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"விருப்பமான NFC பேமெண்ட் சேவை தொடர்பான தகவல்கள்"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"பதிவுசெய்யப்பட்ட கருவிகள், சேருமிடத்திற்கான வழி போன்ற விருப்பமான NFC பேமெண்ட் சேவை தொடர்பான தகவல்களைப் பெற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"குறுகிய இடைவெளி தகவல்பரிமாற்றத்தைக் கட்டுப்படுத்துதல்"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"சரி"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"பேட்டரி நிலையை நீட்டிப்பதற்காக, பேட்டரி சேமிப்பான்:\n\n• டார்க் தீமினை ஆன் செய்யும்\n• பின்னணி செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Ok Google” போன்ற பிற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்\n\n"<annotation id="url">"மேலும் அறிக"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"பேட்டரி நிலையை நீட்டிப்பதற்காக, பேட்டரி சேமிப்பான்:\n\n• டார்க் தீமினை ஆன் செய்யும்\n• பின்னணிச் செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Ok Google” போன்ற பிற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"டேட்டா உபயோகத்தைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில ஆப்ஸை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் ஆப்ஸானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"டேட்டா சேமிப்பானை இயக்கவா?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"இயக்கு"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"இந்த அறிவிப்பின் முக்கியத்துவம் நிசப்த நிலைக்குக் குறைத்து அமைக்கப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"இந்த அறிவிப்பின் முக்கியத்துவம் உயர்த்தப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"இந்த அறிவிப்பின் முக்கியத்துவம் குறைக்கப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"இப்போது உங்கள் திரையின் ஒரு பகுதியைப் பெரிதாக்கலாம்"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"அமைப்புகளில் ஆன் செய்க"</string>
<string name="dismiss_action" msgid="1728820550388704784">"மூடுக"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"தொடர, உங்கள் சாதனத்தின் மைக்ரோஃபோனை அணுகுவதற்கு <b><xliff:g id="APP">%s</xliff:g></b> ஆப்ஸுக்கு அனுமதி வேண்டும்."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"தொடர, உங்கள் சாதனத்தின் கேமராவை அணுகுவதற்கு <b><xliff:g id="APP">%s</xliff:g></b> ஆப்ஸுக்கு அனுமதி வேண்டும்."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ஆன் செய்"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"சாதனத்தின் மைக்ரோஃபோனுக்கான தடுப்பை நீக்குதல்"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"சாதனத்தின் கேமராவுக்கான தடுப்பை நீக்குதல்"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> ஆப்ஸுக்கும் அனைத்து ஆப்ஸ் மற்றும் சேவைகளுக்கும்"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"தடுப்பை நீக்கு"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"சென்சார் தனியுரிமை"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ஆப்ஸ் ஐகான்"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ஆப்ஸ் பிராண்டிங் இமேஜ்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index ea356af..faed275 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"భౌతిక కార్యకలాపాన్ని యాక్సెస్ చేయండి"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"కెమెరా"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"చిత్రాలను తీయడానికి మరియు వీడియోను రికార్డ్ చేయడానికి"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"సమీపంలోని బ్లూటూత్ పరికరాలు"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొని, కనెక్ట్ చేయండి"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"కాల్ లాగ్లు"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ఫోన్ కాల్ లాగ్ని చదవండి మరియు రాయండి"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ఫోన్"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొనడానికి, పెయిర్ చేయడానికి యాప్ను అనుమతిస్తుంది"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"పెయిర్ చేసిన బ్లూటూత్ పరికరాలకు కనెక్ట్ అవ్వండి"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"పెయిర్ చేసిన బ్లూటూత్ పరికరాలకు కనెక్ట్ అవ్వడానికి యాప్ను అనుమతిస్తుంది"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"మీ నిర్వాహకులు నవీకరించారు"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"మీ నిర్వాహకులు తొలగించారు"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"సరే"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n\n• ముదురు రంగు రూపాన్ని ఆన్ చేస్తుంది\n•బ్యాక్గ్రౌండ్ యాక్టివిటీని, కొన్ని విజువల్ ఎఫెక్ట్లను, అలాగే “Ok Google” వంటి ఇతర ఫీచర్లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది\n\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n\n•ముదురు రంగు రూపాన్ని ఆన్ చేస్తుంది\n•బ్యాక్గ్రౌండ్ యాక్టివిటీని, కొన్ని విజువల్ ఎఫెక్ట్లను, అలాగే “Ok Google” వంటి ఇతర ఫీచర్లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్గ్రౌండ్లో కొన్ని యాప్లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్, డేటాను యాక్సెస్ చేయగలదు. కానీ తక్కువ సార్లు మాత్రమే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఫోటోలు ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"డేటా సేవర్ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ఆన్ చేయి"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ఈ నోటిఫికేషన్ స్థాయి నిశ్శబ్దంగా ఉండేలా తగ్గించబడింది. ఫీడ్బ్యాక్ను అందించడానికి ట్యాప్ చేయండి."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ఈ నోటిఫికేషన్కు ఎక్కువ ర్యాంక్ ఇవ్వబడింది. ఫీడ్బ్యాక్ను అందించడానికి ట్యాప్ చేయండి."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ఈ నోటిఫికేషన్కు తక్కువ ర్యాంక్ ఇవ్వబడింది. ఫీడ్బ్యాక్ను అందించడానికి ట్యాప్ చేయండి."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"మీరు ఇప్పుడు మీ స్క్రీన్ కొంత భాగాన్ని మాగ్నిఫై చేయవచ్చు"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"సెట్టింగ్లలో ఆన్ చేయండి"</string>
<string name="dismiss_action" msgid="1728820550388704784">"విస్మరించు"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"కొనసాగించడానికి, <b><xliff:g id="APP">%s</xliff:g></b>కు మీ పరికరం యొక్క మైక్రోఫోన్ యాక్సెస్ అవసరం."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"కొనసాగించడానికి, <b><xliff:g id="APP">%s</xliff:g></b&gtకు మీ పరికరం యొక్క కెమెరా యాక్సెస్ అవసరం."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"ఆన్ చేయి"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"సెన్సార్ గోప్యత"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"యాప్ చిహ్నం"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"యాప్ బ్రాండింగ్ ఇమేజ్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 59ea8fd..1c00654 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"เข้าถึงกิจกรรมการเคลื่อนไหวร่างกายของคุณ"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"กล้องถ่ายรูป"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ถ่ายภาพและบันทึกวิดีโอ"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"อุปกรณ์บลูทูธที่อยู่ใกล้เคียง"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"ค้นหาและเชื่อมต่อกับอุปกรณ์บลูทูธที่อยู่ใกล้เคียง"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"อุปกรณ์ที่อยู่ใกล้เคียง"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ค้นหาและเชื่อมต่อกับอุปกรณ์ที่อยู่ใกล้เคียง"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ประวัติการโทร"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"อ่านและเขียนบันทึกการโทรของโทรศัพท์"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"โทรศัพท์"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"อนุญาตให้แอปค้นหาและจับคู่อุปกรณ์บลูทูธที่อยู่ใกล้เคียง"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"เชื่อมต่อกับอุปกรณ์บลูทูธที่จับคู่"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"อนุญาตให้แอปเชื่อมต่อกับอุปกรณ์บลูทูธที่จับคู่"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"ประกาศไปยังอุปกรณ์บลูทูธใกล้เคียง"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"อนุญาตให้แอปประกาศไปยังอุปกรณ์บลูทูธใกล้เคียง"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"ระบุตำแหน่งสัมพันธ์ระหว่างอุปกรณ์ที่ใช้แถบความถี่กว้างยิ่งยวดซึ่งอยู่ใกล้เคียง"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"อนุญาตให้แอประบุตำแหน่งสัมพันธ์ระหว่างอุปกรณ์ที่ใช้แถบความถี่กว้างยิ่งยวดซึ่งอยู่ใกล้เคียง"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ข้อมูลบริการชำระเงิน NFC ที่ต้องการ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"อนุญาตให้แอปรับข้อมูลบริการชำระเงิน NFC ที่ต้องการ เช่น รหัสแอป (AID) ที่ลงทะเบียนและปลายทางของเส้นทาง"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ควบคุม Near Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"อัปเดตโดยผู้ดูแลระบบ"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"ลบโดยผู้ดูแลระบบ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ตกลง"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"โหมดประหยัดแบตเตอรี่จะดำเนินการดังต่อไปนี้เพื่อยืดอายุการใช้งานแบตเตอรี่\n\n• เปิดธีมมืด\n• ปิดหรือจำกัดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อื่นๆ อย่างเช่น “Ok Google”\n\n"<annotation id="url">"ดูข้อมูลเพิ่มเติม"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"โหมดประหยัดแบตเตอรี่จะดำเนินการดังต่อไปนี้เพื่อยืดอายุการใช้งานแบตเตอรี่\n\n• เปิดธีมมืด\n• ปิดหรือจำกัดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อื่นๆ อย่างเช่น \"Ok Google\""</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลโดยการใช้อินเทอร์เน็ตอยู่เบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงอินเทอร์เน็ตได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"เปิด"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"การแจ้งเตือนนี้มีการลดระดับเป็นแบบปิดเสียง แตะเพื่อแสดงความคิดเห็น"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"การแจ้งเตือนนี้มีการเพิ่มระดับ แตะเพื่อแสดงความคิดเห็น"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"การแจ้งเตือนนี้มีการลดระดับ แตะเพื่อแสดงความคิดเห็น"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"คุณขยายบางส่วนของหน้าจอได้แล้วตอนนี้"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"เปิดในการตั้งค่า"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ปิด"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> ต้องได้รับสิทธิ์เข้าถึงไมโครโฟนของอุปกรณ์เพื่อดำเนินการต่อ"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"<b><xliff:g id="APP">%s</xliff:g></b> ต้องได้รับสิทธิ์เข้าถึงกล้องของอุปกรณ์เพื่อดำเนินการต่อ"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"เปิด"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"เลิกบล็อกไมโครโฟนของอุปกรณ์"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"เลิกบล็อกกล้องของอุปกรณ์"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"สำหรับ <b><xliff:g id="APP">%s</xliff:g></b> รวมถึงแอปและบริการทั้งหมด"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"เลิกบล็อก"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"ความเป็นส่วนตัวสำหรับเซ็นเซอร์"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ไอคอนแอปพลิเคชัน"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ภาพลักษณ์ของแบรนด์แอปพลิเคชัน"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 535e9ac..c05fe90 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"i-access ang iyong pisikal na aktibidad"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"kumuha ng mga larawan at mag-record ng video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Mga Malapit na Bluetooth Device"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"tumuklas at kumonekta sa mga malapit na Bluetooth device"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Mga kalapit na device"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"tumuklas ng mga kalapit na device at kumonekta sa mga ito"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Mga log ng tawag"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"binabasa at sinusulat ang log ng tawag sa telepono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telepono"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Nagbibigay-daan sa app na tumuklas at makipagpares sa mga malapit na Bluetooth device"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kumonekta sa mga nakapares na Bluetooth device"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Nagbibigay-daan sa app na kumonekta sa mga nakapares na Bluetooth device"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"mag-advertise sa mga kalapit na Bluetooth device"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Nagbibigay-daan sa app na mag-advertise sa mga kalapit na Bluetooth device"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"tukuyin ang relatibong posisyon sa pagitan ng mga kalapit na Ultra-Wideband device"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Payagan ang app na tukuyin ang relatibong posisyon sa pagitan ng mga kalapit na Ultra-Wideband device"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Impormasyon sa Gustong NFC na Serbisyo sa Pagbabayad"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pinapayagan ang app na makakuha ng impormasyon sa gustong nfc na serbisyo sa pagbabayad tulad ng mga nakarehistrong application ID at destinasyon ng ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolin ang Near Field Communication"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Na-update ng iyong admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Na-delete ng iyong admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Para patagalin ang baterya, ginagawa ng Pantipid ng Baterya na:\n\n• I-on ang Madilim na tema\n• I-off o paghihigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”\n\n"<annotation id="url">"Matuto pa"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Para patagalin ang baterya, ginagawa ng Pantipid ng Baterya na:\n\n• I-on ang Madilim na tema\n• I-off o paghihigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"I-on ang Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"I-on"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Na-demote sa Naka-silent ang notification na ito. I-tap para magbigay ng feedback."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Itinaas ang ranggo ng notification na ito. I-tap para magbigay ng feedback."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ibinaba ang ranggo ng notification na ito. I-tap para magbigay ng feedback."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification ng impormasyon ng Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Na-activate ang Pantipid ng Baterya para patagalin ang buhay ng baterya"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Puwede mo na ngayong i-magnify ang isang bahagi ng iyong screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"I-on sa Mga Setting"</string>
<string name="dismiss_action" msgid="1728820550388704784">"I-dismiss"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para magpatuloy, kailangan ng <b><xliff:g id="APP">%s</xliff:g></b> ng access sa mikropono ng iyong device."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Para magpatuloy, kailangan ng <b><xliff:g id="APP">%s</xliff:g></b> ng access sa camera ng iyong device."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"I-on"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"I-unblock ang mikropono ng device"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"I-unblock ang camera ng device"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Para sa <b><xliff:g id="APP">%s</xliff:g></b> at lahat ng app at serbisyo"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"I-unblock"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privacy ng Sensor"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icon ng application"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Representasyon ng brand ng application"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index df4cc5e..87ca8e0 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -209,7 +209,7 @@
<string name="factory_reset_message" msgid="2657049595153992213">"Yönetim uygulaması kullanılamıyor. Cihazınız şimdi silinecek.\n\nSorularınız varsa kuruluşunuzun yöneticisine başvurun."</string>
<string name="printing_disabled_by" msgid="3517499806528864633">"Yazdırma işlemi <xliff:g id="OWNER_APP">%s</xliff:g> tarafından devre dışı bırakıldı."</string>
<string name="personal_apps_suspension_title" msgid="7561416677884286600">"İş profilinizi açın"</string>
- <string name="personal_apps_suspension_text" msgid="6115455688932935597">"İş profilinizi açana kadar kişisel uygulamalarınız engellendi"</string>
+ <string name="personal_apps_suspension_text" msgid="6115455688932935597">"İş profilinizi açana kadar kişisel uygulamalarınız engelleniyor"</string>
<string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Kişisel uygulamalar <xliff:g id="DATE">%1$s</xliff:g> tarihinde saat <xliff:g id="TIME">%2$s</xliff:g> itibarıyla engellenecektir. BT yöneticiniz, iş profilinizin <xliff:g id="NUMBER">%3$d</xliff:g> günden fazla kapalı kalmasına izin vermiyor."</string>
<string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aç"</string>
<string name="me" msgid="6207584824693813140">"Ben"</string>
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"fiziksel aktivitenize erişin"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"fotoğraf çekme ve video kaydetme"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Yakındaki Bluetooth Cihazlar"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"yakındaki Bluetooth cihazları keşfedip bağlan"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Yakındaki cihazlar"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"yakındaki cihazları keşfetme ve bağlanma"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Arama kayıtları"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"telefon arama kaydını okuma ve yazma"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Uygulamaya, yakındaki Bluetooth cihazları keşfedip eşleme izni verir"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"eşlenen Bluetooth cihazlara bağlan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Uygulamaya, eşlenen Bluetooth cihazlara bağlanma izni verir"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"yakındaki Bluetooth cihazlara reklam yayınla"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Uygulamaya, yakındaki Bluetooth cihazlara reklam yayınlama izni verir"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"yakındaki Ultra Geniş Bant cihazların birbirine göre konumunu bul"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Uygulamanın, yakındaki Ultra Geniş Bant cihazların birbirine göre konumunu belirlemesine izin verin"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Tercih Edilen NFC Ödeme Hizmeti Bilgileri"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Uygulamaya, kayıtlı yardımlar ve rota hedefi gibi tercih edilen NFC ödeme hizmeti bilgilerini alma izni verir."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Yakın Alan İletişimini denetle"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Yöneticiniz tarafından güncellendi"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Yöneticiniz tarafından silindi"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"Tamam"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Pil ömrünü uzatmak için Pil Tasarrufu:\n\n• Koyu temayı açar\n• Arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi diğer özellikleri kapatır veya kısıtlar\n\n"<annotation id="url">"Daha fazla bilgi"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Pil ömrünü uzatmak için Pil Tasarrufu:\n\n• Koyu temayı açar\n• Arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi diğer özellikleri kapatır veya kısıtlar"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Şu anda kullandığınız bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Veri Tasarrufu açılsın mı?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aç"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildirimin önem derecesi, \"Sessiz\" seviyesine düşürüldü. Geri bildirimde bulunmak için dokunun."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildirimin önem derecesi yükseltildi. Geri bildirimde bulunmak için dokunun."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildirimin önem derecesi düşürüldü. Geri bildirimde bulunmak için dokunun."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutin Modu bilgi bildirimi"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pil normal şarjdan önce bitebilir"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Artık ekranınızın bir bölümünü büyütebilirsiniz"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ayarlar\'da aç"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Kapat"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Devam etmek için <b><xliff:g id="APP">%s</xliff:g></b> uygulamasının cihazınızın mikrofonuna erişmesi gerekiyor."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Devam etmek için <b><xliff:g id="APP">%s</xliff:g></b> uygulamasının cihazınızın kamerasına erişmesi gerekiyor."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Aç"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Cihaz mikrofonunun engellemesini kaldır"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Cihaz kamerasının engellemesini kaldır"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> ve tüm uygulamalar ile hizmetler için"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Engellemeyi kaldır"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensör Gizliliği"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Uygulama simgesi"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Uygulama marka imajı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index ccf84d5..7a74489 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -325,8 +325,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"переглядати дані про фізичну активність"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"фотографувати та записувати відео"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Пристрої з Bluetooth поблизу"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"знаходити поблизу пристрої з Bluetooth і підключатися до них"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Пристрої поблизу"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"пошук пристроїв поблизу й підключення до них"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Журнали викликів"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"перегляд і запис журналу викликів телефона"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Телефон"</string>
@@ -544,10 +544,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозволяє додатку знаходити поблизу пристрої Bluetooth і створювати з ними пару"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"підключатися до пристроїв із Bluetooth, з якими є пара"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозволяє додатку підключатися до пристроїв із Bluetooth, з якими створено пару"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"визначення відстані між пристроями поблизу з надширокосмуговим зв’язком"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"З цим дозволом додаток може визначати відстань між розташованими поблизу пристроями з надширокосмуговим зв’язком"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Використання інформації з платіжного NFC-сервісу"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволяє додатку отримувати доступ до інформації потрібного платіжного NFC-сервісу (наприклад, пов\'язаних ідентифікаторів чи даних про маршрутизацію трансакцій)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контрол. Near Field Communication"</string>
@@ -1898,8 +1900,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Оновлено адміністратором"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Видалено адміністратором"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n\n• вмикає темну тему;\n• припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти та інші енергозатратні функції, зокрема команду \"Ok Google\".\n\n"<annotation id="url">"Докладніше"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n\n• вмикає темну тему;\n• припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти та інші енергозатратні функції, зокрема команду \"Ok Google\"."</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Увімкнути заощадження трафіку?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Увімкнути"</string>
@@ -2138,6 +2142,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Важливість цього сповіщення знижено до рівня \"Без звуку\". Натисніть, щоб надіслати відгук."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Важливість цього сповіщення підвищено. Натисніть, щоб надіслати відгук."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Важливість цього сповіщення знижено. Натисніть, щоб надіслати відгук."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Сповіщення про послідовнсть дій"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режим енергозбереження активовано для збільшення часу роботи акумулятора"</string>
@@ -2327,9 +2343,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Тепер можна збільшувати частину екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Увімкнути в налаштуваннях"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Закрити"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Щоб продовжити, надайте додатку <b><xliff:g id="APP">%s</xliff:g></b> доступ до мікрофона пристрою."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Щоб продовжити, надайте додатку <b><xliff:g id="APP">%s</xliff:g></b> доступ до камери пристрою."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Увімкнути"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Конфіденційність датчиків"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Значок додатка"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Зображення фірмової символіки додатка"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index cf3d455..854741b 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"اپنی جسمانی سرگرمی تک رسائی حاصل کریں"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"کیمرا"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"تصاویر لیں اور ویڈیو ریکارڈ کریں"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"قریبی بلوٹوتھ آلات"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"قریبی بلوٹوتھ آلات دریافت کریں اور ان سے منسلک کریں"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"کال لاگز"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"فون کال لاگ پڑھ کر لکھیں"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"فون"</string>
@@ -538,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ایپ کو قریبی بلوٹوتھ آلات دریافت کرنے اور ان کا جوڑا بنانے کی اجازت دیں"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"جوڑا بنائے ہوئے بلوٹوتھ آلات سے منسلک کریں"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ایپ کو جوڑا بنائے ہوئے بلوٹوتھ آلات سے منسلک کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
+ <skip />
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1858,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"آپ کے منتظم کے ذریعے اپ ڈیٹ کیا گیا"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"آپ کے منتظم کے ذریعے حذف کیا گیا"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"ٹھیک ہے"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور:\n\n• گہری تھیم کو آن کرتی ہے\n• پس منظر کی سرگرمی، کچھ بصری اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے\n\n"<annotation id="url">"مزید جانیں"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور: \n\n• گہری تھیم کو آن کرتی ہے\n• پس منظر کی سرگرمی، کچھ ویژوئل اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتی ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا تک رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا اکثر نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ڈیٹا سیور آن کریں؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"آن کریں"</string>
@@ -2072,6 +2080,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"اس اطلاع کو خاموش پر ڈیموٹ کیا گيا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"اس اطلاع کو اعلی درجہ دیا گیا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"اس اطلاع کو کم درجہ دیا گیا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"روٹین موڈ معلومات کی اطلاع"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
@@ -2259,9 +2279,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"اب آپ اپنی اسکرین کے حصے کو بڑا کر سکتے ہیں"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ترتیبات میں آن کریں"</string>
<string name="dismiss_action" msgid="1728820550388704784">"برخاست کریں"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"جاری رکھنے کیلئے <xliff:g id="APP">%s</xliff:g><b><b> کو آپ کے آلے کے مائیکروفون تک رسائی درکار ہے۔"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"جاری رکھنے کیلئے <b><xliff:g id="APP">%s</xliff:g></b> کو آپ کے آلے کے کیمرے تک رسائی درکار ہے۔"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"آن کریں"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"سینسر کی رازداری"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"ایپلیکیشن کا آئیکن"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ایپلیکیشن کی برانڈنگ تصویر"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index ca2ee41..a40e083 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -319,8 +319,10 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"jismoniy harakatlar axborotiga ruxsat"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"suratga olish va video yozib olish"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Yaqin-atrofdagi Bluetooth qurilmalari"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"yaqin-atrofdagi Bluetooth qurilmalarini topish va ularga ulanish"</string>
+ <!-- no translation found for permgrouplab_nearby_devices (5529147543651181991) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_nearby_devices (3213561597116913508) -->
+ <skip />
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Chaqiruvlar jurnali"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"telefon chaqiruvlari jurnalini o‘qish va unga yozish"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
@@ -538,6 +540,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Ilovaga yaqin-atrofdagi Bluetooth qurilmalarini topish va juftlashish uchun ruxsat beradi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"juftlangan Bluetooth qurilmalariga ulanish"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Ilovaga juftlangan Bluetooth qurilmalariga ulanish uchun ruxsat beradi"</string>
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"atrofdagi Bluetooth qurilmalariga reklama berish"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Ilovaga yaqin-atrofdagi Bluetooth qurilmalariga reklama yuborish imkonini beradi"</string>
<!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
<skip />
<!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
@@ -1852,8 +1856,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Administrator tomonidan yangilangan"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Administrator tomonidan o‘chirilgan"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batareya quvvatini uzaytirish uchun Quvvat tejash funksiyasi:\n\n• Tungi mavzuni yoqadi\n• Fondagi harakatlar, vizual effektlar va “Ok Google” kabi boshqa funksiyalarni faolsizlantiradi\n\n"<annotation id="url">"Batafsil"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batareya quvvatini uzaytirish uchun Quvvat tejash funksiyasi:\n\n• Tungi mavzuni yoqadi\n• Fondagi harakatlar, vizual effektlar va “Ok Google” kabi boshqa funksiyalarni faolsizlantiradi"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Trafik tejash rejimida ayrim ilovalar uchun orqa fonda internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Trafik tejash yoqilsinmi?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Yoqish"</string>
@@ -2072,6 +2078,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildirishnoma darajasi Tovushsiz darajaga tushirildi Fikr-mulohaza bildirish uchun bosing."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildirishnoma darajasi oshirildi. Fikr-mulohaza bildirish uchun bosing."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildirishnoma darajasi pasaytirildi. Fikr-mulohaza bildirish uchun bosing."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash rejimi yoqildi"</string>
@@ -2259,9 +2277,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ekranni qisman kattalashtirish mumkin"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Sozlamalar orqali yoqish"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Yopish"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Davom etish uchun <b><xliff:g id="APP">%s</xliff:g></b> mikrofoningizdan foydalanishi kerak."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Davom etish uchun <b><xliff:g id="APP">%s</xliff:g></b> qurilmangiz kamerasiga kirishi kerak."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Yoqish"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Qurilma mikrofonini blokdan chiqaring"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Qurilma kamerasini blokdan chiqaring"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> hamda barcha ilovalar va xizmatlar uchun"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Blokdan chiqarish"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorlar maxfiyligi"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ilova belgisi"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Ilova brendining rasmi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index a808ce8..41edab4 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"truy cập vào hoạt động thể chất"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Máy ảnh"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"chụp ảnh và quay video"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Các thiết bị Bluetooth ở gần"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"khám phá và kết nối với các thiết bị Bluetooth ở gần"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Thiết bị ở gần"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"khám phá và kết nối với các thiết bị ở gần"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Nhật ký cuộc gọi"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"đọc và ghi nhật ký cuộc gọi điện thoại"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Điện thoại"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Cho phép ứng dụng khám phá và ghép nối với các thiết bị Bluetooth ở gần"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kết nối với các thiết bị Bluetooth đã ghép nối"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Cho phép ứng dụng kết nối với thiết bị Bluetooth đã ghép nối"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"xác định khoảng cách tương đối giữa các thiết bị ở gần dùng Băng tần siêu rộng"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Cho phép ứng dụng xác định khoảng cách tương đối giữa các thiết bị ở gần dùng Băng tần siêu rộng"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Thông tin về dịch vụ thanh toán qua công nghệ giao tiếp tầm gần (NFC) được ưu tiên"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Cho phép ứng dụng nhận thông tin về dịch vụ thanh toán qua công nghệ giao tiếp tầm gần mà bạn ưu tiên, chẳng hạn như các hình thức hỗ trợ đã đăng ký và điểm đến trong hành trình."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kiểm soát Liên lạc trường gần"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Do quản trị viên của bạn cập nhật"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Do quản trị viên của bạn xóa"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n\n• Bật Giao diện tối\n• Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n\n• Bật Giao diện tối\n• Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu sẽ chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể dùng dữ liệu nhưng tần suất sẽ giảm. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Bật"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Hệ thống đã hạ mức ưu tiên của thông báo này xuống thành Im lặng. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Hệ thống đã nâng mức ưu tiên của thông báo này. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Hệ thống đã hạ mức ưu tiên của thông báo này. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Thông báo cung cấp thông tin về chế độ sạc thông thường"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pin có thể hết trước khi sạc bình thường"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Trình tiết kiệm pin được kích hoạt để kéo dài thời lượng pin"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Giờ đây, bạn có thể phóng to một phần màn hình"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bật trong phần Cài đặt"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Đóng"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Để tiếp tục, <b><xliff:g id="APP">%s</xliff:g></b> cần quyền truy cập vào micrô trên thiết bị của bạn."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Để tiếp tục, <b><xliff:g id="APP">%s</xliff:g></b> cần quyền truy cập vào máy ảnh trên thiết bị của bạn."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Bật"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Quyền riêng tư khi sử dụng cảm biến"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Biểu tượng ứng dụng"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Hình ảnh thương hiệu của ứng dụng"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 20c3fa3..8d8485d 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"获取您的身体活动数据"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"相机"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"拍摄照片和录制视频"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"附近的蓝牙设备"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"发现并连接到附近的蓝牙设备"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"附近的设备"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"发现并连接到附近的设备"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"通话记录"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"读取和写入手机通话记录"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"电话"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允许该应用发现附近的蓝牙设备并与其配对"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"连接到已配对的蓝牙设备"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允许该应用连接到已配对的蓝牙设备"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"确定附近超宽带设备之间的相对位置"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"允许应用确定附近超宽带设备之间的相对位置"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"首选 NFC 付款服务信息"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允许应用获取首选 NFC 付款服务信息,例如注册的应用标识符和路线目的地。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距离通信"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"已由您的管理员更新"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"已由您的管理员删除"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"确定"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"为了延长电池续航时间,省电模式会执行以下操作:\n\n• 开启深色主题\n• 关闭或限制后台活动、部分视觉效果和其他功能,例如“Ok Google”\n\n"<annotation id="url">"了解详情"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"为了延长电池续航时间,省电模式会执行以下操作:\n\n• 开启深色主题\n• 关闭或限制后台活动、部分视觉效果和其他功能,例如“Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"为了减少流量消耗,流量节省程序会阻止某些应用在后台收发数据。您当前使用的应用可以收发数据,但频率可能会降低。举例而言,这可能意味着图片只有在您点按之后才会显示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要开启流量节省程序吗?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"开启"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"系统已将此通知的重要性降低为“静音”。点按即可提供反馈。"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"系统已提升此通知的重要性。点按即可提供反馈。"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"系统已降低此通知的重要性。点按即可提供反馈。"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式信息通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"电池电量可能会在您平时的充电时间之前耗尽"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已启用省电模式以延长电池续航时间"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"现在您可以放大屏幕上的部分内容"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在“设置”中开启"</string>
<string name="dismiss_action" msgid="1728820550388704784">"关闭"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要继续操作,请向<b><xliff:g id="APP">%s</xliff:g></b>授予设备的麦克风使用权。"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"如要继续操作,请向<b><xliff:g id="APP">%s</xliff:g></b>授予设备的相机使用权。"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"开启"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"传感器隐私权"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"应用图标"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"应用品牌图片"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 5bf32cb..68e06b13 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"存取體能活動"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"相機"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"拍照和錄製影片"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"附近的藍牙裝置"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"探索並連接附近的藍牙裝置"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"附近的裝置"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"探索並連接附近的裝置"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"通話記錄"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"讀取及寫入手機通話記錄"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"電話"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允許應用程式探索並配對附近的藍牙裝置"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"連接附近的藍牙裝置"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允許應用程式連接已配對的藍牙裝置"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"判斷附近超寬頻裝置之間的相對位置"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"允許應用程式判斷附近超寬頻裝置之間的相對位置"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"由用戶允許授權的 NFC 付款服務資訊"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得由用戶允許授權的 NFC 付款服務資訊 (如已註冊的付款輔助功能和最終付款對象)。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"已由您的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"已由您的管理員刪除"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"好"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"為延長電池壽命,「省電模式」會:\n\n• 開啟深色主題背景\n• 關閉或限制背景活動、某些視覺效果和其他功能 (例如「Hey Google」)\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"為延長電池壽命,「省電模式」會:\n\n• 開啟深色主題背景\n• 停用或限制背景活動、部分視覺效果和其他功能 (例如「Hey Google」)"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟「數據節省模式」嗎?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
@@ -2072,6 +2076,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"此通知的重要性已降低為「靜音」。輕按即可提供意見。"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"此通知的重要性已提升。輕按即可提供意見。"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"此通知的重要性已降級。輕按即可提供意見。"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"「日常安排模式」資料通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電量可能會在日常充電前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"「省電模式」已啟用,以便延長電池壽命"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"您現在可以放大部分畫面"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在「設定」中開啟"</string>
<string name="dismiss_action" msgid="1728820550388704784">"關閉"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要繼續,<b><xliff:g id="APP">%s</xliff:g></b> 需要裝置的麥克風存取權。"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"如要繼續,<b><xliff:g id="APP">%s</xliff:g></b> 需要裝置的相機存取權。"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"開啟"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"感應器私隱"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"應用程式圖示"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"應用程式品牌形象"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index e2c731d..78f326b 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"存取你的體能活動記錄"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"相機"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"拍照及錄製影片"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"鄰近藍牙裝置"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"探索鄰近藍牙裝置並進行連線"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"附近的裝置"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"探索附近的裝置並進行連線"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"通話記錄"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"讀取及寫入通話記錄"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"電話"</string>
@@ -538,10 +538,12 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允許應用程式探索鄰近藍牙裝置並進行配對"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"與已配對的藍牙裝置連線"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允許應用程式與已配對的藍牙裝置連線"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
+ <!-- no translation found for permlab_bluetooth_advertise (2781147747928853177) -->
<skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
+ <!-- no translation found for permdesc_bluetooth_advertise (6085174451034210183) -->
<skip />
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"判斷附近超寬頻裝置間的相對位置"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"允許應用程式判斷附近超寬頻裝置間的相對位置"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"首選 NFC 付費服務資訊"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得首選 NFC 付費服務資訊,例如已註冊的輔助工具和路線目的地。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string>
@@ -1386,7 +1388,7 @@
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"拒絕"</string>
<string name="select_input_method" msgid="3971267998568587025">"選擇輸入法"</string>
- <string name="show_ime" msgid="6406112007347443383">"連接實體鍵盤時保持顯示"</string>
+ <string name="show_ime" msgid="6406112007347443383">"使用實體鍵盤時仍繼續顯示虛擬鍵盤"</string>
<string name="hardware" msgid="1800597768237606953">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"設定實體鍵盤"</string>
<string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"輕觸即可選取語言和版面配置"</string>
@@ -1688,8 +1690,8 @@
<string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"同時按住音量調高鍵和調低鍵數秒,即可開啟「<xliff:g id="SERVICE">%1$s</xliff:g>」無障礙功能。這麼做可能會改變裝置的運作方式。\n\n你可以在 [設定] > [無障礙設定] 中變更這個快速鍵觸發的功能。"</string>
<string name="accessibility_shortcut_on" msgid="5463618449556111344">"開啟"</string>
<string name="accessibility_shortcut_off" msgid="3651336255403648739">"不要開啟"</string>
- <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"已開啟"</string>
- <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"已關閉"</string>
+ <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"開啟"</string>
+ <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"關閉"</string>
<string name="accessibility_enable_service_title" msgid="3931558336268541484">"要將裝置的完整控制權授予「<xliff:g id="SERVICE">%1$s</xliff:g>」嗎?"</string>
<string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"如果你開啟「<xliff:g id="SERVICE">%1$s</xliff:g>」,裝置將無法使用螢幕鎖定功能強化資料加密。"</string>
<string name="accessibility_service_warning_description" msgid="291674995220940133">"如果你有無障礙服務需求,可以將完整控制權授予具有相關功能的應用程式,但請勿將完整控制權授予大多數的應用程式。"</string>
@@ -1852,8 +1854,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"已由你的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"已由你的管理員刪除"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"確定"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"為了延長電池續航力,節約耗電量模式會執行以下動作:\n\n• 開啟深色主題\n• 關閉或限制背景活動、某些視覺效果和其他功能,例如「Ok Google」啟動字詞\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"為了延長電池續航力,節約耗電量模式會執行以下動作:\n\n• 開啟深色主題\n• 關閉或限制背景活動、某些視覺效果和其他功能,例如「Ok Google」啟動字詞"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
@@ -2072,10 +2076,22 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"這則通知的重要性已降低為「靜音」。輕觸即可提供意見。"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"這則通知的重要性順序已調高。輕觸即可提供意見。"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"這則通知的重要性順序已調降。輕觸即可提供意見。"</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式資訊通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電池電力可能會在你平常的充電時間前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已啟用省電模式以延長電池續航力"</string>
- <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"節約耗電量"</string>
+ <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"省電模式"</string>
<string name="battery_saver_off_notification_title" msgid="7637255960468032515">"省電模式已關閉"</string>
<string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"手機電力充足,各項功能不再受到限制。"</string>
<string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"平板電腦電力充足,各項功能不再受到限制。"</string>
@@ -2259,9 +2275,14 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"你現在可以放大局部畫面了"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在「設定」中開啟"</string>
<string name="dismiss_action" msgid="1728820550388704784">"關閉"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要繼續操作,請將裝置的麥克風存取權授予「<xliff:g id="APP">%s</xliff:g>」<b></b>。"</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"如要繼續操作,請將裝置的相機存取權授予「<xliff:g id="APP">%s</xliff:g>」<b></b>。"</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"開啟"</string>
+ <!-- no translation found for sensor_privacy_start_use_mic_notification_content_title (2420858361276370367) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_camera_notification_content_title (7287720213963466672) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_notification_content_text (7595608891015777346) -->
+ <skip />
+ <!-- no translation found for sensor_privacy_start_use_dialog_turn_on_button (7089318886628390827) -->
+ <skip />
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"感應器隱私權"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"應用程式圖示"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"應用程式品牌圖片"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 4e17f87..1eb8438 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -319,8 +319,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"finyelela kumsebenzi wakho womzimba"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Ikhamela"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"thatha izithombe uphinde urekhode ividiyo"</string>
- <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Amadivayisi we-Bluetooth Aseduze"</string>
- <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"thola futhi uxhume kumadivayisi we-Bluetooth aseduze"</string>
+ <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Amadivayisi aseduze"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"thola futhi uxhume kumadivayisi aseduze"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Amarekhodi wamakholi"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"funda futhi ubhale irekhodi lamakholi efoni"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Ifoni"</string>
@@ -538,10 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Kuvumela i-app ithole futhi ibhangqe amadivayisi we-Bluetooth aseduze"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"xhuma kumadivayisi we-Bluetooth abhangqiwe"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Kuvumela i-app ixhume kumadivayisi we-Bluetooth abhangqiwe"</string>
- <!-- no translation found for permlab_uwb_ranging (8141915781475770665) -->
- <skip />
- <!-- no translation found for permdesc_uwb_ranging (2519723069604307055) -->
- <skip />
+ <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"khangisa kumadivayisi e-Bluetooth aseduze"</string>
+ <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Ivumela i-app ikhangise kumadivayisi e-Bluetooth aseduze"</string>
+ <string name="permlab_uwb_ranging" msgid="8141915781475770665">"nquma indawo ehambelanayo phakathi kwamadivayisi e-Ultra-Wideband aseduze"</string>
+ <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Vumela i-app inqume indawo ehambelanayo phakathi kwamadivayisi e-Ultra-Wideband aseduze"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Ulwazi Lwesevisi Yenkokhelo Ye-NFC Okhethwayo"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ivuemela uhlelo lokusebenza ukuthola ulwazi lesevisi yenkokhelo ye-nfc njengezinsiza zokubhalisa nezindawo zomzila."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"lawula Uxhumano Lwenkambu Eseduze"</string>
@@ -1852,8 +1852,10 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"Kubuyekezwe umlawuli wakho"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Kususwe umlawuli wakho"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"KULUNGILE"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Ukuze unwebe impilo yebhethri, Isilondolozi Sebhethri:\n\n•Sivula itimu emnyama\n• Sivala noma sibeka umkhawulo emsebenzini wangemuva, kweminye imithelela yokubuka, nakwezinye izici ezifana nokuthi “Ok Google”\n\n"<annotation id="url">"Funda kabanzi"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Ukuze unwebe impilo yebhethri, Isilondolozi sebhethri:\n\n•Sivula itimu emnyama\n• Sivala noma sibeka umkhawulo emsebenzini wangemuva, kweminye imithelela yokubuka, nakwezinye izici ezifana nokuthi “Ok Google”"</string>
+ <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (7695751399533397741) -->
+ <skip />
<string name="data_saver_description" msgid="4995164271550590517">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vula iseva yedatha?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Vula"</string>
@@ -2072,6 +2074,18 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Lesi saziso sehliselwe esikhundleni Sokuthula. Thepha ukuze unikeze impendulo."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Lesi saziso sibekwe ezingeni eliphakeme. Thepha ukuze unikeze impendulo."</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Lesi saziso sibekwe ezingeni eliphansi. Thepha ukuze unikeze impendulo."</string>
+ <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
+ <skip />
+ <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+ <skip />
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Isaziso solwazi lwe-Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
@@ -2259,9 +2273,10 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Manje ungakhulisa ingxenye yesikrini sakho"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Vula Kumasethingi"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Cashisa"</string>
- <string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ukuze uqhubeke, <b>i-<xliff:g id="APP">%s</xliff:g></b> idinga ukufinyelela imakrofoni yedivayisi yakho."</string>
- <string name="sensor_privacy_start_use_camera_notification_content" msgid="4738005643315863736">"Ukuze uqhubeke, <b>i-<xliff:g id="APP">%s</xliff:g></b> idinga ukufinyelela ikhamera yakho."</string>
- <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7921147002346108119">"Vula"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Vulela imakrofoni yedivayisi"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Vulela ikhamera yedivayisi"</string>
+ <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Mayelana ne-<b><xliff:g id="APP">%s</xliff:g></b> nawo wonke ama-app namasevisi"</string>
+ <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Vulela"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Ubumfihlo Benzwa"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"Isithonjana sohlelo lokusebenza"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Isithombe sokubhrenda i-application"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index f508b3e..bd1d848 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1134,6 +1134,15 @@
<!-- Tertiary accent color used on Material NEXT buttons. @hide -->
<attr name="colorAccentTertiary" format="color" />
+ <!-- Darker accent color used on Material NEXT buttons. @hide -->
+ <attr name="colorAccentPrimaryVariant" format="color" />
+
+ <!-- Secondary darker accent color used on Material NEXT buttons. @hide -->
+ <attr name="colorAccentSecondaryVariant" format="color" />
+
+ <!-- Tertiary darker accent color used on Material NEXT buttons. @hide -->
+ <attr name="colorAccentTertiaryVariant" format="color" />
+
<!-- The color applied to framework controls in their normal state. -->
<attr name="colorControlNormal" format="color" />
@@ -1155,6 +1164,18 @@
<!-- The color applied to the edge effect on scrolling containers. -->
<attr name="colorEdgeEffect" format="color" />
+ <!-- The color applied to surfaces on top of colorBackground. @hide -->
+ <attr name="colorSurface" format="color" />
+
+ <!-- Alternative color applied to surfaces on top of colorBackground. @hide -->
+ <attr name="colorSurfaceHighlight" format="color" />
+
+ <!-- Alternative color applied to surfaces on top of colorBackground. @hide -->
+ <attr name="colorSurfaceVariant" format="color" />
+
+ <!-- Alternative color applied to surfaces on top of colorBackground. @hide -->
+ <attr name="colorSurfaceHeader" format="color" />
+
<!-- The type of the edge effect. The default is glow. -->
<attr name="edgeEffectType">
<!-- Use a colored glow at the edge. -->
diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml
index cb7f69b..bec0ad1 100644
--- a/core/res/res/values/colors_device_defaults.xml
+++ b/core/res/res/values/colors_device_defaults.xml
@@ -25,14 +25,13 @@
<color name="primary_dark_device_default_light">@color/primary_device_default_light</color>
<color name="primary_dark_device_default_settings">@color/primary_device_default_dark</color>
<color name="primary_dark_device_default_settings_light">@color/primary_device_default_light</color>
-
- <color name="navigation_bar_divider_device_default_settings">#1f000000</color>
-
<color name="secondary_device_default_settings">@color/secondary_material_settings</color>
<color name="secondary_device_default_settings_light">@color/secondary_material_settings_light</color>
<color name="tertiary_device_default_settings">@color/tertiary_material_settings</color>
<color name="quaternary_device_default_settings">@color/quaternary_material_settings</color>
+ <color name="navigation_bar_divider_device_default_settings">#1f000000</color>
+ <!-- Accent colors -->
<color name="accent_device_default_light">@color/system_accent1_600</color>
<color name="accent_device_default_dark">@color/system_accent1_100</color>
<color name="accent_device_default">@color/accent_device_default_light</color>
@@ -40,10 +39,27 @@
<color name="accent_secondary_device_default">@color/system_accent2_100</color>
<color name="accent_tertiary_device_default">@color/system_accent3_100</color>
- <color name="background_device_default_dark">@color/system_neutral1_800</color>
+ <!-- Accent variants -->
+ <color name="accent_primary_variant_light_device_default">@color/system_accent1_600</color>
+ <color name="accent_secondary_variant_light_device_default">@color/system_accent2_600</color>
+ <color name="accent_tertiary_variant_light_device_default">@color/system_accent3_600</color>
+ <color name="accent_primary_variant_dark_device_default">@color/system_accent1_300</color>
+ <color name="accent_secondary_variant_dark_device_default">@color/system_accent2_300</color>
+ <color name="accent_tertiary_variant_dark_device_default">@color/system_accent3_300</color>
+
+ <!-- Background colors -->
+ <color name="background_device_default_dark">@color/system_neutral1_900</color>
<color name="background_device_default_light">@color/system_neutral1_50</color>
- <color name="background_floating_device_default_dark">@color/system_neutral1_900</color>
- <color name="background_floating_device_default_light">@color/system_neutral1_100</color>
+ <color name="background_floating_device_default_dark">@color/background_device_default_dark</color>
+ <color name="background_floating_device_default_light">@color/background_device_default_light</color>
+
+ <!-- Surface colors -->
+ <color name="surface_header_dark">@color/system_neutral1_700</color>
+ <color name="surface_header_light">@color/system_neutral1_100</color>
+ <color name="surface_variant_dark">@color/system_neutral1_700</color>
+ <color name="surface_variant_light">@color/system_neutral2_100</color>
+ <color name="surface_dark">@color/system_neutral1_800</color>
+ <color name="surface_highlight_light">@color/system_neutral1_0</color>
<!-- Please refer to text_color_[primary]_device_default_[light].xml for text colors-->
<color name="foreground_device_default_light">@color/text_color_primary_device_default_light</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 49bd853..e4ea8fb 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -960,6 +960,13 @@
-->
<integer name="config_veryLongPressOnPowerBehavior">0</integer>
+ <!-- Control the behavior when the user presses the power and volume up buttons together.
+ 0 - Nothing
+ 1 - Mute toggle
+ 2 - Global actions menu
+ -->
+ <integer name="config_keyChordPowerVolumeUp">1</integer>
+
<!-- Control the behavior when the user long presses the back button. Non-zero values are only
valid for watches as part of CDD/CTS.
0 - Nothing
@@ -1941,7 +1948,7 @@
<string name="config_systemActivityRecognizer" translatable="false"></string>
<!-- The name of the package that will be allowed to change its components' label/icon. -->
- <string name="config_overrideComponentUiPackage" translatable="false"></string>
+ <string name="config_overrideComponentUiPackage" translatable="false">com.android.stk</string>
<!-- Enable/disable default bluetooth profiles:
HSP_AG, ObexObjectPush, Audio, NAP -->
@@ -4661,10 +4668,26 @@
corners of the activity won't be rounded. -->
<integer name="config_letterboxActivityCornersRadius">0</integer>
+ <!-- Blur radius for the Option 3 in R.integer.config_letterboxBackgroundType. Values < 0 are
+ ignored and 0 is used. -->
+ <dimen name="config_letterboxBackgroundWallpaperBlurRadius">100dp</dimen>
+
+ <!-- Alpha of a black translucent scrim showed over wallpaper letterbox background when
+ the Option 3 is selected for R.integer.config_letterboxBackgroundType.
+ Values < 0 or >= 1 are ignored and 0.0 (transparent) is used instead. -->
+ <item name="config_letterboxBackgroundWallaperDarkScrimAlpha" format="float" type="dimen">
+ 0.5
+ </item>
+
<!-- Corners appearance of the letterbox background.
0 - Solid background using color specified in R.color.config_letterboxBackgroundColor.
1 - Color specified in R.attr.colorBackground for the letterboxed application.
2 - Color specified in R.attr.colorBackgroundFloating for the letterboxed application.
+ 3 - Wallpaper with dimmed with blur or/and dark scrim. At least one of the following
+ parameters should be > 0: config_letterboxBackgroundWallpaperBlurRadius,
+ config_letterboxBackgroundWallaperDarkScrimAlpha. If it's not the case or blur radius
+ provided but blur isn't supported by the device and this option
+ is selected then implementation will default to option 0.
If given value is outside of this range, the option 0 will be assummed. -->
<integer name="config_letterboxBackgroundType">0</integer>
@@ -4674,6 +4697,9 @@
R.attr.colorBackground isn't specified for the app.
- Option 2 is selected for R.integer.config_letterboxBackgroundType and
R.attr.colorBackgroundFloating isn't specified for the app.
+ - Option 3 is selected for R.integer.config_letterboxBackgroundType and blur requested
+ but isn't supported on the device or both dark scrim alpha and blur radius aren't
+ provided.
Defaults to black if not specified.
-->
<color name="config_letterboxBackgroundColor">#000</color>
@@ -4740,7 +4766,7 @@
<bool name="config_cecHdmiCecVersion20_allowed">true</bool>
<bool name="config_cecHdmiCecVersion20_default">false</bool>
- <bool name="config_cecSendStandbyOnSleep_userConfigurable">true</bool>
+ <bool name="config_cecPowerControlMode_userConfigurable">true</bool>
<bool name="config_cecPowerControlModeTv_allowed">true</bool>
<bool name="config_cecPowerControlModeTv_default">true</bool>
<bool name="config_cecPowerControlModeBroadcast_allowed">true</bool>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 3a5621b..89adc8c 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3223,6 +3223,8 @@
<public name="config_systemTextIntelligence" />
<!-- @hide @SystemApi -->
<public name="config_systemVisualIntelligence" />
+ <!-- @hide @SystemApi -->
+ <public name="config_systemActivityRecognizer" />
</staging-public-group>
<staging-public-group type="id" first-id="0x01020055">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 9736c4b..3208dff 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4983,10 +4983,10 @@
<string name="confirm_battery_saver">OK</string>
<!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, with a "learn more" link. -->
- <string name="battery_saver_description_with_learn_more">To extend battery life, Battery Saver:\n\n\u2022 Turns on Dark theme\n\u2022 Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d\n\n<annotation id="url">Learn more</annotation></string>
+ <string name="battery_saver_description_with_learn_more">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like \u201cHey Google\u201d\n\n<annotation id="url">Learn more</annotation></string>
<!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, without a "learn more" link. -->
- <string name="battery_saver_description">To extend battery life, Battery Saver:\n\n\u2022 Turns on Dark theme\n\u2022 Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d</string>
+ <string name="battery_saver_description">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like \u201cHey Google\u201d.</string>
<!-- [CHAR_LIMIT=NONE] Data saver: Feature description -->
<string name="data_saver_description">To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.</string>
@@ -5513,6 +5513,21 @@
<!-- Content description of the demoted feedback icon in the notification. [CHAR LIMIT=NONE] -->
<string name="notification_feedback_indicator_demoted">This notification was ranked lower. Tap to provide feedback.</string>
+ <!-- Notification Intelligence -->
+ <!-- Title of notification indicating notification intelligence settings have changed when upgrading to S [CHAR LIMIT=30] -->
+ <string name="nas_upgrade_notification_title">Try enhanced notifications</string>
+ <!-- Content of notification indicating users need to update the settings [CHAR LIMIT=NONE] -->
+ <string name="nas_upgrade_notification_content">To keep getting suggested actions, replies, and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported.</string>
+ <!-- Label of notification action button to turn on the notification intelligence [CHAR LIMIT=20] -->
+ <string name="nas_upgrade_notification_enable_action">Turn on</string>
+ <!-- Label of notification action button to turn off the notification intelligence [CHAR LIMIT=20] -->
+ <string name="nas_upgrade_notification_disable_action">Not now</string>
+ <!-- Label of notification action button to learn more about the notification intelligence settings [CHAR LIMIT=20] -->
+ <string name="nas_upgrade_notification_learn_more_action">Learn more</string>
+ <!-- Content of notification learn more dialog about the notification intelligence settings [CHAR LIMIT=NONE] -->
+ <string name="nas_upgrade_notification_learn_more_content">Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings.</string>
+
+
<!-- Dynamic mode battery saver strings -->
<!-- The user visible name of the notification channel for the routine mode battery saver fyi notification [CHAR_LIMIT=80]-->
<string name="dynamic_mode_notification_channel_name">Routine Mode info notification</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 8c8d99e..4bb3236 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -435,6 +435,7 @@
<java-symbol type="integer" name="config_veryLongPressTimeout" />
<java-symbol type="integer" name="config_longPressOnBackBehavior" />
<java-symbol type="bool" name="config_allowStartActivityForLongPressOnPowerInSetup" />
+ <java-symbol type="integer" name="config_keyChordPowerVolumeUp" />
<java-symbol type="integer" name="config_wakeUpToLastStateTimeoutMillis" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" />
@@ -2263,6 +2264,12 @@
<java-symbol type="style" name="Animation.RecentApplications" />
<java-symbol type="integer" name="dock_enter_exit_duration" />
<java-symbol type="bool" name="config_battery_percentage_setting_available" />
+ <java-symbol type="string" name="nas_upgrade_notification_title" />
+ <java-symbol type="string" name="nas_upgrade_notification_content" />
+ <java-symbol type="string" name="nas_upgrade_notification_enable_action" />
+ <java-symbol type="string" name="nas_upgrade_notification_disable_action" />
+ <java-symbol type="string" name="nas_upgrade_notification_learn_more_action" />
+ <java-symbol type="string" name="nas_upgrade_notification_learn_more_content" />
<!-- ImfTest -->
<java-symbol type="layout" name="auto_complete_list" />
@@ -4170,7 +4177,9 @@
<java-symbol type="dimen" name="controls_thumbnail_image_max_width" />
<java-symbol type="dimen" name="config_fixedOrientationLetterboxAspectRatio" />
+ <java-symbol type="dimen" name="config_letterboxBackgroundWallpaperBlurRadius" />
<java-symbol type="integer" name="config_letterboxActivityCornersRadius" />
+ <java-symbol type="dimen" name="config_letterboxBackgroundWallaperDarkScrimAlpha" />
<java-symbol type="integer" name="config_letterboxBackgroundType" />
<java-symbol type="color" name="config_letterboxBackgroundColor" />
@@ -4220,6 +4229,10 @@
<java-symbol type="attr" name="colorAccentPrimary" />
<java-symbol type="attr" name="colorAccentSecondary" />
<java-symbol type="attr" name="colorAccentTertiary" />
+ <java-symbol type="attr" name="colorSurface" format="color" />
+ <java-symbol type="attr" name="colorSurfaceHighlight" format="color" />
+ <java-symbol type="attr" name="colorSurfaceVariant" format="color" />
+ <java-symbol type="attr" name="colorSurfaceHeader" format="color" />
<!-- CEC Configuration -->
<java-symbol type="bool" name="config_cecHdmiCecEnabled_userConfigurable" />
@@ -4234,7 +4247,7 @@
<java-symbol type="bool" name="config_cecHdmiCecVersion20_allowed" />
<java-symbol type="bool" name="config_cecHdmiCecVersion20_default" />
- <java-symbol type="bool" name="config_cecSendStandbyOnSleep_userConfigurable" />
+ <java-symbol type="bool" name="config_cecPowerControlMode_userConfigurable" />
<java-symbol type="bool" name="config_cecPowerControlModeTv_allowed" />
<java-symbol type="bool" name="config_cecPowerControlModeTv_default" />
<java-symbol type="bool" name="config_cecPowerControlModeBroadcast_allowed" />
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index ca4265a..1d4beae 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -217,6 +217,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -243,6 +250,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -281,6 +295,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -321,6 +342,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -360,6 +388,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -414,6 +449,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -445,6 +487,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -482,6 +531,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -520,6 +576,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -574,6 +637,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -613,6 +683,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -650,6 +727,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -689,6 +773,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -727,6 +818,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -765,6 +863,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -803,6 +908,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -841,6 +953,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -883,6 +1002,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -922,6 +1048,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -958,6 +1091,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -1148,6 +1288,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1170,6 +1317,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1207,6 +1361,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1245,6 +1406,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1285,6 +1453,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1324,6 +1499,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1380,6 +1562,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1410,6 +1599,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1450,6 +1646,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1491,6 +1694,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1533,6 +1743,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="textColorPrimary">@color/text_color_primary_device_default_light</item>
<item name="textColorSecondary">@color/text_color_secondary_device_default_light</item>
@@ -1555,6 +1772,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="textColorPrimary">@color/text_color_primary_device_default_light</item>
<item name="textColorSecondary">@color/text_color_secondary_device_default_light</item>
@@ -1576,6 +1800,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1618,6 +1849,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1658,6 +1896,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1697,6 +1942,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1735,6 +1987,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1773,6 +2032,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1809,6 +2075,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -1862,6 +2135,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorEdgeEffect">@color/edge_effect_device_default_light</item>
@@ -1893,6 +2173,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorControlNormal">?attr/textColorPrimary</item>
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
@@ -1921,6 +2208,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
@@ -1942,6 +2236,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_dark_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_dark_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_dark_device_default</item>
+ <item name="colorSurface">@color/surface_dark</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_dark</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_dark</item>
+ <item name="colorSurfaceHeader">@color/surface_header_dark</item>
<item name="colorError">@color/error_color_device_default_dark</item>
<item name="colorBackground">@color/background_device_default_dark</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item>
@@ -1979,6 +2280,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -2026,6 +2334,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
@@ -2066,6 +2381,13 @@
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/accent_secondary_device_default</item>
<item name="colorAccentTertiary">@color/accent_tertiary_device_default</item>
+ <item name="colorAccentPrimaryVariant">@color/accent_primary_variant_light_device_default</item>
+ <item name="colorAccentSecondaryVariant">@color/accent_secondary_variant_light_device_default</item>
+ <item name="colorAccentTertiaryVariant">@color/accent_tertiary_variant_light_device_default</item>
+ <item name="colorSurface">@color/surface_light</item>
+ <item name="colorSurfaceHighlight">@color/surface_highlight_light</item>
+ <item name="colorSurfaceVariant">@color/surface_variant_light</item>
+ <item name="colorSurfaceHeader">@color/surface_header_light</item>
<item name="colorError">@color/error_color_device_default_light</item>
<item name="colorBackground">@color/background_device_default_light</item>
<item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java
index 1afc22b7..14d740d 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java
@@ -21,7 +21,6 @@
import android.app.Instrumentation;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
@@ -128,8 +127,7 @@
}
@Override
- public void onAvailable(Network network, NetworkCapabilities networkCapabilities,
- LinkProperties linkProperties, boolean blocked) {
+ public void onAvailable(Network network) {
checkActiveNetwork();
}
diff --git a/core/tests/coretests/src/android/app/admin/OWNERS b/core/tests/coretests/src/android/app/admin/OWNERS
new file mode 100644
index 0000000..e95633a
--- /dev/null
+++ b/core/tests/coretests/src/android/app/admin/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/app/admin/OWNERS
diff --git a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java
index 1a06789e..75da0bf 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java
@@ -111,6 +111,7 @@
private IBinder mAssistToken;
private IBinder mShareableActivityToken;
private FixedRotationAdjustments mFixedRotationAdjustments;
+ private boolean mLaunchedFromBubble;
LaunchActivityItemBuilder setIntent(Intent intent) {
mIntent = intent;
@@ -207,13 +208,18 @@
return this;
}
+ LaunchActivityItemBuilder setLaunchedFromBubble(boolean launchedFromBubble) {
+ mLaunchedFromBubble = launchedFromBubble;
+ return this;
+ }
+
LaunchActivityItem build() {
return LaunchActivityItem.obtain(mIntent, mIdent, mInfo,
mCurConfig, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor,
mProcState, mState, mPersistentState, mPendingResults, mPendingNewIntents,
mActivityOptions, mIsForward, mProfilerInfo, mAssistToken,
null /* activityClientController */, mFixedRotationAdjustments,
- mShareableActivityToken);
+ mShareableActivityToken, mLaunchedFromBubble);
}
}
}
diff --git a/core/tests/coretests/src/android/app/time/ExternalTimeSuggestionTest.java b/core/tests/coretests/src/android/app/time/ExternalTimeSuggestionTest.java
deleted file mode 100644
index 1c6b3cc..0000000
--- a/core/tests/coretests/src/android/app/time/ExternalTimeSuggestionTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.time;
-
-import static android.app.timezonedetector.ParcelableTestSupport.assertRoundTripParcelable;
-import static android.app.timezonedetector.ParcelableTestSupport.roundTripParcelable;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.os.TimestampedValue;
-
-import org.junit.Test;
-
-public class ExternalTimeSuggestionTest {
-
- private static final TimestampedValue<Long> ARBITRARY_TIME =
- new TimestampedValue<>(1111L, 2222L);
-
- @Test
- public void testEquals() {
- ExternalTimeSuggestion one = new ExternalTimeSuggestion(
- ARBITRARY_TIME.getReferenceTimeMillis(),
- ARBITRARY_TIME.getValue());
- assertEquals(one, one);
-
- ExternalTimeSuggestion two = new ExternalTimeSuggestion(
- ARBITRARY_TIME.getReferenceTimeMillis(),
- ARBITRARY_TIME.getValue());
- assertEquals(one, two);
- assertEquals(two, one);
-
- ExternalTimeSuggestion three = new ExternalTimeSuggestion(
- ARBITRARY_TIME.getReferenceTimeMillis() + 1,
- ARBITRARY_TIME.getValue());
- assertNotEquals(one, three);
- assertNotEquals(three, one);
-
- // DebugInfo must not be considered in equals().
- one.addDebugInfo("Debug info 1");
- two.addDebugInfo("Debug info 2");
- assertEquals(one, two);
- }
-
- @Test
- public void testParcelable() {
- ExternalTimeSuggestion suggestion = new ExternalTimeSuggestion(
- ARBITRARY_TIME.getReferenceTimeMillis(),
- ARBITRARY_TIME.getValue());
- assertRoundTripParcelable(suggestion);
-
- // DebugInfo should also be stored (but is not checked by equals())
- suggestion.addDebugInfo("This is debug info");
- ExternalTimeSuggestion rtSuggestion = roundTripParcelable(suggestion);
- assertEquals(suggestion.getDebugInfo(), rtSuggestion.getDebugInfo());
- }
-}
diff --git a/core/tests/coretests/src/android/content/ContentProviderTest.java b/core/tests/coretests/src/android/content/ContentProviderTest.java
index b282064..ceebc62 100644
--- a/core/tests/coretests/src/android/content/ContentProviderTest.java
+++ b/core/tests/coretests/src/android/content/ContentProviderTest.java
@@ -89,9 +89,9 @@
}
@Test
- public void testCreateContentUriAsUser() {
+ public void testCreateContentUriForUser() {
Uri uri = Uri.parse("content://com.example/foo/bar");
Uri expectedUri = Uri.parse("content://7@com.example/foo/bar");
- assertEquals(expectedUri, ContentProvider.createContentUriAsUser(uri, UserHandle.of(7)));
+ assertEquals(expectedUri, ContentProvider.createContentUriForUser(uri, UserHandle.of(7)));
}
}
diff --git a/core/tests/coretests/src/android/net/SntpClientTest.java b/core/tests/coretests/src/android/net/SntpClientTest.java
index 87edb6e..bf9978c 100644
--- a/core/tests/coretests/src/android/net/SntpClientTest.java
+++ b/core/tests/coretests/src/android/net/SntpClientTest.java
@@ -20,6 +20,9 @@
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
+import static org.mockito.Mockito.mock;
+
import android.util.Log;
import androidx.test.runner.AndroidJUnit4;
@@ -73,8 +76,9 @@
@Before
public void setUp() throws Exception {
- // NETID_UNSET allows the test to run, with a loopback server, even w/o external networking
- mNetwork = new Network(ConnectivityManager.NETID_UNSET);
+ // A mock network has NETID_UNSET, which allows the test to run, with a loopback server,
+ // even w/o external networking.
+ mNetwork = mock(Network.class, CALLS_REAL_METHODS);
mServer = new SntpTestServer();
mClient = new SntpClient();
}
diff --git a/core/tests/coretests/src/android/os/CombinedVibrationEffectTest.java b/core/tests/coretests/src/android/os/CombinedVibrationTest.java
similarity index 72%
rename from core/tests/coretests/src/android/os/CombinedVibrationEffectTest.java
rename to core/tests/coretests/src/android/os/CombinedVibrationTest.java
index 30b2d8e..06b5d18 100644
--- a/core/tests/coretests/src/android/os/CombinedVibrationEffectTest.java
+++ b/core/tests/coretests/src/android/os/CombinedVibrationTest.java
@@ -33,75 +33,75 @@
@Presubmit
@RunWith(JUnit4.class)
-public class CombinedVibrationEffectTest {
+public class CombinedVibrationTest {
private static final VibrationEffect VALID_EFFECT = VibrationEffect.createOneShot(10, 255);
private static final VibrationEffect INVALID_EFFECT = new VibrationEffect.Composed(
new ArrayList<>(), 0);
@Test
public void testValidateMono() {
- CombinedVibrationEffect.createSynced(VALID_EFFECT);
+ CombinedVibration.createParallel(VALID_EFFECT);
assertThrows(IllegalArgumentException.class,
- () -> CombinedVibrationEffect.createSynced(INVALID_EFFECT));
+ () -> CombinedVibration.createParallel(INVALID_EFFECT));
}
@Test
public void testValidateStereo() {
- CombinedVibrationEffect.startSynced()
+ CombinedVibration.startParallel()
.addVibrator(0, VALID_EFFECT)
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine();
- CombinedVibrationEffect.startSynced()
+ CombinedVibration.startParallel()
.addVibrator(0, INVALID_EFFECT)
.addVibrator(0, VALID_EFFECT)
.combine();
assertThrows(IllegalArgumentException.class,
- () -> CombinedVibrationEffect.startSynced()
+ () -> CombinedVibration.startParallel()
.addVibrator(0, INVALID_EFFECT)
.combine());
}
@Test
public void testValidateSequential() {
- CombinedVibrationEffect.startSequential()
+ CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT)
- .addNext(CombinedVibrationEffect.createSynced(VALID_EFFECT))
+ .addNext(CombinedVibration.createParallel(VALID_EFFECT))
.combine();
- CombinedVibrationEffect.startSequential()
+ CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT)
.addNext(0, VALID_EFFECT, 100)
.combine();
- CombinedVibrationEffect.startSequential()
- .addNext(CombinedVibrationEffect.startSequential()
+ CombinedVibration.startSequential()
+ .addNext(CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT)
.combine())
.combine();
assertThrows(IllegalArgumentException.class,
- () -> CombinedVibrationEffect.startSequential()
+ () -> CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT, -1)
.combine());
assertThrows(IllegalArgumentException.class,
- () -> CombinedVibrationEffect.startSequential()
+ () -> CombinedVibration.startSequential()
.addNext(0, INVALID_EFFECT)
.combine());
}
@Test
public void testNestedSequentialAccumulatesDelays() {
- CombinedVibrationEffect.Sequential combined =
- (CombinedVibrationEffect.Sequential) CombinedVibrationEffect.startSequential()
- .addNext(CombinedVibrationEffect.startSequential()
+ CombinedVibration.Sequential combined =
+ (CombinedVibration.Sequential) CombinedVibration.startSequential()
+ .addNext(CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT, /* delay= */ 100)
.addNext(1, VALID_EFFECT, /* delay= */ 100)
.combine(),
/* delay= */ 10)
- .addNext(CombinedVibrationEffect.startSequential()
+ .addNext(CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT, /* delay= */ 100)
.combine())
- .addNext(CombinedVibrationEffect.startSequential()
+ .addNext(CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT)
.addNext(0, VALID_EFFECT, /* delay= */ 100)
.combine(),
@@ -114,37 +114,37 @@
@Test
public void testCombineEmptyFails() {
assertThrows(IllegalStateException.class,
- () -> CombinedVibrationEffect.startSynced().combine());
+ () -> CombinedVibration.startParallel().combine());
assertThrows(IllegalStateException.class,
- () -> CombinedVibrationEffect.startSequential().combine());
+ () -> CombinedVibration.startSequential().combine());
}
@Test
public void testDurationMono() {
- assertEquals(1, CombinedVibrationEffect.createSynced(
+ assertEquals(1, CombinedVibration.createParallel(
VibrationEffect.createOneShot(1, 1)).getDuration());
- assertEquals(-1, CombinedVibrationEffect.createSynced(
+ assertEquals(-1, CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK)).getDuration());
- assertEquals(Long.MAX_VALUE, CombinedVibrationEffect.createSynced(
+ assertEquals(Long.MAX_VALUE, CombinedVibration.createParallel(
VibrationEffect.createWaveform(
new long[]{1, 2, 3}, new int[]{1, 2, 3}, 0)).getDuration());
}
@Test
public void testDurationStereo() {
- assertEquals(6, CombinedVibrationEffect.startSynced()
+ assertEquals(6, CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(1, 1))
.addVibrator(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, -1))
.combine()
.getDuration());
- assertEquals(-1, CombinedVibrationEffect.startSynced()
+ assertEquals(-1, CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, -1))
.combine()
.getDuration());
- assertEquals(Long.MAX_VALUE, CombinedVibrationEffect.startSynced()
+ assertEquals(Long.MAX_VALUE, CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, 0))
@@ -154,19 +154,19 @@
@Test
public void testDurationSequential() {
- assertEquals(26, CombinedVibrationEffect.startSequential()
+ assertEquals(26, CombinedVibration.startSequential()
.addNext(1, VibrationEffect.createOneShot(10, 10), 10)
.addNext(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, -1))
.combine()
.getDuration());
- assertEquals(-1, CombinedVibrationEffect.startSequential()
+ assertEquals(-1, CombinedVibration.startSequential()
.addNext(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addNext(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, -1))
.combine()
.getDuration());
- assertEquals(Long.MAX_VALUE, CombinedVibrationEffect.startSequential()
+ assertEquals(Long.MAX_VALUE, CombinedVibration.startSequential()
.addNext(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addNext(2,
VibrationEffect.createWaveform(new long[]{1, 2, 3}, new int[]{1, 2, 3}, 0))
@@ -176,7 +176,7 @@
@Test
public void testHasVibratorMono_returnsTrueForAnyVibrator() {
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
assertTrue(effect.hasVibrator(0));
assertTrue(effect.hasVibrator(1));
@@ -184,7 +184,7 @@
@Test
public void testHasVibratorStereo_returnsOnlyTheIdsSet() {
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.combine();
assertFalse(effect.hasVibrator(0));
@@ -194,9 +194,9 @@
@Test
public void testHasVibratorSequential_returnsNestedVibrators() {
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSequential()
+ CombinedVibration effect = CombinedVibration.startSequential()
.addNext(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
- .addNext(CombinedVibrationEffect.startSynced()
+ .addNext(CombinedVibration.startParallel()
.addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine())
.combine();
@@ -207,18 +207,18 @@
@Test
public void testSerializationMono() {
- CombinedVibrationEffect original = CombinedVibrationEffect.createSynced(VALID_EFFECT);
+ CombinedVibration original = CombinedVibration.createParallel(VALID_EFFECT);
Parcel parcel = Parcel.obtain();
original.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
- CombinedVibrationEffect restored = CombinedVibrationEffect.CREATOR.createFromParcel(parcel);
+ CombinedVibration restored = CombinedVibration.CREATOR.createFromParcel(parcel);
assertEquals(original, restored);
}
@Test
public void testSerializationStereo() {
- CombinedVibrationEffect original = CombinedVibrationEffect.startSynced()
+ CombinedVibration original = CombinedVibration.startParallel()
.addVibrator(0, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(1, VibrationEffect.createOneShot(10, 255))
.combine();
@@ -226,22 +226,22 @@
Parcel parcel = Parcel.obtain();
original.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
- CombinedVibrationEffect restored = CombinedVibrationEffect.CREATOR.createFromParcel(parcel);
+ CombinedVibration restored = CombinedVibration.CREATOR.createFromParcel(parcel);
assertEquals(original, restored);
}
@Test
public void testSerializationSequential() {
- CombinedVibrationEffect original = CombinedVibrationEffect.startSequential()
+ CombinedVibration original = CombinedVibration.startSequential()
.addNext(0, VALID_EFFECT)
- .addNext(CombinedVibrationEffect.createSynced(VALID_EFFECT))
+ .addNext(CombinedVibration.createParallel(VALID_EFFECT))
.addNext(0, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), 100)
.combine();
Parcel parcel = Parcel.obtain();
original.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
- CombinedVibrationEffect restored = CombinedVibrationEffect.CREATOR.createFromParcel(parcel);
+ CombinedVibration restored = CombinedVibration.CREATOR.createFromParcel(parcel);
assertEquals(original, restored);
}
}
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index 1a86678..c1e72fe 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -228,6 +228,27 @@
}
@Test
+ public void testCopyFileWithAppend() throws Exception {
+ final File src = new File(mTarget, "src");
+ final File dest = new File(mTarget, "dest");
+
+ byte[] expected = new byte[10];
+ byte[] actual = new byte[10];
+ new Random().nextBytes(expected);
+ writeFile(src, expected);
+
+ try (FileInputStream in = new FileInputStream(src);
+ FileOutputStream out = new FileOutputStream(dest, true /* append */)) {
+ // sendfile(2) fails if output fd is opened with O_APPEND, but FileUtils#copy should
+ // fallback to userspace copy
+ FileUtils.copy(in, out);
+ }
+
+ actual = readFile(dest);
+ assertArrayEquals(expected, actual);
+ }
+
+ @Test
public void testIsFilenameSafe() throws Exception {
assertTrue(FileUtils.isFilenameSafe(new File("foobar")));
assertTrue(FileUtils.isFilenameSafe(new File("a_b-c=d.e/0,1+23")));
@@ -577,7 +598,6 @@
final File validVideoCameraDir = new File(cameraDir, "validVideo-" + nonce + ".mp4");
final File validImageCameraDir = new File(cameraDir, "validImage-" + nonce + ".jpg");
- final File invalidVideoCameraDir = new File(cameraDir, ".invalidVideo-" + nonce + ".mp4");
final File validVideoNonCameraDir = new File(nonCameraDir, "validVideo-" + nonce + ".mp4");
final File validImageNonCameraDir = new File(nonCameraDir, "validImage-" + nonce + ".jpg");
@@ -589,9 +609,6 @@
FileDescriptor pfdValidImageCameraDir =
ParcelFileDescriptor.open(validImageCameraDir,
MODE_CREATE | MODE_READ_WRITE).getFileDescriptor();
- FileDescriptor pfdInvalidVideoCameraDir =
- ParcelFileDescriptor.open(invalidVideoCameraDir,
- MODE_CREATE | MODE_READ_WRITE).getFileDescriptor();
FileDescriptor pfdValidVideoNonCameraDir =
ParcelFileDescriptor.open(validVideoNonCameraDir,
@@ -603,13 +620,11 @@
assertNotNull(convertToModernFd(pfdValidVideoCameraDir));
assertNull(convertToModernFd(pfdValidImageCameraDir));
- assertNull(convertToModernFd(pfdInvalidVideoCameraDir));
assertNull(convertToModernFd(pfdValidVideoNonCameraDir));
assertNull(convertToModernFd(pfdValidImageNonCameraDir));
} finally {
validVideoCameraDir.delete();
validImageCameraDir.delete();
- invalidVideoCameraDir.delete();
validVideoNonCameraDir.delete();
validImageNonCameraDir.delete();
}
diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
new file mode 100644
index 0000000..7dea82d
--- /dev/null
+++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.os.PerformanceHintManager.Session;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class PerformanceHintManagerTest {
+ private static final long RATE_1000 = 1000L;
+ private static final long TARGET_166 = 166L;
+ private static final long DEFAULT_TARGET_NS = 16666666L;
+ private PerformanceHintManager mPerformanceHintManager;
+
+ @Mock
+ private IHintSession mIHintSessionMock;
+
+ @Before
+ public void setUp() {
+ mPerformanceHintManager =
+ InstrumentationRegistry.getInstrumentation().getContext().getSystemService(
+ PerformanceHintManager.class);
+ MockitoAnnotations.initMocks(this);
+ }
+
+ private Session createSession() {
+ return mPerformanceHintManager.createHintSession(
+ new int[]{Process.myPid()}, DEFAULT_TARGET_NS);
+ }
+
+ @Test
+ public void testCreateHintSession() {
+ Session a = createSession();
+ Session b = createSession();
+ if (a == null) {
+ assertNull(b);
+ } else {
+ assertNotEquals(a, b);
+ }
+ }
+
+ @Test
+ public void testGetPreferredUpdateRateNanos() {
+ if (createSession() != null) {
+ assertTrue(mPerformanceHintManager.getPreferredUpdateRateNanos() > 0);
+ } else {
+ assertEquals(-1, mPerformanceHintManager.getPreferredUpdateRateNanos());
+ }
+ }
+
+ @Test
+ public void testUpdateTargetWorkDuration() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(100);
+ }
+
+ @Test
+ public void testUpdateTargetWorkDurationWithNegativeDuration() {
+ Session s = createSession();
+ assumeNotNull(s);
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.updateTargetWorkDuration(-1);
+ });
+ }
+
+ @Test
+ public void testReportActualWorkDuration() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(100);
+ s.reportActualWorkDuration(1);
+ s.reportActualWorkDuration(100);
+ s.reportActualWorkDuration(1000);
+ }
+
+ @Test
+ public void testReportActualWorkDurationWithIllegalArgument() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(100);
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(-1);
+ });
+ }
+
+ @Test
+ public void testRateLimitWithDurationFastEnough() throws Exception {
+ FakeClock fakeClock = new FakeClock();
+ Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166);
+
+ reset(mIHintSessionMock);
+ fakeClock.setNow(0);
+ s.updateTargetWorkDuration(TARGET_166);
+
+ s.reportActualWorkDuration(TARGET_166 - 1);
+ s.reportActualWorkDuration(TARGET_166);
+ // we should not see update as the rate should be 10X for over-perform case.
+ verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any());
+ fakeClock.incrementClock(10 * RATE_1000);
+ s.reportActualWorkDuration(TARGET_166);
+ verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any());
+ fakeClock.incrementClock(1);
+ s.reportActualWorkDuration(TARGET_166);
+ // we should see update after rate limit
+ verify(mIHintSessionMock, times(1)).reportActualWorkDuration(
+ eq(new long[] {TARGET_166 - 1, TARGET_166, TARGET_166, TARGET_166}),
+ eq(new long[] {0, 0, 10 * RATE_1000, 10 * RATE_1000 + 1}));
+
+ reset(mIHintSessionMock);
+ s.reportActualWorkDuration(TARGET_166);
+ s.reportActualWorkDuration(TARGET_166 - 1);
+ s.reportActualWorkDuration(TARGET_166 - 2);
+ // we should not see update as the rate should be 10X for over-perform case.
+ verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any());
+ fakeClock.incrementClock(10 * RATE_1000 + 1);
+ s.reportActualWorkDuration(TARGET_166);
+ s.reportActualWorkDuration(TARGET_166 - 1);
+ // we should see update now
+ verify(mIHintSessionMock, times(1)).reportActualWorkDuration(
+ eq(new long[] {TARGET_166, TARGET_166 - 1, TARGET_166 - 2, TARGET_166}),
+ eq(new long[] {10 * RATE_1000 + 1, 10 * RATE_1000 + 1, 10 * RATE_1000 + 1,
+ (10 * RATE_1000 + 1) * 2}));
+ }
+
+ @Test
+ public void testRateLimitWithDurationTooSlow() throws Exception {
+ FakeClock fakeClock = new FakeClock();
+ Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166);
+
+ reset(mIHintSessionMock);
+ fakeClock.setNow(0);
+ s.updateTargetWorkDuration(TARGET_166);
+
+ verify(mIHintSessionMock, times(1)).updateTargetWorkDuration(eq(TARGET_166));
+ // shouldn't update before rate limit
+ s.reportActualWorkDuration(TARGET_166 + 1);
+ verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any());
+
+ // shouldn't update when the time is exactly at rate limit
+ fakeClock.incrementClock(RATE_1000);
+ s.reportActualWorkDuration(TARGET_166 + 1);
+ verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any());
+
+ // should be ready for sending hint
+ fakeClock.incrementClock(1);
+ s.reportActualWorkDuration(TARGET_166 + 1);
+ verify(mIHintSessionMock, times(1)).reportActualWorkDuration(
+ eq(new long[] {TARGET_166 + 1, TARGET_166 + 1, TARGET_166 + 1}),
+ eq(new long[] {0 , RATE_1000, RATE_1000 + 1}));
+ }
+
+ @Test
+ public void testCloseHintSession() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.close();
+ }
+
+ private static class FakeClock implements PerformanceHintManager.NanoClock {
+ private long mCurrentTime = 0L;
+
+ @Override
+ public long nanos() {
+ return mCurrentTime;
+ }
+
+ public void setNow(long nanos) {
+ mCurrentTime = nanos;
+ }
+
+ public void incrementClock(long nanos) {
+ mCurrentTime += nanos;
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/os/VibratorInfoTest.java b/core/tests/coretests/src/android/os/VibratorInfoTest.java
index 2521f75..3a80464 100644
--- a/core/tests/coretests/src/android/os/VibratorInfoTest.java
+++ b/core/tests/coretests/src/android/os/VibratorInfoTest.java
@@ -35,6 +35,7 @@
public class VibratorInfoTest {
private static final float TEST_TOLERANCE = 1e-5f;
+ private static final int TEST_VIBRATOR_ID = 1;
private static final float TEST_MIN_FREQUENCY = 50;
private static final float TEST_RESONANT_FREQUENCY = 150;
private static final float TEST_FREQUENCY_RESOLUTION = 25;
@@ -50,9 +51,9 @@
@Test
public void testHasAmplitudeControl() {
- VibratorInfo noCapabilities = new InfoBuilder().build();
+ VibratorInfo noCapabilities = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
assertFalse(noCapabilities.hasAmplitudeControl());
- VibratorInfo composeAndAmplitudeControl = new InfoBuilder()
+ VibratorInfo composeAndAmplitudeControl = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS
| IVibrator.CAP_AMPLITUDE_CONTROL)
.build();
@@ -61,7 +62,7 @@
@Test
public void testHasCapabilities() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
.build();
assertTrue(info.hasCapability(IVibrator.CAP_COMPOSE_EFFECTS));
@@ -70,8 +71,8 @@
@Test
public void testIsEffectSupported() {
- VibratorInfo noEffects = new InfoBuilder().build();
- VibratorInfo canClick = new InfoBuilder()
+ VibratorInfo noEffects = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
+ VibratorInfo canClick = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setSupportedEffects(VibrationEffect.EFFECT_CLICK)
.build();
assertEquals(Vibrator.VIBRATION_EFFECT_SUPPORT_UNKNOWN,
@@ -84,7 +85,7 @@
@Test
public void testIsPrimitiveSupported() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
.setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
.build();
@@ -92,7 +93,7 @@
assertFalse(info.isPrimitiveSupported(VibrationEffect.Composition.PRIMITIVE_TICK));
// Returns false when there is no compose capability.
- info = new InfoBuilder()
+ info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
.build();
assertFalse(info.isPrimitiveSupported(VibrationEffect.Composition.PRIMITIVE_CLICK));
@@ -100,9 +101,10 @@
@Test
public void testGetDefaultBraking_returnsFirstSupportedBraking() {
- assertEquals(Braking.NONE, new InfoBuilder().build().getDefaultBraking());
+ assertEquals(Braking.NONE, new VibratorInfo.Builder(
+ TEST_VIBRATOR_ID).build().getDefaultBraking());
assertEquals(Braking.CLAB,
- new InfoBuilder()
+ new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setSupportedBraking(Braking.NONE, Braking.CLAB)
.build()
.getDefaultBraking());
@@ -111,33 +113,34 @@
@Test
public void testGetFrequencyRange_invalidFrequencyMappingReturnsEmptyRange() {
// Invalid, contains NaN values or empty array.
- assertEquals(Range.create(0f, 0f), new InfoBuilder().build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(
+ TEST_VIBRATOR_ID).build().getFrequencyRange());
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
Float.NaN, 150, 25, 50, TEST_AMPLITUDE_MAP))
.build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
50, Float.NaN, 25, 50, TEST_AMPLITUDE_MAP))
.build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
50, 150, Float.NaN, 50, TEST_AMPLITUDE_MAP))
.build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
50, 150, 25, Float.NaN, TEST_AMPLITUDE_MAP))
.build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(50, 150, 25, 50, null))
.build().getFrequencyRange());
// Invalid, minFrequency > resonantFrequency
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
/* minFrequencyHz= */ 250, /* resonantFrequency= */ 150, 25, 50, null))
.build().getFrequencyRange());
// Invalid, maxFrequency < resonantFrequency by changing resolution.
- assertEquals(Range.create(0f, 0f), new InfoBuilder()
+ assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
50, 150, /* frequencyResolutionHz= */10, 50, null))
.build().getFrequencyRange());
@@ -145,7 +148,7 @@
@Test
public void testGetFrequencyRange_safeRangeLimitedByMaxFrequency() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
/* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
/* frequencyResolutionHz= */ 25, /* suggestedSafeRangeHz= */ 200,
@@ -159,7 +162,7 @@
@Test
public void testGetFrequencyRange_safeRangeLimitedByMinFrequency() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
/* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
/* frequencyResolutionHz= */ 50, /* suggestedSafeRangeHz= */ 200,
@@ -173,7 +176,7 @@
@Test
public void testGetFrequencyRange_validMappingReturnsFullRelativeRange() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
/* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
/* frequencyResolutionHz= */ 50, /* suggestedSafeRangeHz= */ 100,
@@ -187,7 +190,7 @@
@Test
public void testAbsoluteFrequency_emptyMappingReturnsNaN() {
- VibratorInfo info = new InfoBuilder().build();
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
assertTrue(Float.isNaN(info.getAbsoluteFrequency(-1)));
assertTrue(Float.isNaN(info.getAbsoluteFrequency(0)));
assertTrue(Float.isNaN(info.getAbsoluteFrequency(1)));
@@ -195,7 +198,8 @@
@Test
public void testAbsoluteFrequency_validRangeReturnsOriginalValue() {
- VibratorInfo info = new InfoBuilder().setFrequencyMapping(TEST_FREQUENCY_MAPPING).build();
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).setFrequencyMapping(
+ TEST_FREQUENCY_MAPPING).build();
assertEquals(TEST_RESONANT_FREQUENCY, info.getAbsoluteFrequency(0), TEST_TOLERANCE);
// Safe range [-1, 1] = [125Hz, 175Hz] defined by suggested safe range 100Hz
@@ -213,7 +217,7 @@
@Test
public void testGetMaxAmplitude_emptyMappingReturnsOnlyResonantFrequency() {
- VibratorInfo info = new InfoBuilder().build();
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
assertEquals(1f, info.getMaxAmplitude(0), TEST_TOLERANCE);
assertEquals(0f, info.getMaxAmplitude(0.1f), TEST_TOLERANCE);
assertEquals(0f, info.getMaxAmplitude(-1), TEST_TOLERANCE);
@@ -221,7 +225,7 @@
@Test
public void testGetMaxAmplitude_validMappingReturnsMappedValues() {
- VibratorInfo info = new InfoBuilder()
+ VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(/* minFrequencyHz= */ 50,
/* resonantFrequencyHz= */ 150, /* frequencyResolutionHz= */ 25,
/* suggestedSafeRangeHz= */ 50, TEST_AMPLITUDE_MAP))
@@ -243,8 +247,7 @@
@Test
public void testEquals() {
- InfoBuilder completeBuilder = new InfoBuilder()
- .setId(1)
+ VibratorInfo.Builder completeBuilder = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL)
.setSupportedEffects(VibrationEffect.EFFECT_CLICK)
.setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
@@ -298,9 +301,8 @@
.build();
assertNotEquals(complete, completeWithDifferentQFactor);
- VibratorInfo empty = new InfoBuilder().setId(1).build();
- VibratorInfo emptyWithKnownSupport = new InfoBuilder()
- .setId(1)
+ VibratorInfo empty = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
+ VibratorInfo emptyWithKnownSupport = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setSupportedEffects()
.setSupportedPrimitives()
.build();
@@ -309,8 +311,7 @@
@Test
public void testParceling() {
- VibratorInfo original = new InfoBuilder()
- .setId(1)
+ VibratorInfo original = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
.setSupportedEffects(VibrationEffect.EFFECT_CLICK)
.setSupportedPrimitives(null)
@@ -324,54 +325,4 @@
VibratorInfo restored = VibratorInfo.CREATOR.createFromParcel(parcel);
assertEquals(original, restored);
}
-
- private static class InfoBuilder {
- private int mId = 0;
- private int mCapabilities = 0;
- private int[] mSupportedEffects = null;
- private int[] mSupportedBraking = null;
- private int[] mSupportedPrimitives = null;
- private float mQFactor = Float.NaN;
- private VibratorInfo.FrequencyMapping mFrequencyMapping = EMPTY_FREQUENCY_MAPPING;
-
- public InfoBuilder setId(int id) {
- mId = id;
- return this;
- }
-
- public InfoBuilder setCapabilities(int capabilities) {
- mCapabilities = capabilities;
- return this;
- }
-
- public InfoBuilder setSupportedEffects(int... supportedEffects) {
- mSupportedEffects = supportedEffects;
- return this;
- }
-
- public InfoBuilder setSupportedBraking(int... supportedBraking) {
- mSupportedBraking = supportedBraking;
- return this;
- }
-
- public InfoBuilder setSupportedPrimitives(int... supportedPrimitives) {
- mSupportedPrimitives = supportedPrimitives;
- return this;
- }
-
- public InfoBuilder setQFactor(float qFactor) {
- mQFactor = qFactor;
- return this;
- }
-
- public InfoBuilder setFrequencyMapping(VibratorInfo.FrequencyMapping frequencyMapping) {
- mFrequencyMapping = frequencyMapping;
- return this;
- }
-
- public VibratorInfo build() {
- return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
- mSupportedPrimitives, mQFactor, mFrequencyMapping);
- }
- }
}
diff --git a/core/tests/coretests/src/android/os/VibratorTest.java b/core/tests/coretests/src/android/os/VibratorTest.java
index 575a1be..6213285 100644
--- a/core/tests/coretests/src/android/os/VibratorTest.java
+++ b/core/tests/coretests/src/android/os/VibratorTest.java
@@ -55,6 +55,11 @@
}
@Test
+ public void getId_returnsDefaultId() {
+ assertEquals(-1, mVibratorSpy.getId());
+ }
+
+ @Test
public void areEffectsSupported_returnsArrayOfSameSize() {
assertEquals(0, mVibratorSpy.areEffectsSupported(new int[0]).length);
assertEquals(1,
diff --git a/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java b/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java
deleted file mode 100644
index 777bda9..0000000
--- a/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.service.timezone;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.reflect.Field;
-
-/** Utility methods related to {@link Parcelable} objects used in several tests. */
-final class ParcelableTestSupport {
-
- private ParcelableTestSupport() {}
-
- /** Returns the result of parceling and unparceling the argument. */
- @SuppressWarnings("unchecked")
- public static <T extends Parcelable> T roundTripParcelable(T parcelable) {
- Parcel parcel = Parcel.obtain();
- parcel.writeTypedObject(parcelable, 0);
- parcel.setDataPosition(0);
-
- Parcelable.Creator<T> creator;
- try {
- Field creatorField = parcelable.getClass().getField("CREATOR");
- creator = (Parcelable.Creator<T>) creatorField.get(null);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new AssertionError(e);
- }
- T toReturn = parcel.readTypedObject(creator);
- parcel.recycle();
- return toReturn;
- }
-
- public static <T extends Parcelable> void assertRoundTripParcelable(T instance) {
- assertEquals(instance, roundTripParcelable(instance));
- }
-}
diff --git a/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java b/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java
deleted file mode 100644
index f805555..0000000
--- a/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.service.timezone;
-
-import static android.service.timezone.ParcelableTestSupport.assertRoundTripParcelable;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import static java.util.Collections.singletonList;
-
-import org.junit.Test;
-
-import java.util.List;
-
-public class TimeZoneProviderSuggestionTest {
-
- private static final long ARBITRARY_ELAPSED_REALTIME_MILLIS = 9999;
-
- private static final List<String> ARBITRARY_TIME_ZONE_IDS = singletonList("Europe/London");
-
- @Test(expected = RuntimeException.class)
- public void testInvalidTimeZoneIds() {
- new TimeZoneProviderSuggestion.Builder()
- .setTimeZoneIds(null);
- }
-
- @Test
- public void testEquals() {
- TimeZoneProviderSuggestion.Builder builder1 = new TimeZoneProviderSuggestion.Builder()
- .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- assertEquals(one, one);
- }
-
- TimeZoneProviderSuggestion.Builder builder2 = new TimeZoneProviderSuggestion.Builder()
- .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- TimeZoneProviderSuggestion two = builder2.build();
- assertEquals(one, two);
- assertEquals(two, one);
- }
-
- builder1.setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS + 1);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- TimeZoneProviderSuggestion two = builder2.build();
- assertNotEquals(one, two);
- assertNotEquals(two, one);
- }
-
- builder2.setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS + 1);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- TimeZoneProviderSuggestion two = builder2.build();
- assertEquals(one, two);
- assertEquals(two, one);
- }
-
- builder2.setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- TimeZoneProviderSuggestion two = builder2.build();
- assertNotEquals(one, two);
- assertNotEquals(two, one);
- }
-
- builder1.setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
- {
- TimeZoneProviderSuggestion one = builder1.build();
- TimeZoneProviderSuggestion two = builder2.build();
- assertEquals(one, two);
- assertEquals(two, one);
- }
- }
-
- @Test
- public void testParcelable_noTimeZoneIds() {
- TimeZoneProviderSuggestion.Builder builder = new TimeZoneProviderSuggestion.Builder()
- .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
- assertRoundTripParcelable(builder.build());
- }
-
- @Test
- public void testParcelable_withTimeZoneIds() {
- TimeZoneProviderSuggestion.Builder builder = new TimeZoneProviderSuggestion.Builder()
- .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS)
- .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
- assertRoundTripParcelable(builder.build());
- }
-}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
index ab24f89..7e1e7f4 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
@@ -33,9 +33,6 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import java.util.Arrays;
-import java.util.List;
-
/**
* Tests for AccessibilityInteractionClient
*/
@@ -65,7 +62,7 @@
final long accessibilityNodeId = 0x4321L;
AccessibilityNodeInfo nodeFromConnection = AccessibilityNodeInfo.obtain();
nodeFromConnection.setSourceNodeId(accessibilityNodeId, windowId);
- mMockConnection.mInfosToReturn = Arrays.asList(nodeFromConnection);
+ mMockConnection.mInfoToReturn = nodeFromConnection;
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
AccessibilityNodeInfo node = client.findAccessibilityNodeInfoByAccessibilityId(
MOCK_CONNECTION_ID, windowId, accessibilityNodeId, true, 0, null);
@@ -75,7 +72,7 @@
}
private static class MockConnection extends AccessibilityServiceConnectionImpl {
- List<AccessibilityNodeInfo> mInfosToReturn;
+ AccessibilityNodeInfo mInfoToReturn;
@Override
public String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId,
@@ -83,7 +80,7 @@
IAccessibilityInteractionConnectionCallback callback, int flags, long threadId,
Bundle arguments) {
try {
- callback.setFindAccessibilityNodeInfosResult(mInfosToReturn, interactionId);
+ callback.setFindAccessibilityNodeInfoResult(mInfoToReturn, interactionId);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
diff --git a/core/tests/coretests/src/android/window/WindowContextControllerTest.java b/core/tests/coretests/src/android/window/WindowContextControllerTest.java
index e4fc19c..020f4a0 100644
--- a/core/tests/coretests/src/android/window/WindowContextControllerTest.java
+++ b/core/tests/coretests/src/android/window/WindowContextControllerTest.java
@@ -60,34 +60,39 @@
mMockWms = mock(IWindowManager.class);
mController = new WindowContextController(new Binder(), mMockWms);
- doReturn(true).when(mMockWms).registerWindowContextListener(
- any(), anyInt(), anyInt(), any());
+ doReturn(true).when(mMockWms).attachWindowContextToDisplayArea(any(), anyInt(),
+ anyInt(), any());
}
- @Test(expected = UnsupportedOperationException.class)
- public void testRegisterListenerTwiceThrowException() {
- mController.registerListener(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
+ @Test(expected = IllegalStateException.class)
+ public void testAttachToDisplayAreaTwiceThrowException() {
+ mController.attachToDisplayArea(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
null /* options */);
- mController.registerListener(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
+ mController.attachToDisplayArea(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
null /* options */);
}
@Test
- public void testUnregisterListenerIfNeeded_NotRegisteredYet_DoNothing() throws Exception {
- mController.unregisterListenerIfNeeded();
+ public void testDetachIfNeeded_NotAttachedYet_DoNothing() throws Exception {
+ mController.detachIfNeeded();
- verify(mMockWms, never()).registerWindowContextListener(any(), anyInt(), anyInt(), any());
+ verify(mMockWms, never()).detachWindowContextFromWindowContainer(any());
}
@Test
- public void testRegisterAndUnRegisterListener() {
- mController.registerListener(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
+ public void testAttachAndDetachDisplayArea() {
+ mController.attachToDisplayArea(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
null /* options */);
- assertThat(mController.mListenerRegistered).isTrue();
+ assertThat(mController.mAttachedToDisplayArea).isTrue();
- mController.unregisterListenerIfNeeded();
+ mController.detachIfNeeded();
- assertThat(mController.mListenerRegistered).isFalse();
+ assertThat(mController.mAttachedToDisplayArea).isFalse();
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testAttachToWindowTokenBeforeAttachingToDAThrowException() {
+ mController.attachToWindowToken(new Binder());
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
index 5334a45..7890168 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -934,7 +934,7 @@
bcs.elapsedTime += 20;
bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
- assertEquals(1, bcs.getLatencyObserver().getLatencySamples().size());
+ assertEquals(1, bcs.getLatencyObserver().getLatencyHistograms().size());
}
@Test
@@ -948,7 +948,7 @@
bcs.elapsedTime += 20;
bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
- assertEquals(0, bcs.getLatencyObserver().getLatencySamples().size());
+ assertEquals(0, bcs.getLatencyObserver().getLatencyHistograms().size());
}
private static class TestHandler extends Handler {
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderLatencyBucketsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderLatencyBucketsTest.java
new file mode 100644
index 0000000..b2054f1
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BinderLatencyBucketsTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@Presubmit
+public class BinderLatencyBucketsTest {
+ @Test
+ public void testBucketThresholds() {
+ BinderLatencyBuckets latencyBuckets = new BinderLatencyBuckets(10, 2, 1.45f);
+ assertThat(latencyBuckets.getBuckets())
+ .asList()
+ .containsExactly(2, 3, 4, 6, 8, 12, 18, 26, 39)
+ .inOrder();
+ }
+
+ @Test
+ public void testSampleAssignment() {
+ BinderLatencyBuckets latencyBuckets = new BinderLatencyBuckets(10, 2, 1.45f);
+ assertEquals(0, latencyBuckets.sampleToBucket(0));
+ assertEquals(0, latencyBuckets.sampleToBucket(1));
+ assertEquals(1, latencyBuckets.sampleToBucket(2));
+ assertEquals(2, latencyBuckets.sampleToBucket(3));
+ assertEquals(3, latencyBuckets.sampleToBucket(4));
+ assertEquals(5, latencyBuckets.sampleToBucket(9));
+ assertEquals(6, latencyBuckets.sampleToBucket(13));
+ assertEquals(7, latencyBuckets.sampleToBucket(25));
+ assertEquals(9, latencyBuckets.sampleToBucket(100));
+ }
+
+ @Test
+ public void testMaxIntBuckets() {
+ BinderLatencyBuckets latencyBuckets = new BinderLatencyBuckets(5, Integer.MAX_VALUE / 2, 2);
+ assertThat(latencyBuckets.getBuckets())
+ .asList()
+ .containsExactly(Integer.MAX_VALUE / 2, Integer.MAX_VALUE - 1)
+ .inOrder();
+
+ assertEquals(0, latencyBuckets.sampleToBucket(0));
+ assertEquals(0, latencyBuckets.sampleToBucket(Integer.MAX_VALUE / 2 - 1));
+ assertEquals(1, latencyBuckets.sampleToBucket(Integer.MAX_VALUE - 2));
+ assertEquals(2, latencyBuckets.sampleToBucket(Integer.MAX_VALUE));
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
index 36915a2..f65fb95 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
@@ -33,7 +33,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
@@ -44,6 +43,7 @@
@Test
public void testLatencyCollectionWithMultipleClasses() {
TestBinderLatencyObserver blo = new TestBinderLatencyObserver();
+ blo.setHistogramBucketsParams(5, 5, 1.125f);
Binder binder = new Binder();
CallSession callSession = new CallSession();
@@ -51,20 +51,24 @@
callSession.transactionCode = 1;
blo.callEnded(callSession);
blo.callEnded(callSession);
+ blo.callEnded(callSession);
callSession.transactionCode = 2;
blo.callEnded(callSession);
+ blo.callEnded(callSession);
- ArrayMap<LatencyDims, ArrayList<Long>> latencySamples = blo.getLatencySamples();
- assertEquals(2, latencySamples.keySet().size());
- assertThat(latencySamples.get(new LatencyDims(binder.getClass(), 1)))
- .containsExactlyElementsIn(Arrays.asList(1L, 2L));
- assertThat(latencySamples.get(new LatencyDims(binder.getClass(), 2))).containsExactly(3L);
+ ArrayMap<LatencyDims, int[]> latencyHistograms = blo.getLatencyHistograms();
+ assertEquals(2, latencyHistograms.keySet().size());
+ assertThat(latencyHistograms.get(new LatencyDims(binder.getClass(), 1)))
+ .asList().containsExactly(2, 0, 1, 0, 0).inOrder();
+ assertThat(latencyHistograms.get(new LatencyDims(binder.getClass(), 2)))
+ .asList().containsExactly(0, 0, 0, 0, 2).inOrder();
}
@Test
public void testSampling() {
TestBinderLatencyObserver blo = new TestBinderLatencyObserver();
blo.setSamplingInterval(2);
+ blo.setHistogramBucketsParams(5, 5, 1.125f);
Binder binder = new Binder();
CallSession callSession = new CallSession();
@@ -74,17 +78,58 @@
callSession.transactionCode = 2;
blo.callEnded(callSession);
- ArrayMap<LatencyDims, ArrayList<Long>> latencySamples = blo.getLatencySamples();
- assertEquals(1, latencySamples.size());
- LatencyDims dims = latencySamples.keySet().iterator().next();
+ ArrayMap<LatencyDims, int[]> latencyHistograms = blo.getLatencyHistograms();
+ assertEquals(1, latencyHistograms.size());
+ LatencyDims dims = latencyHistograms.keySet().iterator().next();
assertEquals(binder.getClass(), dims.getBinderClass());
assertEquals(1, dims.getTransactionCode());
- ArrayList<Long> values = latencySamples.get(dims);
- assertThat(values).containsExactly(1L);
+ assertThat(latencyHistograms.get(dims)).asList().containsExactly(1, 0, 0, 0, 0).inOrder();
+ }
+
+ @Test
+ public void testTooCallLengthOverflow() {
+ TestBinderLatencyObserver blo = new TestBinderLatencyObserver();
+ blo.setElapsedTime(2L + (long) Integer.MAX_VALUE);
+ blo.setHistogramBucketsParams(5, 5, 1.125f);
+
+ Binder binder = new Binder();
+ CallSession callSession = new CallSession();
+ callSession.binderClass = binder.getClass();
+ callSession.transactionCode = 1;
+ blo.callEnded(callSession);
+
+ // The long call should be capped to maxint (to not overflow) and placed in the last bucket.
+ assertThat(blo.getLatencyHistograms()
+ .get(new LatencyDims(binder.getClass(), 1)))
+ .asList().containsExactly(0, 0, 0, 0, 1)
+ .inOrder();
+ }
+
+ @Test
+ public void testHistogramBucketOverflow() {
+ TestBinderLatencyObserver blo = new TestBinderLatencyObserver();
+ blo.setHistogramBucketsParams(3, 5, 1.125f);
+
+ Binder binder = new Binder();
+ CallSession callSession = new CallSession();
+ callSession.binderClass = binder.getClass();
+ callSession.transactionCode = 1;
+ blo.callEnded(callSession);
+
+ LatencyDims dims = new LatencyDims(binder.getClass(), 1);
+ // Fill the buckets with maxint.
+ Arrays.fill(blo.getLatencyHistograms().get(dims), Integer.MAX_VALUE);
+ assertThat(blo.getLatencyHistograms().get(dims))
+ .asList().containsExactly(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ // Try to add another sample.
+ blo.callEnded(callSession);
+ // Make sure the buckets don't overflow.
+ assertThat(blo.getLatencyHistograms().get(dims))
+ .asList().containsExactly(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
}
public static class TestBinderLatencyObserver extends BinderLatencyObserver {
- private long mElapsedTimeCallCount = 0;
+ private long mElapsedTime = 0;
TestBinderLatencyObserver() {
// Make random generator not random.
@@ -104,7 +149,12 @@
@Override
protected long getElapsedRealtimeMicro() {
- return ++mElapsedTimeCallCount;
+ mElapsedTime += 2;
+ return mElapsedTime;
+ }
+
+ public void setElapsedTime(long time) {
+ mElapsedTime = time;
}
}
}
diff --git a/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java b/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java
index 0808186..269d842 100644
--- a/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java
+++ b/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java
@@ -298,7 +298,8 @@
null /* pendingResults */, null /* pendingNewIntents */,
null /* activityOptions */, true /* isForward */, null /* profilerInfo */,
mThread /* client */, null /* asssitToken */,
- null /* fixedRotationAdjustments */, null /* shareableActivityToken */);
+ null /* fixedRotationAdjustments */, null /* shareableActivityToken */,
+ false /* launchedFromBubble */);
}
@Override
diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp
index 8991a61..084e1db 100644
--- a/data/etc/car/Android.bp
+++ b/data/etc/car/Android.bp
@@ -102,13 +102,6 @@
}
prebuilt_etc {
- name: "allowed_privapp_com.android.car.secondaryhome",
- sub_dir: "permissions",
- src: "com.android.car.secondaryhome.xml",
- filename_from_src: true,
-}
-
-prebuilt_etc {
name: "allowed_privapp_com.android.car.settings",
sub_dir: "permissions",
src: "com.android.car.settings.xml",
diff --git a/data/etc/car/com.android.car.secondaryhome.xml b/data/etc/car/com.android.car.secondaryhome.xml
deleted file mode 100644
index a8af906..0000000
--- a/data/etc/car/com.android.car.secondaryhome.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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
- -->
-<permissions>
- <privapp-permissions package="com.android.car.secondaryhome">
- <!-- Required to launch app in ActivityView -->
- <permission name="android.permission.ACTIVITY_EMBEDDING"/>
- <!-- Required to send notification to current user-->
- <permission name="android.permission.MANAGE_USERS"/>
- <!-- Required for CarNotificationLib -->
- <permission name="android.permission.INTERACT_ACROSS_USERS"/>
- </privapp-permissions>
-</permissions>
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 1c11f95..71fc29b 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -284,7 +284,8 @@
<allow-in-power-save package="com.android.shell" />
<!-- Whitelist system providers -->
- <allow-in-power-save-except-idle package="com.android.providers.calendar" />
+ <!-- Calendar provider needs alarms while in idle -->
+ <allow-in-power-save package="com.android.providers.calendar" />
<allow-in-power-save-except-idle package="com.android.providers.contacts" />
<!-- The PAC proxy process must have network access, otherwise no app will
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 489da16..2fe8b28 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -506,6 +506,15 @@
<permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
<!-- Permission required for CTS test - CtsPermission5TestCases -->
<permission name="android.permission.RENOUNCE_PERMISSIONS" />
+ <permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
+ <permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" />
+ <permission name="android.permission.READ_LOGS" />
+ <permission name="android.permission.BRIGHTNESS_SLIDER_USAGE" />
+ <permission name="android.permission.ACCESS_AMBIENT_LIGHT_STATS" />
+ <permission name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS" />
+ <permission name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
+ <permission name="android.permission.SET_MEDIA_KEY_LISTENER" />
+ <permission name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index efeaf23..fec78f0 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -2029,12 +2029,6 @@
"group": "WM_DEBUG_WINDOW_ORGANIZER",
"at": "com\/android\/server\/wm\/TaskOrganizerController.java"
},
- "236210101": {
- "message": "registerWindowContextListener: trying to add listener to a non-existing display:%d",
- "level": "WARN",
- "group": "WM_ERROR",
- "at": "com\/android\/server\/wm\/WindowManagerService.java"
- },
"240271590": {
"message": "moveFocusableActivityToTop: unfocusable activity=%s",
"level": "DEBUG",
@@ -2473,6 +2467,12 @@
"group": "WM_DEBUG_SCREEN_ON",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "666937535": {
+ "message": "attachWindowContextToDisplayArea: trying to attach to a non-existing display:%d",
+ "level": "WARN",
+ "group": "WM_ERROR",
+ "at": "com\/android\/server\/wm\/WindowManagerService.java"
+ },
"674932310": {
"message": "Setting Intent of %s to target %s",
"level": "VERBOSE",
@@ -3307,6 +3307,12 @@
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimation.java"
},
+ "1789321832": {
+ "message": "Then token:%s is invalid. It might be removed",
+ "level": "WARN",
+ "group": "WM_ERROR",
+ "at": "com\/android\/server\/wm\/WindowManagerService.java"
+ },
"1789603530": {
"message": "Removing activity %s hasSavedState=%b stateNotNeeded=%s finishing=%b state=%s callers=%s",
"level": "INFO",
diff --git a/data/keyboards/Vendor_054c_Product_0ce6.kl b/data/keyboards/Vendor_054c_Product_0ce6.kl
new file mode 100644
index 0000000..4d51a9e
--- /dev/null
+++ b/data/keyboards/Vendor_054c_Product_0ce6.kl
@@ -0,0 +1,71 @@
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Sony Playstation(R) DualSense Controller
+#
+
+
+# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
+
+# Square
+key 0x134 BUTTON_X
+# Cross
+key 0x130 BUTTON_A
+# Circle
+key 0x131 BUTTON_B
+# Triangle
+key 0x133 BUTTON_Y
+
+key 0x136 BUTTON_L1
+key 0x137 BUTTON_R1
+key 0x138 BUTTON_L2
+key 0x139 BUTTON_R2
+
+# L2 axis
+axis 0x02 LTRIGGER
+# R2 axis
+axis 0x05 RTRIGGER
+
+# Left Analog Stick
+axis 0x00 X
+axis 0x01 Y
+# Right Analog Stick
+axis 0x03 Z
+axis 0x04 RZ
+
+# Left stick click
+key 0x13d BUTTON_THUMBL
+# Right stick click
+key 0x13e BUTTON_THUMBR
+
+# Hat
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
+# Share
+key 0x13a BUTTON_SELECT
+# Options
+key 0x13b BUTTON_START
+# PS key
+key 0x13c BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Vendor_0957_Product_0001.idc b/data/keyboards/Vendor_0957_Product_0001.idc
index 39479ce..c67e6d3 100644
--- a/data/keyboards/Vendor_0957_Product_0001.idc
+++ b/data/keyboards/Vendor_0957_Product_0001.idc
@@ -19,4 +19,5 @@
# Basic Parameters
keyboard.layout = Vendor_0957_Product_0001
+keyboard.doNotWakeByDefault = 1
audio.mic = 1
\ No newline at end of file
diff --git a/data/keyboards/Vendor_0957_Product_0001.kl b/data/keyboards/Vendor_0957_Product_0001.kl
index 90c0433d..672abef 100644
--- a/data/keyboards/Vendor_0957_Product_0001.kl
+++ b/data/keyboards/Vendor_0957_Product_0001.kl
@@ -47,7 +47,7 @@
key usage 0x000c01BB TV_INPUT
key usage 0x000c022A BOOKMARK
key usage 0x000c0096 SETTINGS
-key usage 0x000c0097 NOTIFICATION
+key usage 0x000c009F NOTIFICATION
key usage 0x000c008D GUIDE
key usage 0x000c0089 TV
key usage 0x000c009C CHANNEL_UP
diff --git a/data/keyboards/Vendor_248a_Product_8266.idc b/data/keyboards/Vendor_248a_Product_8266.idc
index 3021655..47ff9f8 100644
--- a/data/keyboards/Vendor_248a_Product_8266.idc
+++ b/data/keyboards/Vendor_248a_Product_8266.idc
@@ -21,4 +21,5 @@
# Due to a memory error on early prototypes of the reference remote control
# the VID/PID is mapped to 248a/8266 instead of 0957/0001
keyboard.layout = Vendor_0957_Product_0001
+keyboard.doNotWakeByDefault = 1
audio.mic = 1
\ No newline at end of file
diff --git a/graphics/java/android/graphics/FrameInfo.java b/graphics/java/android/graphics/FrameInfo.java
index 189be53..786c03b 100644
--- a/graphics/java/android/graphics/FrameInfo.java
+++ b/graphics/java/android/graphics/FrameInfo.java
@@ -87,18 +87,22 @@
// When the frame needs to be ready by
public static final int FRAME_DEADLINE = 9;
+ // When frame actually started.
+ public static final int FRAME_START_TIME = 10;
+
// Must be the last one
// This value must be in sync with `UI_THREAD_FRAME_INFO_SIZE` in FrameInfo.h
- private static final int FRAME_INFO_SIZE = FRAME_DEADLINE + 1;
+ private static final int FRAME_INFO_SIZE = FRAME_START_TIME + 1;
/** checkstyle */
public void setVsync(long intendedVsync, long usedVsync, long frameTimelineVsyncId,
- long frameDeadline) {
+ long frameDeadline, long frameStartTime) {
frameInfo[FRAME_TIMELINE_VSYNC_ID] = frameTimelineVsyncId;
frameInfo[INTENDED_VSYNC] = intendedVsync;
frameInfo[VSYNC] = usedVsync;
frameInfo[FLAGS] = 0;
frameInfo[FRAME_DEADLINE] = frameDeadline;
+ frameInfo[FRAME_START_TIME] = frameStartTime;
}
/** checkstyle */
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index 88cf96a..7589435 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -28,6 +28,7 @@
import android.hardware.display.DisplayManager;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
+import android.os.PerformanceHintManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
@@ -165,7 +166,7 @@
* to opaque with no light source configured.
*/
public HardwareRenderer() {
- ProcessInitializer.sInstance.initDisplayInfo();
+ ProcessInitializer.sInstance.initUsingContext();
mRootNode = RenderNode.adopt(nCreateRootRenderNode());
mRootNode.setClipToBounds(false);
mNativeProxy = nCreateProxy(!mOpaque, mRootNode.mNativeRenderNode);
@@ -365,7 +366,8 @@
*/
public @NonNull FrameRenderRequest setVsyncTime(long vsyncTime) {
// TODO(b/168552873): populate vsync Id once available to Choreographer public API
- mFrameInfo.setVsync(vsyncTime, vsyncTime, FrameInfo.INVALID_VSYNC_ID, Long.MAX_VALUE);
+ mFrameInfo.setVsync(vsyncTime, vsyncTime, FrameInfo.INVALID_VSYNC_ID, Long.MAX_VALUE,
+ vsyncTime);
mFrameInfo.addFlags(FrameInfo.FLAG_SURFACE_CANVAS);
return this;
}
@@ -835,6 +837,36 @@
callback.onPictureCaptured(picture);
}
+ /** called by native */
+ static PerformanceHintManager.Session createHintSession(int[] tids) {
+ PerformanceHintManager performanceHintManager =
+ ProcessInitializer.sInstance.getHintManager();
+ if (performanceHintManager == null) {
+ return null;
+ }
+ // Native code will always set a target duration before reporting actual durations.
+ // So this is just a placeholder value that's never used.
+ long targetDurationNanos = 16666667;
+ return performanceHintManager.createHintSession(tids, targetDurationNanos);
+ }
+
+ /** called by native */
+ static void updateTargetWorkDuration(PerformanceHintManager.Session session,
+ long targetDurationNanos) {
+ session.updateTargetWorkDuration(targetDurationNanos);
+ }
+
+ /** called by native */
+ static void reportActualWorkDuration(PerformanceHintManager.Session session,
+ long actualDurationNanos) {
+ session.reportActualWorkDuration(actualDurationNanos);
+ }
+
+ /** called by native */
+ static void closeHintSession(PerformanceHintManager.Session session) {
+ session.close();
+ }
+
/**
* Interface used to receive callbacks when a frame is being drawn.
*
@@ -1071,6 +1103,7 @@
private boolean mIsolated = false;
private Context mContext;
private String mPackageName;
+ private PerformanceHintManager mPerformanceHintManager;
private IGraphicsStats mGraphicsStatsService;
private IGraphicsStatsCallback mGraphicsStatsCallback = new IGraphicsStatsCallback.Stub() {
@Override
@@ -1082,6 +1115,10 @@
private ProcessInitializer() {
}
+ synchronized PerformanceHintManager getHintManager() {
+ return mPerformanceHintManager;
+ }
+
synchronized void setPackageName(String name) {
if (mInitialized) return;
mPackageName = name;
@@ -1127,15 +1164,23 @@
}
}
- synchronized void initDisplayInfo() {
- if (mDisplayInitialized) return;
+ synchronized void initUsingContext() {
if (mContext == null) return;
- // If we're in an isolated sandbox mode then we shouldn't try to communicate with DMS
+ initDisplayInfo();
+
+ // HintManager and HintSession are designed to be accessible from isoalted processes
+ // so not checking for isolated process here.
+ initHintSession();
+
+ // Defensively clear out the context in case we were passed a context that can leak
+ // if we live longer than it, e.g. an activity context.
+ mContext = null;
+ }
+
+ private void initDisplayInfo() {
+ if (mDisplayInitialized) return;
if (mIsolated) {
- // Defensively clear out the context in case we were passed a context that can leak
- // if we live longer than it, e.g. an activity context.
- mContext = null;
mDisplayInitialized = true;
return;
}
@@ -1167,11 +1212,14 @@
display.getRefreshRate(), wideColorDataspace.mNativeDataspace,
display.getAppVsyncOffsetNanos(), display.getPresentationDeadlineNanos());
- // Defensively clear out the context
- mContext = null;
mDisplayInitialized = true;
}
+ private void initHintSession() {
+ if (mContext == null) return;
+ mPerformanceHintManager = mContext.getSystemService(PerformanceHintManager.class);
+ }
+
private void rotateBuffer() {
nRotateProcessStatsBuffer();
requestBuffer();
diff --git a/libs/WindowManager/Shell/lint-baseline.xml b/libs/WindowManager/Shell/lint-baseline.xml
new file mode 100644
index 0000000..06094ff
--- /dev/null
+++ b/libs/WindowManager/Shell/lint-baseline.xml
@@ -0,0 +1,5471 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" return mRootTaskInfo != null ? mRootTaskInfo.taskId : INVALID_TASK_ID;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="73"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" return mTaskInfo1 != null ? mTaskInfo1.taskId : INVALID_TASK_ID;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="77"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" return mTaskInfo2 != null ? mTaskInfo2.taskId : INVALID_TASK_ID;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="81"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); "
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="89"
+ column="113"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); "
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="89"
+ column="149"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b -> b.setParent(mRootTaskLeash), mDisplayImeController);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="105"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="151"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="151"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId1()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="154"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId2()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="157"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" throw new IllegalStateException("Unknown task=" + taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="161"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(dividerLeash, Integer.MAX_VALUE)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="172"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (taskInfo.taskId == getRootTaskId()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="186"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId1()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="202"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId2()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="204"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" throw new IllegalStateException("Unknown task=" + taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="207"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (taskInfo.taskId == getRootTaskId()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="213"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mController.unpair(mRootTaskInfo.taskId, false /* releaseToPool */);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="215"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="216"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="216"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mController.unpair(mRootTaskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="217"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mRootTaskLeash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="224"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mTaskLeash1);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="226"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mTaskLeash2);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="228"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" pw.println(innerPrefix + "1 taskId=" + mTaskInfo1.taskId"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="242"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" pw.println(innerPrefix + "2 taskId=" + mTaskInfo2.taskId"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="246"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
+ line="291"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.content.LocusId`"
+ errorLine1=" mLocusId = locus != null ? new LocusId(locus) : null;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="177"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.service.notification.StatusBarNotification#getUid`"
+ errorLine1=" mAppUid = entry.getStatusBarNotification().getUid();"
+ errorLine2=" ~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="449"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#getConversationShortcutInfo`"
+ errorLine1=" mShortcutInfo = entry.getRanking().getConversationShortcutInfo();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="453"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.app.NotificationChannel#isImportantConversation`"
+ errorLine1=" entry.getRanking().getChannel().isImportantConversation();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="457"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`"
+ errorLine1=" mMetadataShortcutId = entry.getBubbleMetadata().getShortcutId();"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="461"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeight`"
+ errorLine1=" mDesiredHeight = entry.getBubbleMetadata().getDesiredHeight();"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="463"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeightResId`"
+ errorLine1=" mDesiredHeightResId = entry.getBubbleMetadata().getDesiredHeightResId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="464"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIcon`"
+ errorLine1=" mIcon = entry.getBubbleMetadata().getIcon();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="465"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
+ errorLine1=" mIntent = entry.getBubbleMetadata().getIntent();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="471"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
+ errorLine1=" } else if (mIntent != null && entry.getBubbleMetadata().getIntent() == null) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="475"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDeleteIntent`"
+ errorLine1=" mDeleteIntent = entry.getBubbleMetadata().getDeleteIntent();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="481"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.app.Notification.MessagingStyle.Message#getMessagesFromBundleArray`"
+ errorLine1=" Notification.MessagingStyle.Message.getMessagesFromBundleArray("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="856"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.app.Notification.MessagingStyle.Message#getSenderPerson`"
+ errorLine1=" Person sender = latestMessage.getSenderPerson();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="864"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.app.Person#getName`"
+ errorLine1=" bubbleMessage.senderName = sender != null ? sender.getName() : null;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="865"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.app.Person#getIcon`"
+ errorLine1=" bubbleMessage.senderIcon = sender != null ? sender.getIcon() : null;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
+ line="867"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (task.taskId == b.getTaskId()) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="357"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
+ errorLine1=" mWmLayoutParams.setFitInsetsTypes(0);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="553"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" mWmLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="558"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getAutoExpandBubble`"
+ errorLine1=" && !notif.getBubbleMetadata().getAutoExpandBubble())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="842"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`"
+ errorLine1=" if (isActiveBubble && !mTmpRanking.canBubble()) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="919"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
+ errorLine1=" ? entry.getBubbleMetadata().getIntent()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="1217"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`"
+ errorLine1=" && entry.getBubbleMetadata().getShortcutId() != null) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
+ line="1220"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.LocusId#getId`"
+ errorLine1=" b.locusId?.id"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt"
+ line="85"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification#getLocusId`"
+ errorLine1=" return mSbn.getNotification().getLocusId();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
+ line="81"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.app.Notification#getBubbleMetadata`"
+ errorLine1=" return getStatusBarNotification().getNotification().getBubbleMetadata();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
+ line="87"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`"
+ errorLine1=" return mRanking.canBubble();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
+ line="115"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.Bitmap#createBitmap`"
+ errorLine1=" Bitmap snapshot = Bitmap.createBitmap(p);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
+ line="428"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.Bitmap#getHardwareBuffer`"
+ errorLine1=" return new SurfaceControl.ScreenshotHardwareBuffer(snapshot.getHardwareBuffer(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
+ line="429"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
+ errorLine1=" if (mTaskView == null || mTaskView.getSurfaceControl() == null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
+ line="432"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
+ errorLine1=" mTaskView.getSurfaceControl(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
+ line="436"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" ? mExpandedViewContainerLocation[1] - mPositioner.getInsets().top"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
+ line="636"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`"
+ errorLine1=" outline.setPath(rectPath);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java"
+ line="504"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
+ errorLine1=" if (ic.getType() == Icon.TYPE_URI"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
+ line="65"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
+ errorLine1=" || ic.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
+ line="66"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`"
+ errorLine1=" ic.getUri(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
+ line="68"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" getContext().getDisplay().getMetrics(displayMetrics);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java"
+ line="143"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
+ errorLine1=" WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="93"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
+ errorLine1=" WindowInsets metricInsets = windowMetrics.getWindowInsets();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="97"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`"
+ errorLine1=" Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="99"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
+ errorLine1=" Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="99"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`"
+ errorLine1=" | WindowInsets.Type.statusBars()"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="100"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
+ errorLine1=" | WindowInsets.Type.displayCutout());"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="101"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
+ errorLine1=" + " bounds: " + windowMetrics.getBounds()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="107"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
+ errorLine1=" updateInternal(orientation, insets, windowMetrics.getBounds());"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="110"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" mPositionRect.left += mInsets.left;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="134"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" mPositionRect.top += mInsets.top;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="135"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" mPositionRect.right -= mInsets.right;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="136"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
+ errorLine1=" mPositionRect.bottom -= mInsets.bottom;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="137"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
+ errorLine1=" WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="156"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
+ errorLine1=" WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="156"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`"
+ errorLine1=" Insets navBarInsets = metricInsets.getInsetsIgnoringVisibility("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="157"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
+ errorLine1=" WindowInsets.Type.navigationBars());"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="158"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" int newInsetLeft = mInsets.left;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="159"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" int newInsetRight = mInsets.right;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="160"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" mPositionRect.left -= navBarInsets.left;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="162"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" newInsetLeft -= navBarInsets.left;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="163"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" mPositionRect.right += navBarInsets.right;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="165"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" newInsetRight -= navBarInsets.right;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="166"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`"
+ errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
+ errorLine2=" ~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="168"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
+ errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="168"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="168"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `new android.graphics.PointF`"
+ errorLine1=" mRestingStackPosition = new PointF(position);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
+ line="229"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#getAnimationMatrix`"
+ errorLine1=" pw.println(mExpandedViewContainer.getAnimationMatrix());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="295"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`"
+ errorLine1=" mBubbleContainer.setSystemGestureExclusionRects(mSystemGestureExclusionRects);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1427"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`"
+ errorLine1=" mBubbleContainer.setSystemGestureExclusionRects(Collections.emptyList());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1430"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1750"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1775"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1863"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1894"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="1986"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="2074"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="2091"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
+ errorLine1=" mExpandedViewContainer.setAnimationMatrix(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="2118"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" int leftPadding = insets.left + mExpandedViewPadding;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="2696"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" int rightPadding = insets.right + mExpandedViewPadding;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
+ line="2697"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
+ errorLine1=" if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
+ line="220"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
+ errorLine1=" if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
+ line="220"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`"
+ errorLine1=" icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
+ line="222"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
+ line="119"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, transformation.getAlpha());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
+ line="237"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
+ line="239"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="279"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`"
+ errorLine1=" if ((types & WindowInsets.Type.ime()) == 0) {"
+ errorLine2=" ~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="285"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`"
+ errorLine1=" if ((types & WindowInsets.Type.ime()) == 0) {"
+ errorLine2=" ~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="294"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="396"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="398"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="420"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="424"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="439"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
+ line="446"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetLeft`"
+ errorLine1=" outInsets.left += displayCutout.getSafeInsetLeft();"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="313"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetTop`"
+ errorLine1=" outInsets.top += displayCutout.getSafeInsetTop();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="314"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetRight`"
+ errorLine1=" outInsets.right += displayCutout.getSafeInsetRight();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="315"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetBottom`"
+ errorLine1=" outInsets.bottom += displayCutout.getSafeInsetBottom();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="316"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
+ errorLine1=" final Insets waterfallInsets = rotateInsets(cutout.getWaterfallInsets(), rotation);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="358"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
+ errorLine1=" int leftInset = Math.max(cutout.getWaterfallInsets().left,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="405"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" int leftInset = Math.max(cutout.getWaterfallInsets().left,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="405"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectLeft`"
+ errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectLeft(), Gravity.LEFT));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="406"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
+ errorLine1=" int topInset = Math.max(cutout.getWaterfallInsets().top,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="407"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" int topInset = Math.max(cutout.getWaterfallInsets().top,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="407"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectTop`"
+ errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectTop(), Gravity.TOP));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="408"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
+ errorLine1=" int rightInset = Math.max(cutout.getWaterfallInsets().right,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="409"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" int rightInset = Math.max(cutout.getWaterfallInsets().right,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="409"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectRight`"
+ errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectRight(), Gravity.RIGHT));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="410"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
+ errorLine1=" int bottomInset = Math.max(cutout.getWaterfallInsets().bottom,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="411"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
+ errorLine1=" int bottomInset = Math.max(cutout.getWaterfallInsets().bottom,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="411"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectBottom`"
+ errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectBottom(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
+ line="412"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java"
+ line="343"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java"
+ line="359"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="406"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="731"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="800"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="878"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(dim, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="1065"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="1106"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
+ line="1171"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerWindowManager.java"
+ line="64"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="73"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#createWindowContext`"
+ errorLine1=" .createWindowContext(TYPE_APPLICATION_OVERLAY, null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="89"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" layoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="101"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
+ errorLine1=" layoutParams.setFitInsetsTypes(0);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="102"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mTransaction.reparent(dragSurface, null);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="229"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mTransaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
+ line="230"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" final int iw = w - insets.left - insets.right;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="126"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
+ errorLine1=" final int iw = w - insets.left - insets.right;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="126"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
+ errorLine1=" final int ih = h - insets.top - insets.bottom;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="127"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" final int ih = h - insets.top - insets.bottom;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="127"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
+ errorLine1=" final int l = insets.left;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="128"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" final int t = insets.top;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="129"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" runningTaskId = task.taskId;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
+ line="279"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
+ errorLine1=" private Insets mInsets = Insets.NONE;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
+ line="59"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`"
+ errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
+ line="76"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
+ errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
+ line="76"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`"
+ errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
+ line="76"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`"
+ errorLine1=" return Sets.newHashSet("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java"
+ line="498"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mLeashByTaskId.get(taskInfo.taskId) != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="53"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" throw new IllegalStateException("Task appeared more than once: #" + taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="54"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, -1501874464, 1, null, protoLogParam0); "
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="56"
+ column="113"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mLeashByTaskId.put(taskInfo.taskId, leash);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="58"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="66"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="75"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mLeashByTaskId.get(taskInfo.taskId) == null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="88"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" Slog.e(TAG, "Task already vanished: #" + taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="89"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mLeashByTaskId.remove(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="92"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, 564235578, 1, null, protoLogParam0); "
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="93"
+ column="113"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" if (!mLeashByTaskId.contains(taskId)) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="99"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mLeashByTaskId.get(taskId));"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
+ line="102"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.os.Handler#hasCallbacks`"
+ errorLine1=" return mHandler.hasCallbacks(r);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/HandlerExecutor.java"
+ line="55"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="86"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="90"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="107"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="121"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="167"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
+ errorLine1=" return Insets.NONE;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="185"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.Display#getCutout`"
+ errorLine1=" DisplayCutout cutout = display.getCutout();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="187"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`"
+ errorLine1=" Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;"
+ errorLine2=" ~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="188"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
+ errorLine1=" Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="188"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`"
+ errorLine1=" mCurrentDisplayBounds.inset(mCurrentCutoutInsets);"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="239"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" if (mCurrentCutoutInsets.top != 0) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="244"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
+ errorLine1=" mCurrentDisplayBounds.top = Math.max(mStatusBarHeight, mCurrentCutoutInsets.top);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="245"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
+ line="287"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mContext.getResources().getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java"
+ line="465"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1362429294, 4, null, protoLogParam0, protoLogParam1); "
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="129"
+ column="166"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 982027396, 4, null, protoLogParam0, protoLogParam1); "
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="134"
+ column="166"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; long protoLogParam2 = winMode; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -298656957, 20, null, protoLogParam0, protoLogParam1, protoLogParam2); "
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="139"
+ column="166"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(mPrimarySurface).setColorLayer()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="150"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("Primary Divider Dim")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="151"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="153"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(mSecondarySurface).setColorLayer()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="155"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("Secondary Divider Dim")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="156"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="158"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(mPrimaryDim, Integer.MAX_VALUE);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="160"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(mSecondaryDim, Integer.MAX_VALUE);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="162"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="164"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mPositionByTaskId.remove(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="173"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mLeashByTaskId.remove(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="175"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="192"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (taskInfo.positionInParent.equals(mPositionByTaskId.get(taskInfo.taskId))) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="211"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="218"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mLeashByTaskId.put(taskInfo.taskId, leash);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="223"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="224"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="231"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="242"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="322"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" if (!mLeashByTaskId.contains(taskId)) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="339"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mLeashByTaskId.get(taskId));"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="342"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mPrimary != null) pw.println(innerPrefix + "mPrimary.taskId=" + mPrimary.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="351"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mSecondary != null) pw.println(innerPrefix + "mSecondary.taskId=" + mSecondary.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
+ line="352"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" && triggerTask.parentTaskId == mListener.mPrimary.taskId)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="94"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="132"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="133"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" transaction.setAlpha(leash, end);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="136"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="137"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="180"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="185"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(parentChange.getLeash(), 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="245"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(leash, info.getRootLeash());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="248"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, info.getChanges().size() - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="249"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mFinishTransaction.reparent(leash, parentChange.getLeash());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="251"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, info.getChanges().size() + 1);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="281"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 0.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="294"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="316"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mFinishTransaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
+ line="334"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.os.VibrationEffect#createPredefined`"
+ errorLine1=" vibrator.vibrate(VibrationEffect.createPredefined(effectId))"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt"
+ line="465"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
+ errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
+ line="141"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
+ line="286"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
+ line="295"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
+ errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="101"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(mParentLeash)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="152"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`"
+ errorLine1=" .setBufferSize(mBkgBounds.width(), mBkgBounds.height())"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="153"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`"
+ errorLine1=" .setFormat(PixelFormat.RGB_888)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="155"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setOpaque`"
+ errorLine1=" .setOpaque(true)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="156"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("one-handed-background-panel")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="157"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="159"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" transaction.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="179"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" .apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="182"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.remove(mBackgroundSurface).apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
+ line="197"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`"
+ errorLine1=" .getRecommendedTimeoutMillis(mOneHandedTimeout * 1000"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java"
+ line="150"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.os.RemoteException#rethrowFromSystemServer`"
+ errorLine1=" throw e.rethrowFromSystemServer();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java"
+ line="574"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
+ errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java"
+ line="130"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java"
+ line="241"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" tx.setAlpha(leash, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSurfaceTransactionHelper.java"
+ line="57"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
+ errorLine1=" mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
+ line="101"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
+ errorLine1=" mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
+ line="101"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
+ errorLine1=" lp.setFitInsetsTypes(0 /* types */);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
+ line="200"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
+ errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="244"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="399"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="413"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="499"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="518"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
+ line="532"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mDefaultAspectRatio = res.getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
+ line="77"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mMinAspectRatio = res.getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
+ line="93"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mMaxAspectRatio = res.getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
+ line="95"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mDefaultSizePercent = res.getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
+ line="97"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" mMaxAspectRatioForMinSize = res.getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
+ line="99"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mPipBoundsState.setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java"
+ line="337"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" onDisplayChanged(new DisplayLayout(mContext, mContext.getDisplay()),"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java"
+ line="428"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java"
+ line="247"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
+ errorLine1=" lp.setFitInsetsTypes(0 /* types */);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java"
+ line="248"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`"
+ errorLine1=" int recommendedTimeout = mAccessibilityManager.getRecommendedTimeoutMillis(delay,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java"
+ line="506"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mContext.getDisplay().getRealSize(mMaxSize);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="142"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="388"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="388"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="389"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="389"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" float x0 = ev.getRawX(mFirstIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="403"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" float y0 = ev.getRawY(mFirstIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="404"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" float x1 = ev.getRawX(mSecondIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="405"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" float y1 = ev.getRawY(mSecondIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
+ line="406"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" tx.setAlpha(leash, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
+ line="66"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 31 (current min is 26): `android.graphics.Matrix#IDENTITY_MATRIX`"
+ errorLine1=" tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, mTmpFloat9)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
+ line="166"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(snapshot, parent);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
+ line="188"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(snapshot, Integer.MAX_VALUE);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
+ line="189"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
+ line="191"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
+ errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="238"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" .getAnimator(mTaskInfo, mLeash, mPipBoundsState.getBounds(), 1f, 0f)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="397"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="431"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" tx.setAlpha(mLeash, 0f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="462"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="464"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" tx.setAlpha(mLeash, 0f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="502"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="503"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" .getAnimator(mTaskInfo, mLeash, destinationBounds, 0f, 1f)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="506"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="820"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="858"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" transaction.setAlpha(snapshotSurface, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="991"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="992"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="1000"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" .getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
+ line="1082"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mContext.getDisplay().getRealSize(displaySize);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java"
+ line="380"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" int displayRotation = mContext.getDisplay().getRotation();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java"
+ line="674"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" float x = ev.getRawX(pointerIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="138"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" float y = ev.getRawY(pointerIndex);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="139"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="174"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="174"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
+ errorLine1=" mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="197"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
+ errorLine1=" mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
+ line="197"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" return startEnterAnimation(change.getTaskInfo(), change.getLeash(), t);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
+ line="79"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" setBoundsStateForEntry(taskInfo.topActivity, taskInfo.pictureInPictureParams,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
+ line="105"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 0f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
+ line="118"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
+ line="119"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" if (taskInfo != null && taskInfo.topActivity != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java"
+ line="44"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" mPackageName = taskInfo.topActivity.getPackageName();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java"
+ line="45"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(sc);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java"
+ line="97"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#baseIntent`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); "
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="168"
+ column="187"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); "
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="168"
+ column="121"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = info.getTaskInfo().taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="333"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" notifyLocusVisibilityIfNeeded(info.getTaskInfo());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="341"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 157713005, 1, null, protoLogParam0); }"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="348"
+ column="117"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="349"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="352"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" notifyLocusVisibilityIfNeeded(taskInfo);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="358"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" if (updated || !taskInfo.equalsForSizeCompat(data.getTaskInfo())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="359"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 980952660, 1, null, protoLogParam0); }"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="369"
+ column="117"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -880817403, 1, null, protoLogParam0); }"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="380"
+ column="117"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="381"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
+ errorLine1=" notifyLocusVisibilityIfNeeded(taskInfo);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="387"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="417"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
+ errorLine1=" mVisibleTasksWithLocusId.remove(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="437"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="466"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="472"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = runningTaskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
+ line="483"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" } else if (mActiveLayouts.contains(taskId)) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java"
+ line="96"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, Integer.MAX_VALUE);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUILayout.java"
+ line="314"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("SizeCompatUILeash")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="63"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" mLeash = builder.build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="67"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mLeash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="68"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="78"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="94"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
+ errorLine1=" mViewHost.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="108"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="113"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
+ line="113"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.window.SplashScreenView#getIconView`"
+ errorLine1=" final View iconView = mSplashScreenView.getIconView();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="158"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.graphics.Paint#setBlendMode`"
+ errorLine1=" mVanishPaint.setBlendMode(BlendMode.MODULATE);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="247"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.graphics.BlendMode#MODULATE`"
+ errorLine1=" mVanishPaint.setBlendMode(BlendMode.MODULATE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="247"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="284"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" tx.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="303"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#release`"
+ errorLine1=" mFirstWindowSurface.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
+ line="304"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager#getMaximumWindowMetrics`"
+ errorLine1=" .getMaximumWindowMetrics()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="256"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
+ errorLine1=" .getWindowInsets()"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="257"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`"
+ errorLine1=" .getInsets(WindowInsets.Type.navigationBars()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="258"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
+ errorLine1=" .getInsets(WindowInsets.Type.navigationBars()"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="258"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`"
+ errorLine1=" | WindowInsets.Type.statusBars()"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="259"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
+ errorLine1=" | WindowInsets.Type.displayCutout()).toRect();"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
+ line="260"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(parentChange.getLeash(), 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="116"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(leash, info.getRootLeash());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="119"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, info.getChanges().size() - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="120"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mFinishTransaction.reparent(leash, parentChange.getLeash());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="122"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 0.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="158"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="164"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mFinishTransaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="198"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="222"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="223"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" transaction.setAlpha(leash, end);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="226"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="227"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="270"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" transaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
+ line="275"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName(TAG)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="101"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" mLeash = builder.build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="105"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mLeash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="106"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="116"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
+ errorLine1=" mViewHost.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="145"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="150"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
+ line="150"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`"
+ errorLine1=" return Sets.newHashSet("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java"
+ line="692"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="399"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="515"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" && taskInfo.parentTaskId == mMainStage.mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="570"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" && taskInfo.parentTaskId == mSideStage.mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="573"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TRANSITIONS_enabled) { long protoLogParam0 = triggerTask.taskId; String protoLogParam1 = String.valueOf(transitTypeToString(type)); long protoLogParam2 = mMainStage.getChildCount(); long protoLogParam3 = mSideStage.getChildCount(); com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, 165317020, 81, " split is active so using split" + "Transition to handle request. triggerTask=%d type=%s mainChildren=%d" + " sideChildren=%d", protoLogParam0, protoLogParam1, protoLogParam2, protoLogParam3); "
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="597"
+ column="120"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (!stage.containsTask(taskInfo.taskId)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="655"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" + " with " + taskInfo.taskId + " before startAnimation().");"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="657"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (stage.containsTask(taskInfo.taskId)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="660"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" + " with " + taskInfo.taskId + " before startAnimation().");"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="662"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (!mMainStage.containsTask(mainChild.getTaskInfo().taskId)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="732"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" + " to have been called with " + mainChild.getTaskInfo().taskId"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="734"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (!mSideStage.containsTask(sideChild.getTaskInfo().taskId)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="737"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" + " to have been called with " + sideChild.getTaskInfo().taskId"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="739"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="820"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, Integer.MAX_VALUE);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
+ line="821"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" return mChildrenTaskInfo.contains(taskId);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="85"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="96"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="97"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo.taskId == taskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="116"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo.taskId == taskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="116"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="118"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="119"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="120"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="124"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="140"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo.taskId == taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="141"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" } else if (mChildrenTaskInfo.contains(taskId)) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="144"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mRootTaskInfo.taskId == taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="161"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mRootLeash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="162"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
+ errorLine1=" } else if (mChildrenLeashes.contains(taskId)) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="163"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mChildrenLeashes.get(taskId));"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="164"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
+ line="194"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
+ line="131"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" + Integer.toHexString(theme) + " task= " + taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
+ line="141"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)"
+ errorLine1=" win.setContentView(sView);"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
+ line="280"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)"
+ errorLine1=" win.setContentView(sView);"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
+ line="284"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = startingWindowInfo.taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
+ line="309"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final TaskSnapshot snapshot = getTaskSnapshot(windowInfo.taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
+ line="162"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" Slog.d(TAG, "isSnapshotCompatible no snapshot " + windowInfo.taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
+ line="180"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" mTaskLaunchingCallback.accept(runningTaskInfo.taskId, suggestionType);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
+ line="238"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" mInFlight.onTransactionReady(mInFlight.mId, new SurfaceControl.Transaction());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
+ line="55"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
+ line="114"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
+ line="125"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
+ errorLine1=" root.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="121"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("SystemWindowLeash")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="278"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(mRootSurface)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="280"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .setCallsite("SysUiWIndowManager#attachToParentSurface").build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="281"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(leash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="285"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" new SurfaceControl.Transaction().remove(mLeashForWindow.get(token))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="293"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" .apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
+ line="294"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = runningTaskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="151"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="186"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
+ errorLine1=" layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="186"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsTypes`"
+ errorLine1=" layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="187"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
+ errorLine1=" layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="187"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsSides`"
+ errorLine1=" layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="188"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsSides`"
+ errorLine1=" layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="188"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#isFitInsetsIgnoringVisibility`"
+ errorLine1=" layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="189"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsIgnoringVisibility`"
+ errorLine1=" layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="189"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" if (runningTaskInfo.taskDescription != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="208"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" taskDescription = runningTaskInfo.taskDescription;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="209"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" mTransaction = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="271"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`"
+ errorLine1=" return state.calculateInsets(frame, WindowInsets.Type.systemBars(),"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="328"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName(mTitle + " - task-snapshot-surface")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="374"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`"
+ errorLine1=" .setBufferSize(buffer.getWidth(), buffer.getHeight())"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="375"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`"
+ errorLine1=" .setFormat(buffer.getFormat())"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="376"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(mSurfaceControl)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="377"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="379"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mTransaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="406"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`"
+ errorLine1=" rect.inset((int) (insets.left * scaleX),"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
+ line="435"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" onTaskMovedToFront(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java"
+ line="52"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `new android.util.CloseGuard`"
+ errorLine1=" private final CloseGuard mGuard = new CloseGuard();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="73"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="81"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.CloseGuard#open`"
+ errorLine1=" mGuard.open("release");"
+ errorLine2=" ~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="99"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.CloseGuard#warnIfOpen`"
+ errorLine1=" mGuard.warnIfOpen();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="204"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.util.CloseGuard#close`"
+ errorLine1=" mGuard.close();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="218"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = mTaskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="239"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="255"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="255"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" .apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="257"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" if (taskInfo.taskDescription != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="266"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="267"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="271"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="284"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="292"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="292"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" if (taskInfo.taskDescription != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="298"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
+ errorLine1=" setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="299"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" final int taskId = taskInfo.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="307"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" if (mTaskInfo.taskId != taskId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="316"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" b.setParent(mTaskLeash);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="319"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" return "TaskView" + ":" + (mTaskInfo != null ? mTaskInfo.taskId : "null");"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="331"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="349"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="349"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" .apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="351"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="374"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
+ line="374"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" return new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TransactionPool.java"
+ line="36"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" context.getResources().getFloat("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="117"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
+ errorLine1=" if (info.getRootLeash().isValid()) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="231"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="247"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(leash, info.getRootLeash());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="256"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="266"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="270"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 0.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="272"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, zSplitLine - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="276"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(leash, 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="277"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, zSplitLine - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="282"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="285"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="288"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
+ errorLine1=" if (!info.getRootLeash().isValid()) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="304"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
+ line="309"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`"
+ errorLine1=" outline.setPath(mTriangularPath);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TriangleShape.java"
+ line="75"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
+ line="147"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
+ errorLine1=" mPinnedTaskId = pinnedTask.taskId;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
+ line="283"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" mPipNotificationController.show(pinnedTask.topActivity.getPackageName());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
+ line="287"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
+ errorLine1=" mContext.getDisplay().getDisplayInfo(displayInfo);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
+ line="348"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java"
+ line="134"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java"
+ line="136"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
+ errorLine1=" if (out != null && out.isValid()) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java"
+ line="188"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction sft = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java"
+ line="326"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
+ errorLine1=" android:bottomLeftRadius="?android:attr/dialogCornerRadius""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
+ line="21"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
+ errorLine1=" android:topLeftRadius="?android:attr/dialogCornerRadius""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
+ line="22"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
+ errorLine1=" android:bottomRightRadius="?android:attr/dialogCornerRadius""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
+ line="23"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
+ errorLine1=" android:topRightRadius="?android:attr/dialogCornerRadius""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
+ line="24"
+ column="9"/>
+ </issue>
+
+</issues>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index d6079b6..0a15d84 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -571,7 +571,7 @@
* hide the bubble when in the same content).
*/
boolean isSuppressable() {
- return (mFlags & Notification.BubbleMetadata.FLAG_SHOULD_SUPPRESS_BUBBLE) != 0;
+ return (mFlags & Notification.BubbleMetadata.FLAG_SUPPRESSABLE_BUBBLE) != 0;
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 4ff1ce9..11c1464 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -16,6 +16,7 @@
package com.android.wm.shell.bubbles;
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
@@ -78,6 +79,8 @@
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.TaskStackListenerCallback;
+import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.pip.PinnedStackListenerForwarder;
import java.io.FileDescriptor;
@@ -124,6 +127,7 @@
private final LauncherApps mLauncherApps;
private final IStatusBarService mBarService;
private final WindowManager mWindowManager;
+ private final TaskStackListenerImpl mTaskStackListener;
private final ShellTaskOrganizer mTaskOrganizer;
// Used to post to main UI thread
@@ -194,6 +198,7 @@
WindowManager windowManager,
WindowManagerShellWrapper windowManagerShellWrapper,
LauncherApps launcherApps,
+ TaskStackListenerImpl taskStackListener,
UiEventLogger uiEventLogger,
ShellTaskOrganizer organizer,
ShellExecutor mainExecutor,
@@ -204,7 +209,7 @@
return new BubbleController(context, data, synchronizer, floatingContentCoordinator,
new BubbleDataRepository(context, launcherApps, mainExecutor),
statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
- logger, organizer, positioner, mainExecutor, mainHandler);
+ logger, taskStackListener, organizer, positioner, mainExecutor, mainHandler);
}
/**
@@ -221,6 +226,7 @@
WindowManagerShellWrapper windowManagerShellWrapper,
LauncherApps launcherApps,
BubbleLogger bubbleLogger,
+ TaskStackListenerImpl taskStackListener,
ShellTaskOrganizer organizer,
BubblePositioner positioner,
ShellExecutor mainExecutor,
@@ -238,6 +244,7 @@
mLogger = bubbleLogger;
mMainExecutor = mainExecutor;
mMainHandler = mainHandler;
+ mTaskStackListener = taskStackListener;
mTaskOrganizer = organizer;
mSurfaceSynchronizer = synchronizer;
mCurrentUserId = ActivityManager.getCurrentUser();
@@ -319,6 +326,42 @@
packageName, validShortcuts, DISMISS_SHORTCUT_REMOVED);
}
}, mMainHandler);
+
+ mTaskStackListener.addListener(new TaskStackListenerCallback() {
+ @Override
+ public void onTaskMovedToFront(int taskId) {
+ if (mSysuiProxy == null) {
+ return;
+ }
+
+ mSysuiProxy.isNotificationShadeExpand((expand) -> {
+ mMainExecutor.execute(() -> {
+ int expandedId = INVALID_TASK_ID;
+ if (mStackView != null && mStackView.getExpandedBubble() != null
+ && isStackExpanded() && !mStackView.isExpansionAnimating()
+ && !expand) {
+ expandedId = mStackView.getExpandedBubble().getTaskId();
+ }
+
+ if (expandedId != INVALID_TASK_ID && expandedId != taskId) {
+ mBubbleData.setExpanded(false);
+ }
+ });
+ });
+ }
+
+ @Override
+ public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
+ boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
+ for (Bubble b : mBubbleData.getBubbles()) {
+ if (task.taskId == b.getTaskId()) {
+ mBubbleData.setSelectedBubble(b);
+ mBubbleData.setExpanded(true);
+ return;
+ }
+ }
+ }
+ });
}
@VisibleForTesting
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 9ef3fb5..abe1f71 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -154,6 +154,7 @@
}
try {
options.setTaskAlwaysOnTop(true);
+ options.setLaunchedFromBubble(true);
if (!mIsOverflow && mBubble.hasMetadataShortcutId()) {
options.setApplyActivityFlagsForBubbles(true);
mTaskView.startShortcutActivity(mBubble.getShortcutInfo(),
@@ -163,7 +164,6 @@
// Apply flags to make behaviour match documentLaunchMode=always.
fillInIntent.addFlags(FLAG_ACTIVITY_NEW_DOCUMENT);
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
- fillInIntent.putExtra(Intent.EXTRA_IS_BUBBLED, true);
if (mBubble != null) {
mBubble.setIntentActive();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
index 98978b5..9fc8aef 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
@@ -248,6 +248,8 @@
/** Callback to tell SysUi components execute some methods. */
interface SysuiProxy {
+ void isNotificationShadeExpand(Consumer<Boolean> callback);
+
void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback);
void getShouldRestoredEntries(ArraySet<String> savedBubbleKeys,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
index d25bef1..9eacaec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
@@ -21,6 +21,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -41,8 +42,6 @@
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
-import androidx.annotation.Nullable;
-
import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
@@ -63,7 +62,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -496,13 +494,15 @@
public boolean splitPrimaryTask() {
try {
- if (ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED
- || isSplitActive()) {
+ if (ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED) {
return false;
}
} catch (RemoteException e) {
return false;
}
+ if (isSplitActive() || mSplits.mPrimary == null) {
+ return false;
+ }
// Try fetching the top running task.
final List<RunningTaskInfo> runningTasks =
@@ -523,8 +523,12 @@
return false;
}
- return ActivityTaskManager.getInstance().setTaskWindowingModeSplitScreenPrimary(
- topRunningTask.taskId, true /* onTop */);
+ final WindowContainerTransaction wct = new WindowContainerTransaction();
+ // Clear out current windowing mode before reparenting to split task.
+ wct.setWindowingMode(topRunningTask.token, WINDOWING_MODE_UNDEFINED);
+ wct.reparent(topRunningTask.token, mSplits.mPrimary.token, true /* onTop */);
+ mWindowManagerProxy.applySyncTransaction(wct);
+ return true;
}
public void dismissSplitToPrimaryTask() {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
index 0c46eab..8f0892f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
@@ -20,6 +20,7 @@
import android.content.Intent;
import android.os.Bundle;
import android.os.UserHandle;
+import android.window.IRemoteTransition;
import com.android.wm.shell.splitscreen.ISplitScreenListener;
@@ -74,4 +75,11 @@
*/
oneway void startIntent(in PendingIntent intent, in Intent fillInIntent, int stage,
int position, in Bundle options) = 9;
+
+ /**
+ * Starts tasks simultaneously in one transition. The first task in the list will be in the
+ * main-stage and on the left/top.
+ */
+ oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId,
+ in Bundle sideOptions, int sidePosition, in IRemoteTransition remoteTransition) = 10;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java
index 2f2e325..66a4a60 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java
@@ -16,10 +16,7 @@
package com.android.wm.shell.splitscreen;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import android.graphics.Rect;
import android.window.WindowContainerToken;
@@ -52,6 +49,7 @@
final WindowContainerToken rootToken = mRootTaskInfo.token;
wct.setBounds(rootToken, rootBounds)
+ .setWindowingMode(rootToken, WINDOWING_MODE_MULTI_WINDOW)
.setLaunchRoot(
rootToken,
CONTROLLED_WINDOWING_MODES,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
index 340b55d7..d4506fd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
@@ -17,18 +17,8 @@
package com.android.wm.shell.splitscreen;
import android.annotation.IntDef;
-import android.app.ActivityManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.UserHandle;
-
-import androidx.annotation.Nullable;
import com.android.wm.shell.common.annotations.ExternalThread;
-import com.android.wm.shell.draganddrop.DragAndDropPolicy;
/**
* Interface to engage split-screen feature.
@@ -95,4 +85,14 @@
default ISplitScreen createExternalInterface() {
return null;
}
+
+ /** Get a string representation of a stage type */
+ static String stageTypeToString(@StageType int stage) {
+ switch (stage) {
+ case STAGE_TYPE_UNDEFINED: return "UNDEFINED";
+ case STAGE_TYPE_MAIN: return "MAIN";
+ case STAGE_TYPE_SIDE: return "SIDE";
+ default: return "UNKNOWN(" + stage + ")";
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index d4362ef..5aa59f2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -39,6 +39,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;
+import android.window.IRemoteTransition;
import androidx.annotation.BinderThread;
import androidx.annotation.NonNull;
@@ -50,9 +51,11 @@
import com.android.wm.shell.common.RemoteCallable;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.draganddrop.DragAndDropPolicy;
import com.android.wm.shell.splitscreen.ISplitScreenListener;
+import com.android.wm.shell.transition.Transitions;
import java.io.PrintWriter;
@@ -72,19 +75,24 @@
private final ShellExecutor mMainExecutor;
private final SplitScreenImpl mImpl = new SplitScreenImpl();
private final DisplayImeController mDisplayImeController;
+ private final Transitions mTransitions;
+ private final TransactionPool mTransactionPool;
private StageCoordinator mStageCoordinator;
public SplitScreenController(ShellTaskOrganizer shellTaskOrganizer,
SyncTransactionQueue syncQueue, Context context,
RootTaskDisplayAreaOrganizer rootTDAOrganizer,
- ShellExecutor mainExecutor, DisplayImeController displayImeController) {
+ ShellExecutor mainExecutor, DisplayImeController displayImeController,
+ Transitions transitions, TransactionPool transactionPool) {
mTaskOrganizer = shellTaskOrganizer;
mSyncQueue = syncQueue;
mContext = context;
mRootTDAOrganizer = rootTDAOrganizer;
mMainExecutor = mainExecutor;
mDisplayImeController = displayImeController;
+ mTransitions = transitions;
+ mTransactionPool = transactionPool;
}
public SplitScreen asSplitScreen() {
@@ -105,7 +113,8 @@
if (mStageCoordinator == null) {
// TODO: Multi-display
mStageCoordinator = new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue,
- mRootTDAOrganizer, mTaskOrganizer, mDisplayImeController);
+ mRootTDAOrganizer, mTaskOrganizer, mDisplayImeController, mTransitions,
+ mTransactionPool);
}
}
@@ -407,6 +416,16 @@
}
@Override
+ public void startTasks(int mainTaskId, @Nullable Bundle mainOptions,
+ int sideTaskId, @Nullable Bundle sideOptions,
+ @SplitScreen.StagePosition int sidePosition,
+ @Nullable IRemoteTransition remoteTransition) {
+ executeRemoteCallWithTaskPermission(mController, "startTasks",
+ (controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions,
+ sideTaskId, sideOptions, sidePosition, remoteTransition));
+ }
+
+ @Override
public void startShortcut(String packageName, String shortcutId, int stage, int position,
@Nullable Bundle options, UserHandle user) {
executeRemoteCallWithTaskPermission(mController, "startShortcut",
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java
new file mode 100644
index 0000000..c37789e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.splitscreen;
+
+import static android.view.WindowManager.TRANSIT_CHANGE;
+import static android.view.WindowManager.TRANSIT_CLOSE;
+import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.window.TransitionInfo.FLAG_FIRST_CUSTOM;
+
+import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP;
+import static com.android.wm.shell.transition.Transitions.isOpeningType;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Rect;
+import android.os.IBinder;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+import android.window.IRemoteTransition;
+import android.window.TransitionInfo;
+import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
+
+import com.android.wm.shell.common.TransactionPool;
+import com.android.wm.shell.transition.OneShotRemoteHandler;
+import com.android.wm.shell.transition.Transitions;
+
+import java.util.ArrayList;
+
+/** Manages transition animations for split-screen. */
+class SplitScreenTransitions {
+ private static final String TAG = "SplitScreenTransitions";
+
+ /** Flag applied to a transition change to identify it as a divider bar for animation. */
+ public static final int FLAG_IS_DIVIDER_BAR = FLAG_FIRST_CUSTOM;
+
+ private final TransactionPool mTransactionPool;
+ private final Transitions mTransitions;
+ private final Runnable mOnFinish;
+
+ IBinder mPendingDismiss = null;
+ IBinder mPendingEnter = null;
+
+ private IBinder mAnimatingTransition = null;
+ private OneShotRemoteHandler mRemoteHandler = null;
+
+ private Transitions.TransitionFinishCallback mRemoteFinishCB = (wct, wctCB) -> {
+ if (wct != null || wctCB != null) {
+ throw new UnsupportedOperationException("finish transactions not supported yet.");
+ }
+ onFinish();
+ };
+
+ /** Keeps track of currently running animations */
+ private final ArrayList<Animator> mAnimations = new ArrayList<>();
+
+ private Transitions.TransitionFinishCallback mFinishCallback = null;
+ private SurfaceControl.Transaction mFinishTransaction;
+
+ SplitScreenTransitions(@NonNull TransactionPool pool, @NonNull Transitions transitions,
+ @NonNull Runnable onFinishCallback) {
+ mTransactionPool = pool;
+ mTransitions = transitions;
+ mOnFinish = onFinishCallback;
+ }
+
+ void playAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction t,
+ @NonNull Transitions.TransitionFinishCallback finishCallback,
+ @NonNull WindowContainerToken mainRoot, @NonNull WindowContainerToken sideRoot) {
+ mFinishCallback = finishCallback;
+ mAnimatingTransition = transition;
+ if (mRemoteHandler != null) {
+ mRemoteHandler.startAnimation(transition, info, t, mRemoteFinishCB);
+ mRemoteHandler = null;
+ return;
+ }
+ playInternalAnimation(transition, info, t, mainRoot, sideRoot);
+ }
+
+ private void playInternalAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction t, @NonNull WindowContainerToken mainRoot,
+ @NonNull WindowContainerToken sideRoot) {
+ mFinishTransaction = mTransactionPool.acquire();
+
+ // Play some place-holder fade animations
+ for (int i = info.getChanges().size() - 1; i >= 0; --i) {
+ final TransitionInfo.Change change = info.getChanges().get(i);
+ final SurfaceControl leash = change.getLeash();
+ final int mode = info.getChanges().get(i).getMode();
+
+ if (mode == TRANSIT_CHANGE) {
+ if (change.getParent() != null) {
+ // This is probably reparented, so we want the parent to be immediately visible
+ final TransitionInfo.Change parentChange = info.getChange(change.getParent());
+ t.show(parentChange.getLeash());
+ t.setAlpha(parentChange.getLeash(), 1.f);
+ // and then animate this layer outside the parent (since, for example, this is
+ // the home task animating from fullscreen to part-screen).
+ t.reparent(leash, info.getRootLeash());
+ t.setLayer(leash, info.getChanges().size() - i);
+ // build the finish reparent/reposition
+ mFinishTransaction.reparent(leash, parentChange.getLeash());
+ mFinishTransaction.setPosition(leash,
+ change.getEndRelOffset().x, change.getEndRelOffset().y);
+ }
+ // TODO(shell-transitions): screenshot here
+ final Rect startBounds = new Rect(change.getStartAbsBounds());
+ if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) {
+ // Dismissing split via snap which means the still-visible task has been
+ // dragged to its end position at animation start so reflect that here.
+ startBounds.offsetTo(change.getEndAbsBounds().left,
+ change.getEndAbsBounds().top);
+ }
+ final Rect endBounds = new Rect(change.getEndAbsBounds());
+ startBounds.offset(-info.getRootOffset().x, -info.getRootOffset().y);
+ endBounds.offset(-info.getRootOffset().x, -info.getRootOffset().y);
+ startExampleResizeAnimation(leash, startBounds, endBounds);
+ }
+ if (change.getParent() != null) {
+ continue;
+ }
+
+ if (transition == mPendingEnter && (mainRoot.equals(change.getContainer())
+ || sideRoot.equals(change.getContainer()))) {
+ t.setWindowCrop(leash, change.getStartAbsBounds().width(),
+ change.getStartAbsBounds().height());
+ }
+ boolean isOpening = isOpeningType(info.getType());
+ if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) {
+ // fade in
+ startExampleAnimation(leash, true /* show */);
+ } else if (!isOpening && (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK)) {
+ // fade out
+ if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) {
+ // Dismissing via snap-to-top/bottom means that the dismissed task is already
+ // not-visible (usually cropped to oblivion) so immediately set its alpha to 0
+ // and don't animate it so it doesn't pop-in when reparented.
+ t.setAlpha(leash, 0.f);
+ } else {
+ startExampleAnimation(leash, false /* show */);
+ }
+ }
+ }
+ t.apply();
+ onFinish();
+ }
+
+ /** Starts a transition to enter split with a remote transition animator. */
+ IBinder startEnterTransition(@WindowManager.TransitionType int transitType,
+ @NonNull WindowContainerTransaction wct, @Nullable IRemoteTransition remoteTransition,
+ @NonNull Transitions.TransitionHandler handler) {
+ if (remoteTransition != null) {
+ // Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff)
+ mRemoteHandler = new OneShotRemoteHandler(
+ mTransitions.getMainExecutor(), remoteTransition);
+ }
+ final IBinder transition = mTransitions.startTransition(transitType, wct, handler);
+ mPendingEnter = transition;
+ if (mRemoteHandler != null) {
+ mRemoteHandler.setTransition(transition);
+ }
+ return transition;
+ }
+
+ /** Starts a transition for dismissing split after dragging the divider to a screen edge */
+ IBinder startSnapToDismiss(@NonNull WindowContainerTransaction wct,
+ @NonNull Transitions.TransitionHandler handler) {
+ final IBinder transition = mTransitions.startTransition(
+ TRANSIT_SPLIT_DISMISS_SNAP, wct, handler);
+ mPendingDismiss = transition;
+ return transition;
+ }
+
+ void onFinish() {
+ if (!mAnimations.isEmpty()) return;
+ mOnFinish.run();
+ if (mFinishTransaction != null) {
+ mFinishTransaction.apply();
+ mTransactionPool.release(mFinishTransaction);
+ mFinishTransaction = null;
+ }
+ mFinishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
+ mFinishCallback = null;
+ if (mAnimatingTransition == mPendingEnter) {
+ mPendingEnter = null;
+ }
+ if (mAnimatingTransition == mPendingDismiss) {
+ mPendingDismiss = null;
+ }
+ mAnimatingTransition = null;
+ }
+
+ // TODO(shell-transitions): real animations
+ private void startExampleAnimation(@NonNull SurfaceControl leash, boolean show) {
+ final float end = show ? 1.f : 0.f;
+ final float start = 1.f - end;
+ final SurfaceControl.Transaction transaction = mTransactionPool.acquire();
+ final ValueAnimator va = ValueAnimator.ofFloat(start, end);
+ va.setDuration(500);
+ va.addUpdateListener(animation -> {
+ float fraction = animation.getAnimatedFraction();
+ transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);
+ transaction.apply();
+ });
+ final Runnable finisher = () -> {
+ transaction.setAlpha(leash, end);
+ transaction.apply();
+ mTransactionPool.release(transaction);
+ mTransitions.getMainExecutor().execute(() -> {
+ mAnimations.remove(va);
+ onFinish();
+ });
+ };
+ va.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) { }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finisher.run();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ finisher.run();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) { }
+ });
+ mAnimations.add(va);
+ mTransitions.getAnimExecutor().execute(va::start);
+ }
+
+ // TODO(shell-transitions): real animations
+ private void startExampleResizeAnimation(@NonNull SurfaceControl leash,
+ @NonNull Rect startBounds, @NonNull Rect endBounds) {
+ final SurfaceControl.Transaction transaction = mTransactionPool.acquire();
+ final ValueAnimator va = ValueAnimator.ofFloat(0.f, 1.f);
+ va.setDuration(500);
+ va.addUpdateListener(animation -> {
+ float fraction = animation.getAnimatedFraction();
+ transaction.setWindowCrop(leash,
+ (int) (startBounds.width() * (1.f - fraction) + endBounds.width() * fraction),
+ (int) (startBounds.height() * (1.f - fraction)
+ + endBounds.height() * fraction));
+ transaction.setPosition(leash,
+ startBounds.left * (1.f - fraction) + endBounds.left * fraction,
+ startBounds.top * (1.f - fraction) + endBounds.top * fraction);
+ transaction.apply();
+ });
+ final Runnable finisher = () -> {
+ transaction.setWindowCrop(leash, 0, 0);
+ transaction.setPosition(leash, endBounds.left, endBounds.top);
+ transaction.apply();
+ mTransactionPool.release(transaction);
+ mTransitions.getMainExecutor().execute(() -> {
+ mAnimations.remove(va);
+ onFinish();
+ });
+ };
+ va.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finisher.run();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ finisher.run();
+ }
+ });
+ mAnimations.add(va);
+ mTransitions.getAnimExecutor().execute(va::start);
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index b180bb5..c91a92a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -17,31 +17,54 @@
package com.android.wm.shell.splitscreen;
import static android.app.ActivityOptions.KEY_LAUNCH_ROOT_TASK_TOKEN;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.view.WindowManager.transitTypeToString;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_TOP_OR_LEFT;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
+import static com.android.wm.shell.splitscreen.SplitScreen.stageTypeToString;
+import static com.android.wm.shell.splitscreen.SplitScreenTransitions.FLAG_IS_DIVIDER_BAR;
+import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN;
+import static com.android.wm.shell.transition.Transitions.isClosingType;
+import static com.android.wm.shell.transition.Transitions.isOpeningType;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
import android.view.SurfaceControl;
+import android.view.WindowManager;
import android.window.DisplayAreaInfo;
+import android.window.IRemoteTransition;
+import android.window.TransitionInfo;
+import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.split.SplitLayout;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.transition.Transitions;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -61,10 +84,13 @@
* {@link #onStageHasChildrenChanged(StageListenerImpl).}
*/
class StageCoordinator implements SplitLayout.LayoutChangeListener,
- RootTaskDisplayAreaOrganizer.RootTaskDisplayAreaListener {
+ RootTaskDisplayAreaOrganizer.RootTaskDisplayAreaListener, Transitions.TransitionHandler {
private static final String TAG = StageCoordinator.class.getSimpleName();
+ /** internal value for mDismissTop that represents no dismiss */
+ private static final int NO_DISMISS = -2;
+
private final MainStage mMainStage;
private final StageListenerImpl mMainStageListener = new StageListenerImpl();
private final SideStage mSideStage;
@@ -81,11 +107,25 @@
private final Context mContext;
private final List<SplitScreen.SplitScreenListener> mListeners = new ArrayList<>();
private final DisplayImeController mDisplayImeController;
+ private final SplitScreenTransitions mSplitTransitions;
private boolean mExitSplitScreenOnHide = true;
+ @SplitScreen.StageType int mDismissTop = NO_DISMISS;
+ private final Runnable mOnTransitionAnimationComplete = () -> {
+ // If still playing, let it finish.
+ if (!isSplitScreenVisible()) {
+ // Update divider state after animation so that it is still around and positioned
+ // properly for the animation itself.
+ setDividerVisibility(false);
+ mSplitLayout.resetDividerPosition();
+ }
+ mDismissTop = NO_DISMISS;
+ };
+
StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
- DisplayImeController displayImeController) {
+ DisplayImeController displayImeController, Transitions transitions,
+ TransactionPool transactionPool) {
mContext = context;
mDisplayId = displayId;
mSyncQueue = syncQueue;
@@ -95,12 +135,16 @@
mSideStage = new SideStage(mTaskOrganizer, mDisplayId, mSideStageListener, mSyncQueue);
mDisplayImeController = displayImeController;
mRootTDAOrganizer.registerListener(displayId, this);
+ mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions,
+ mOnTransitionAnimationComplete);
+ transitions.addHandler(this);
}
@VisibleForTesting
StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
- MainStage mainStage, SideStage sideStage, DisplayImeController displayImeController) {
+ MainStage mainStage, SideStage sideStage, DisplayImeController displayImeController,
+ SplitLayout splitLayout, Transitions transitions, TransactionPool transactionPool) {
mContext = context;
mDisplayId = displayId;
mSyncQueue = syncQueue;
@@ -110,6 +154,15 @@
mSideStage = sideStage;
mDisplayImeController = displayImeController;
mRootTDAOrganizer.registerListener(displayId, this);
+ mSplitLayout = splitLayout;
+ mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions,
+ mOnTransitionAnimationComplete);
+ transitions.addHandler(this);
+ }
+
+ @VisibleForTesting
+ SplitScreenTransitions getSplitTransitions() {
+ return mSplitTransitions;
}
boolean isSplitScreenVisible() {
@@ -140,6 +193,32 @@
return result;
}
+ /** Starts 2 tasks in one transition. */
+ void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId,
+ @Nullable Bundle sideOptions, @SplitScreen.StagePosition int sidePosition,
+ @Nullable IRemoteTransition remoteTransition) {
+ final WindowContainerTransaction wct = new WindowContainerTransaction();
+ mainOptions = mainOptions != null ? mainOptions : new Bundle();
+ sideOptions = sideOptions != null ? sideOptions : new Bundle();
+ setSideStagePosition(sidePosition);
+
+ // Build a request WCT that will launch both apps such that task 0 is on the main stage
+ // while task 1 is on the side stage.
+ mMainStage.activate(getMainStageBounds(), wct);
+ mSideStage.setBounds(getSideStageBounds(), wct);
+
+ // Make sure the launch options will put tasks in the corresponding split roots
+ addActivityOptions(mainOptions, mMainStage);
+ addActivityOptions(sideOptions, mSideStage);
+
+ // Add task launch requests
+ wct.startTask(mainTaskId, mainOptions);
+ wct.startTask(sideTaskId, sideOptions);
+
+ mSplitTransitions.startEnterTransition(
+ TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this);
+ }
+
@SplitScreen.StagePosition int getSideStagePosition() {
return mSideStagePosition;
}
@@ -150,14 +229,18 @@
}
void setSideStagePosition(@SplitScreen.StagePosition int sideStagePosition) {
- if (mSideStagePosition == sideStagePosition) return;
+ setSideStagePosition(sideStagePosition, true /* updateVisibility */);
+ }
+ private void setSideStagePosition(@SplitScreen.StagePosition int sideStagePosition,
+ boolean updateVisibility) {
+ if (mSideStagePosition == sideStagePosition) return;
mSideStagePosition = sideStagePosition;
- if (mSideStageListener.mVisible) {
+ sendOnStagePositionChanged();
+
+ if (mSideStageListener.mVisible && updateVisibility) {
onStageVisibilityChanged(mSideStageListener);
}
-
- sendOnStagePositionChanged();
}
void setSideStageVisibility(boolean visible) {
@@ -185,14 +268,23 @@
mSplitLayout.resetDividerPosition();
}
+ private void prepareExitSplitScreen(@SplitScreen.StageType int stageToTop,
+ @NonNull WindowContainerTransaction wct) {
+ mSideStage.removeAllTasks(wct, stageToTop == STAGE_TYPE_SIDE);
+ mMainStage.deactivate(wct, stageToTop == STAGE_TYPE_MAIN);
+ }
+
void getStageBounds(Rect outTopOrLeftBounds, Rect outBottomOrRightBounds) {
outTopOrLeftBounds.set(mSplitLayout.getBounds1());
outBottomOrRightBounds.set(mSplitLayout.getBounds2());
}
- void updateActivityOptions(Bundle opts, @SplitScreen.StagePosition int position) {
- final StageTaskListener stage = position == mSideStagePosition ? mSideStage : mMainStage;
+ private void addActivityOptions(Bundle opts, StageTaskListener stage) {
opts.putParcelable(KEY_LAUNCH_ROOT_TASK_TOKEN, stage.mRootTaskInfo.token);
+ }
+
+ void updateActivityOptions(Bundle opts, @SplitScreen.StagePosition int position) {
+ addActivityOptions(opts, position == mSideStagePosition ? mSideStage : mMainStage);
if (!mMainStage.isActive()) {
// Activate the main stage in anticipation of an app launch.
@@ -258,20 +350,21 @@
}
}
+ private void setDividerVisibility(boolean visible) {
+ if (mDividerVisible == visible) return;
+ mDividerVisible = visible;
+ if (visible) {
+ mSplitLayout.init();
+ } else {
+ mSplitLayout.release();
+ }
+ }
+
private void onStageVisibilityChanged(StageListenerImpl stageListener) {
final boolean sideStageVisible = mSideStageListener.mVisible;
final boolean mainStageVisible = mMainStageListener.mVisible;
// Divider is only visible if both the main stage and side stages are visible
- final boolean dividerVisible = sideStageVisible && mainStageVisible;
-
- if (mDividerVisible != dividerVisible) {
- mDividerVisible = dividerVisible;
- if (mDividerVisible) {
- mSplitLayout.init();
- } else {
- mSplitLayout.release();
- }
- }
+ setDividerVisibility(isSplitScreenVisible());
if (mExitSplitScreenOnHide && !mainStageVisible && !sideStageVisible) {
// Exit split-screen if both stage are not visible.
@@ -360,11 +453,22 @@
}
}
+ @VisibleForTesting
+ IBinder onSnappedToDismissTransition(boolean mainStageToTop) {
+ final WindowContainerTransaction wct = new WindowContainerTransaction();
+ prepareExitSplitScreen(mainStageToTop ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE, wct);
+ return mSplitTransitions.startSnapToDismiss(wct, this);
+ }
+
@Override
public void onSnappedToDismiss(boolean bottomOrRight) {
final boolean mainStageToTop =
bottomOrRight ? mSideStagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT
: mSideStagePosition == STAGE_POSITION_TOP_OR_LEFT;
+ if (ENABLE_SHELL_TRANSITIONS) {
+ onSnappedToDismissTransition(mainStageToTop);
+ return;
+ }
exitSplitScreen(mainStageToTop ? mMainStage : mSideStage);
}
@@ -455,6 +559,271 @@
? mSplitLayout.getBounds2() : mSplitLayout.getBounds1();
}
+ /**
+ * Get the stage that should contain this `taskInfo`. The stage doesn't necessarily contain
+ * this task (yet) so this can also be used to identify which stage to put a task into.
+ */
+ private StageTaskListener getStageOfTask(ActivityManager.RunningTaskInfo taskInfo) {
+ // TODO(b/184679596): Find a way to either include task-org information in the transition,
+ // or synchronize task-org callbacks so we can use stage.containsTask
+ if (mMainStage.mRootTaskInfo != null
+ && taskInfo.parentTaskId == mMainStage.mRootTaskInfo.taskId) {
+ return mMainStage;
+ } else if (mSideStage.mRootTaskInfo != null
+ && taskInfo.parentTaskId == mSideStage.mRootTaskInfo.taskId) {
+ return mSideStage;
+ }
+ return null;
+ }
+
+ @SplitScreen.StageType
+ private int getStageType(StageTaskListener stage) {
+ return stage == mMainStage ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE;
+ }
+
+ @Override
+ public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
+ @Nullable TransitionRequestInfo request) {
+ final ActivityManager.RunningTaskInfo triggerTask = request.getTriggerTask();
+ if (triggerTask == null) {
+ // still want to monitor everything while in split-screen, so return non-null.
+ return isSplitScreenVisible() ? new WindowContainerTransaction() : null;
+ }
+
+ WindowContainerTransaction out = null;
+ final @WindowManager.TransitionType int type = request.getType();
+ if (isSplitScreenVisible()) {
+ // try to handle everything while in split-screen, so return a WCT even if it's empty.
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " split is active so using split"
+ + "Transition to handle request. triggerTask=%d type=%s mainChildren=%d"
+ + " sideChildren=%d", triggerTask.taskId, transitTypeToString(type),
+ mMainStage.getChildCount(), mSideStage.getChildCount());
+ out = new WindowContainerTransaction();
+ final StageTaskListener stage = getStageOfTask(triggerTask);
+ if (stage != null) {
+ // dismiss split if the last task in one of the stages is going away
+ if (isClosingType(type) && stage.getChildCount() == 1) {
+ // The top should be the opposite side that is closing:
+ mDismissTop = getStageType(stage) == STAGE_TYPE_MAIN
+ ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN;
+ }
+ } else {
+ if (triggerTask.getActivityType() == ACTIVITY_TYPE_HOME && isOpeningType(type)) {
+ // Going home so dismiss both.
+ mDismissTop = STAGE_TYPE_UNDEFINED;
+ }
+ }
+ if (mDismissTop != NO_DISMISS) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition "
+ + " deduced Dismiss from request. toTop=%s",
+ stageTypeToString(mDismissTop));
+ prepareExitSplitScreen(mDismissTop, out);
+ mSplitTransitions.mPendingDismiss = transition;
+ }
+ } else {
+ // Not in split mode, so look for an open into a split stage just so we can whine and
+ // complain about how this isn't a supported operation.
+ if ((type == TRANSIT_OPEN || type == TRANSIT_TO_FRONT)) {
+ if (getStageOfTask(triggerTask) != null) {
+ throw new IllegalStateException("Entering split implicitly with only one task"
+ + " isn't supported.");
+ }
+ }
+ }
+ return out;
+ }
+
+ @Override
+ public boolean startAnimation(@NonNull IBinder transition,
+ @NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction t,
+ @NonNull Transitions.TransitionFinishCallback finishCallback) {
+ if (transition != mSplitTransitions.mPendingDismiss
+ && transition != mSplitTransitions.mPendingEnter) {
+ // Not entering or exiting, so just do some house-keeping and validation.
+
+ // If we're not in split-mode, just abort so something else can handle it.
+ if (!isSplitScreenVisible()) return false;
+
+ for (int iC = 0; iC < info.getChanges().size(); ++iC) {
+ final TransitionInfo.Change change = info.getChanges().get(iC);
+ final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+ if (taskInfo == null || !taskInfo.hasParentTask()) continue;
+ final StageTaskListener stage = getStageOfTask(taskInfo);
+ if (stage == null) continue;
+ if (isOpeningType(change.getMode())) {
+ if (!stage.containsTask(taskInfo.taskId)) {
+ Log.w(TAG, "Expected onTaskAppeared on " + stage + " to have been called"
+ + " with " + taskInfo.taskId + " before startAnimation().");
+ }
+ } else if (isClosingType(change.getMode())) {
+ if (stage.containsTask(taskInfo.taskId)) {
+ Log.w(TAG, "Expected onTaskVanished on " + stage + " to have been called"
+ + " with " + taskInfo.taskId + " before startAnimation().");
+ }
+ }
+ }
+ if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) {
+ // TODO(shell-transitions): Implement a fallback behavior for now.
+ throw new IllegalStateException("Somehow removed the last task in a stage"
+ + " outside of a proper transition");
+ // This can happen in some pathological cases. For example:
+ // 1. main has 2 tasks [Task A (Single-task), Task B], side has one task [Task C]
+ // 2. Task B closes itself and starts Task A in LAUNCH_ADJACENT at the same time
+ // In this case, the result *should* be that we leave split.
+ // TODO(b/184679596): Find a way to either include task-org information in
+ // the transition, or synchronize task-org callbacks.
+ }
+
+ // Use normal animations.
+ return false;
+ }
+
+ boolean shouldAnimate = true;
+ if (mSplitTransitions.mPendingEnter == transition) {
+ shouldAnimate = startPendingEnterAnimation(transition, info, t);
+ } else if (mSplitTransitions.mPendingDismiss == transition) {
+ shouldAnimate = startPendingDismissAnimation(transition, info, t);
+ }
+ if (!shouldAnimate) return false;
+
+ mSplitTransitions.playAnimation(transition, info, t, finishCallback,
+ mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
+ return true;
+ }
+
+ private boolean startPendingEnterAnimation(@NonNull IBinder transition,
+ @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t) {
+ if (info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN) {
+ // First, verify that we actually have opened 2 apps in split.
+ TransitionInfo.Change mainChild = null;
+ TransitionInfo.Change sideChild = null;
+ for (int iC = 0; iC < info.getChanges().size(); ++iC) {
+ final TransitionInfo.Change change = info.getChanges().get(iC);
+ final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+ if (taskInfo == null || !taskInfo.hasParentTask()) continue;
+ final @SplitScreen.StageType int stageType = getStageType(getStageOfTask(taskInfo));
+ if (stageType == STAGE_TYPE_MAIN) {
+ mainChild = change;
+ } else if (stageType == STAGE_TYPE_SIDE) {
+ sideChild = change;
+ }
+ }
+ if (mainChild == null || sideChild == null) {
+ throw new IllegalStateException("Launched 2 tasks in split, but didn't receive"
+ + " 2 tasks in transition. Possibly one of them failed to launch");
+ // TODO: fallback logic. Probably start a new transition to exit split before
+ // applying anything here. Ideally consolidate with transition-merging.
+ }
+
+ // Update local states (before animating).
+ setDividerVisibility(true);
+ setSideStagePosition(STAGE_POSITION_BOTTOM_OR_RIGHT, false /* updateVisibility */);
+ setSplitsVisible(true);
+
+ addDividerBarToTransition(info, t, true /* show */);
+
+ // Make some noise if things aren't totally expected. These states shouldn't effect
+ // transitions locally, but remotes (like Launcher) may get confused if they were
+ // depending on listener callbacks. This can happen because task-organizer callbacks
+ // aren't serialized with transition callbacks.
+ // TODO(b/184679596): Find a way to either include task-org information in
+ // the transition, or synchronize task-org callbacks.
+ if (!mMainStage.containsTask(mainChild.getTaskInfo().taskId)) {
+ Log.w(TAG, "Expected onTaskAppeared on " + mMainStage
+ + " to have been called with " + mainChild.getTaskInfo().taskId
+ + " before startAnimation().");
+ }
+ if (!mSideStage.containsTask(sideChild.getTaskInfo().taskId)) {
+ Log.w(TAG, "Expected onTaskAppeared on " + mSideStage
+ + " to have been called with " + sideChild.getTaskInfo().taskId
+ + " before startAnimation().");
+ }
+ return true;
+ } else {
+ // TODO: other entry method animations
+ throw new RuntimeException("Unsupported split-entry");
+ }
+ }
+
+ private boolean startPendingDismissAnimation(@NonNull IBinder transition,
+ @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t) {
+ // Make some noise if things aren't totally expected. These states shouldn't effect
+ // transitions locally, but remotes (like Launcher) may get confused if they were
+ // depending on listener callbacks. This can happen because task-organizer callbacks
+ // aren't serialized with transition callbacks.
+ // TODO(b/184679596): Find a way to either include task-org information in
+ // the transition, or synchronize task-org callbacks.
+ if (mMainStage.getChildCount() != 0) {
+ final StringBuilder tasksLeft = new StringBuilder();
+ for (int i = 0; i < mMainStage.getChildCount(); ++i) {
+ tasksLeft.append(i != 0 ? ", " : "");
+ tasksLeft.append(mMainStage.mChildrenTaskInfo.keyAt(i));
+ }
+ Log.w(TAG, "Expected onTaskVanished on " + mMainStage
+ + " to have been called with [" + tasksLeft.toString()
+ + "] before startAnimation().");
+ }
+ if (mSideStage.getChildCount() != 0) {
+ final StringBuilder tasksLeft = new StringBuilder();
+ for (int i = 0; i < mSideStage.getChildCount(); ++i) {
+ tasksLeft.append(i != 0 ? ", " : "");
+ tasksLeft.append(mSideStage.mChildrenTaskInfo.keyAt(i));
+ }
+ Log.w(TAG, "Expected onTaskVanished on " + mSideStage
+ + " to have been called with [" + tasksLeft.toString()
+ + "] before startAnimation().");
+ }
+
+ // Update local states.
+ setSplitsVisible(false);
+ // Wait until after animation to update divider
+
+ if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) {
+ // Reset crops so they don't interfere with subsequent launches
+ t.setWindowCrop(mMainStage.mRootLeash, null);
+ t.setWindowCrop(mSideStage.mRootLeash, null);
+ }
+
+ if (mDismissTop == STAGE_TYPE_UNDEFINED) {
+ // Going home (dismissing both splits)
+
+ // TODO: Have a proper remote for this. Until then, though, reset state and use the
+ // normal animation stuff (which falls back to the normal launcher remote).
+ t.hide(mSplitLayout.getDividerLeash());
+ setDividerVisibility(false);
+ mSplitTransitions.mPendingDismiss = null;
+ return false;
+ }
+
+ addDividerBarToTransition(info, t, false /* show */);
+ // We're dismissing split by moving the other one to fullscreen.
+ // Since we don't have any animations for this yet, just use the internal example
+ // animations.
+ return true;
+ }
+
+ private void addDividerBarToTransition(@NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction t, boolean show) {
+ final SurfaceControl leash = mSplitLayout.getDividerLeash();
+ final TransitionInfo.Change barChange = new TransitionInfo.Change(null /* token */, leash);
+ final Rect bounds = mSplitLayout.getDividerBounds();
+ barChange.setStartAbsBounds(bounds);
+ barChange.setEndAbsBounds(bounds);
+ barChange.setMode(show ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK);
+ barChange.setFlags(FLAG_IS_DIVIDER_BAR);
+ // Technically this should be order-0, but this is running after layer assignment
+ // and it's a special case, so just add to end.
+ info.addChange(barChange);
+ // Be default, make it visible. The remote animator can adjust alpha if it plans to animate.
+ if (show) {
+ t.setAlpha(leash, 1.f);
+ t.setLayer(leash, Integer.MAX_VALUE);
+ t.setPosition(leash, bounds.left, bounds.top);
+ t.show(leash);
+ }
+ }
+
@Override
public void dump(@NonNull PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
@@ -469,6 +838,16 @@
pw.println(innerPrefix + "mSplitLayout=" + mSplitLayout);
}
+ /**
+ * Directly set the visibility of both splits. This assumes hasChildren matches visibility.
+ * This is intended for batch use, so it assumes other state management logic is already
+ * handled.
+ */
+ private void setSplitsVisible(boolean visible) {
+ mMainStageListener.mVisible = mSideStageListener.mVisible = visible;
+ mMainStageListener.mHasChildren = mSideStageListener.mHasChildren = visible;
+ }
+
class StageListenerImpl implements StageTaskListener.StageListenerCallbacks {
boolean mHasRootTask = false;
boolean mVisible = false;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
index b8cdc4ab4d..1da0a2d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
@@ -21,6 +21,8 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS;
+
import android.annotation.CallSuper;
import android.app.ActivityManager;
import android.graphics.Point;
@@ -33,7 +35,6 @@
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.SyncTransactionQueue;
-import com.android.wm.shell.transition.Transitions;
import java.io.PrintWriter;
@@ -76,6 +77,14 @@
taskOrganizer.createRootTask(displayId, WINDOWING_MODE_MULTI_WINDOW, this);
}
+ int getChildCount() {
+ return mChildrenTaskInfo.size();
+ }
+
+ boolean containsTask(int taskId) {
+ return mChildrenTaskInfo.contains(taskId);
+ }
+
@Override
@CallSuper
public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
@@ -83,17 +92,22 @@
mRootLeash = leash;
mRootTaskInfo = taskInfo;
mCallbacks.onRootTaskAppeared();
+ sendStatusChanged();
} else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {
final int taskId = taskInfo.taskId;
mChildrenLeashes.put(taskId, leash);
mChildrenTaskInfo.put(taskId, taskInfo);
updateChildTaskSurface(taskInfo, leash, true /* firstAppeared */);
mCallbacks.onChildTaskStatusChanged(taskId, true /* present */, taskInfo.isVisible);
+ if (ENABLE_SHELL_TRANSITIONS) {
+ // Status is managed/synchronized by the transition lifecycle.
+ return;
+ }
+ sendStatusChanged();
} else {
throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
+ "\n mRootTaskInfo: " + mRootTaskInfo);
}
- sendStatusChanged();
}
@Override
@@ -103,14 +117,20 @@
mRootTaskInfo = taskInfo;
} else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {
mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);
- updateChildTaskSurface(
- taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);
mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */,
taskInfo.isVisible);
+ if (!ENABLE_SHELL_TRANSITIONS) {
+ updateChildTaskSurface(
+ taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);
+ }
} else {
throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
+ "\n mRootTaskInfo: " + mRootTaskInfo);
}
+ if (ENABLE_SHELL_TRANSITIONS) {
+ // Status is managed/synchronized by the transition lifecycle.
+ return;
+ }
sendStatusChanged();
}
@@ -124,8 +144,12 @@
} else if (mChildrenTaskInfo.contains(taskId)) {
mChildrenTaskInfo.remove(taskId);
mChildrenLeashes.remove(taskId);
- sendStatusChanged();
mCallbacks.onChildTaskStatusChanged(taskId, false /* present */, taskInfo.isVisible);
+ if (ENABLE_SHELL_TRANSITIONS) {
+ // Status is managed/synchronized by the transition lifecycle.
+ return;
+ }
+ sendStatusChanged();
} else {
throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
+ "\n mRootTaskInfo: " + mRootTaskInfo);
@@ -166,7 +190,7 @@
mSyncQueue.runInSync(t -> {
t.setWindowCrop(leash, null);
t.setPosition(leash, taskPositionInParent.x, taskPositionInParent.y);
- if (firstAppeared && !Transitions.ENABLE_SHELL_TRANSITIONS) {
+ if (firstAppeared && !ENABLE_SHELL_TRANSITIONS) {
t.setAlpha(leash, 1f);
t.setMatrix(leash, 1, 0, 0, 1);
t.show(leash);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index ca1b53d..64dc47f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -18,6 +18,7 @@
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
+import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
@@ -70,6 +71,12 @@
public static final boolean ENABLE_SHELL_TRANSITIONS =
SystemProperties.getBoolean("persist.debug.shell_transit", false);
+ /** Transition type for dismissing split-screen via dragging the divider off the screen. */
+ public static final int TRANSIT_SPLIT_DISMISS_SNAP = TRANSIT_FIRST_CUSTOM + 1;
+
+ /** Transition type for launching 2 tasks simultaneously. */
+ public static final int TRANSIT_SPLIT_SCREEN_PAIR_OPEN = TRANSIT_FIRST_CUSTOM + 2;
+
private final WindowOrganizer mOrganizer;
private final Context mContext;
private final ShellExecutor mMainExecutor;
@@ -209,6 +216,11 @@
|| type == WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
}
+ /** @return true if the transition was triggered by closing something vs opening something */
+ public static boolean isClosingType(@WindowManager.TransitionType int type) {
+ return type == TRANSIT_CLOSE || type == TRANSIT_TO_BACK;
+ }
+
/**
* Reparents all participants into a shared parent and orders them based on: the global transit
* type, their transit mode, and their destination z-order.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
index 1f58a85..b0de029 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
@@ -17,18 +17,32 @@
package com.android.wm.shell;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import android.app.ActivityManager;
+import android.app.WindowConfiguration;
import android.graphics.Rect;
+import android.os.IBinder;
import android.window.IWindowContainerToken;
import android.window.WindowContainerToken;
public final class TestRunningTaskInfoBuilder {
static int sNextTaskId = 500;
private Rect mBounds = new Rect(0, 0, 100, 100);
- private WindowContainerToken mToken =
- new WindowContainerToken(new IWindowContainerToken.Default());
+
+ private WindowContainerToken mToken = createMockWCToken();
private int mParentTaskId = INVALID_TASK_ID;
+ private @WindowConfiguration.ActivityType int mActivityType = ACTIVITY_TYPE_STANDARD;
+
+ public static WindowContainerToken createMockWCToken() {
+ final IWindowContainerToken itoken = mock(IWindowContainerToken.class);
+ final IBinder asBinder = mock(IBinder.class);
+ doReturn(asBinder).when(itoken).asBinder();
+ return new WindowContainerToken(itoken);
+ }
public TestRunningTaskInfoBuilder setBounds(Rect bounds) {
mBounds.set(bounds);
@@ -40,12 +54,19 @@
return this;
}
+ public TestRunningTaskInfoBuilder setActivityType(
+ @WindowConfiguration.ActivityType int activityType) {
+ mActivityType = activityType;
+ return this;
+ }
+
public ActivityManager.RunningTaskInfo build() {
final ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo();
info.parentTaskId = INVALID_TASK_ID;
info.taskId = sNextTaskId++;
info.parentTaskId = mParentTaskId;
info.configuration.windowConfiguration.setBounds(mBounds);
+ info.configuration.windowConfiguration.setActivityType(mActivityType);
info.token = mToken;
info.isResizeable = true;
return info;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java
new file mode 100644
index 0000000..ab6f7699
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.splitscreen;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.SurfaceControl;
+import android.window.DisplayAreaInfo;
+import android.window.IWindowContainerToken;
+import android.window.WindowContainerToken;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.DisplayImeController;
+import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.TransactionPool;
+import com.android.wm.shell.common.split.SplitLayout;
+import com.android.wm.shell.transition.Transitions;
+
+public class SplitTestUtils {
+
+ static SplitLayout createMockSplitLayout() {
+ final Rect dividerBounds = new Rect(48, 0, 52, 100);
+ final SurfaceControl leash = createMockSurface();
+ SplitLayout out = mock(SplitLayout.class);
+ doReturn(dividerBounds).when(out).getDividerBounds();
+ doReturn(leash).when(out).getDividerLeash();
+ return out;
+ }
+
+ static SurfaceControl createMockSurface() {
+ return createMockSurface(true);
+ }
+
+ static SurfaceControl createMockSurface(boolean valid) {
+ SurfaceControl sc = mock(SurfaceControl.class);
+ ExtendedMockito.doReturn(valid).when(sc).isValid();
+ return sc;
+ }
+
+ static class TestStageCoordinator extends StageCoordinator {
+ final DisplayAreaInfo mDisplayAreaInfo;
+
+ TestStageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
+ RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
+ MainStage mainStage, SideStage sideStage, DisplayImeController imeController,
+ SplitLayout splitLayout, Transitions transitions, TransactionPool transactionPool) {
+ super(context, displayId, syncQueue, rootTDAOrganizer, taskOrganizer, mainStage,
+ sideStage, imeController, splitLayout, transitions, transactionPool);
+
+ // Prepare default TaskDisplayArea for testing.
+ mDisplayAreaInfo = new DisplayAreaInfo(
+ new WindowContainerToken(new IWindowContainerToken.Default()),
+ DEFAULT_DISPLAY,
+ FEATURE_DEFAULT_TASK_CONTAINER);
+ this.onDisplayAreaAppeared(mDisplayAreaInfo);
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
new file mode 100644
index 0000000..18642fc
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.splitscreen;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowManager.TRANSIT_CHANGE;
+import static android.view.WindowManager.TRANSIT_CLOSE;
+import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT;
+
+import static com.android.wm.shell.splitscreen.SplitTestUtils.createMockSurface;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import android.annotation.NonNull;
+import android.app.ActivityManager;
+import android.graphics.Rect;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.view.SurfaceControl;
+import android.window.IRemoteTransition;
+import android.window.IRemoteTransitionFinishedCallback;
+import android.window.TransitionInfo;
+import android.window.TransitionRequestInfo;
+import android.window.WindowContainerTransaction;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.TestRunningTaskInfoBuilder;
+import com.android.wm.shell.common.DisplayImeController;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.TransactionPool;
+import com.android.wm.shell.common.split.SplitLayout;
+import com.android.wm.shell.transition.Transitions;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
+
+/** Tests for {@link StageCoordinator} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SplitTransitionTests extends ShellTestCase {
+ @Mock private ShellTaskOrganizer mTaskOrganizer;
+ @Mock private SyncTransactionQueue mSyncQueue;
+ @Mock private RootTaskDisplayAreaOrganizer mRootTDAOrganizer;
+ @Mock private DisplayImeController mDisplayImeController;
+ @Mock private TransactionPool mTransactionPool;
+ @Mock private Transitions mTransitions;
+ private SplitLayout mSplitLayout;
+ private MainStage mMainStage;
+ private SideStage mSideStage;
+ private StageCoordinator mStageCoordinator;
+ private SplitScreenTransitions mSplitScreenTransitions;
+
+ private ActivityManager.RunningTaskInfo mMainChild;
+ private ActivityManager.RunningTaskInfo mSideChild;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ final ShellExecutor mockExecutor = mock(ShellExecutor.class);
+ doReturn(mockExecutor).when(mTransitions).getMainExecutor();
+ doReturn(mockExecutor).when(mTransitions).getAnimExecutor();
+ doReturn(mock(SurfaceControl.Transaction.class)).when(mTransactionPool).acquire();
+ mSplitLayout = SplitTestUtils.createMockSplitLayout();
+ mMainStage = new MainStage(mTaskOrganizer, DEFAULT_DISPLAY, mock(
+ StageTaskListener.StageListenerCallbacks.class), mSyncQueue);
+ mMainStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface());
+ mSideStage = new SideStage(mTaskOrganizer, DEFAULT_DISPLAY, mock(
+ StageTaskListener.StageListenerCallbacks.class), mSyncQueue);
+ mSideStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface());
+ mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY,
+ mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage,
+ mDisplayImeController, mSplitLayout, mTransitions, mTransactionPool);
+ mSplitScreenTransitions = mStageCoordinator.getSplitTransitions();
+ doAnswer((Answer<IBinder>) invocation -> mock(IBinder.class))
+ .when(mTransitions).startTransition(anyInt(), any(), any());
+
+ mMainChild = new TestRunningTaskInfoBuilder()
+ .setParentTaskId(mMainStage.mRootTaskInfo.taskId).build();
+ mSideChild = new TestRunningTaskInfoBuilder()
+ .setParentTaskId(mSideStage.mRootTaskInfo.taskId).build();
+ }
+
+ @Test
+ public void testLaunchPair() {
+ TransitionInfo info = createEnterPairInfo();
+
+ TestRemoteTransition testRemote = new TestRemoteTransition();
+
+ IBinder transition = mSplitScreenTransitions.startEnterTransition(
+ TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), testRemote,
+ mStageCoordinator);
+ mMainStage.onTaskAppeared(mMainChild, createMockSurface());
+ mSideStage.onTaskAppeared(mSideChild, createMockSurface());
+ boolean accepted = mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertTrue(accepted);
+
+ // Make sure split-screen is now visible
+ assertTrue(mStageCoordinator.isSplitScreenVisible());
+ assertTrue(testRemote.mCalled);
+ }
+
+ @Test
+ public void testMonitorInSplit() {
+ enterSplit();
+
+ ActivityManager.RunningTaskInfo newTask = new TestRunningTaskInfoBuilder()
+ .setParentTaskId(mSideStage.mRootTaskInfo.taskId).build();
+
+ // Create a request to start a new task in side stage
+ TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_TO_FRONT, newTask, null);
+ IBinder transition = mock(IBinder.class);
+ WindowContainerTransaction result =
+ mStageCoordinator.handleRequest(transition, request);
+
+ // while in split, it should handle everything:
+ assertNotNull(result);
+
+ // Not exiting, just opening up another side-stage task.
+ assertFalse(containsSplitExit(result));
+
+ // simulate the transition
+ TransitionInfo.Change openChange = createChange(TRANSIT_TO_FRONT, newTask);
+ TransitionInfo.Change hideChange = createChange(TRANSIT_TO_BACK, mSideChild);
+
+ TransitionInfo info = new TransitionInfo(TRANSIT_TO_FRONT, 0);
+ info.addChange(openChange);
+ info.addChange(hideChange);
+ mSideStage.onTaskAppeared(newTask, createMockSurface());
+ boolean accepted = mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertFalse(accepted);
+ assertTrue(mStageCoordinator.isSplitScreenVisible());
+
+ // same, but create request to close the new task
+ request = new TransitionRequestInfo(TRANSIT_CLOSE, newTask, null);
+ transition = mock(IBinder.class);
+ result = mStageCoordinator.handleRequest(transition, request);
+ assertNotNull(result);
+ assertFalse(containsSplitExit(result));
+
+ TransitionInfo.Change showChange = createChange(TRANSIT_TO_FRONT, mSideChild);
+ TransitionInfo.Change closeChange = createChange(TRANSIT_CLOSE, newTask);
+
+ info = new TransitionInfo(TRANSIT_CLOSE, 0);
+ info.addChange(showChange);
+ info.addChange(closeChange);
+ mSideStage.onTaskVanished(newTask);
+ accepted = mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertFalse(accepted);
+ assertTrue(mStageCoordinator.isSplitScreenVisible());
+ }
+
+ @Test
+ public void testDismissToHome() {
+ enterSplit();
+
+ ActivityManager.RunningTaskInfo homeTask = new TestRunningTaskInfoBuilder()
+ .setActivityType(ACTIVITY_TYPE_HOME).build();
+
+ // Create a request to bring home forward
+ TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_TO_FRONT, homeTask, null);
+ IBinder transition = mock(IBinder.class);
+ WindowContainerTransaction result = mStageCoordinator.handleRequest(transition, request);
+
+ assertTrue(containsSplitExit(result));
+
+ // make sure we haven't made any local changes yet (need to wait until transition is ready)
+ assertTrue(mStageCoordinator.isSplitScreenVisible());
+
+ // simulate the transition
+ TransitionInfo.Change homeChange = createChange(TRANSIT_TO_FRONT, homeTask);
+ TransitionInfo.Change mainChange = createChange(TRANSIT_TO_BACK, mMainChild);
+ TransitionInfo.Change sideChange = createChange(TRANSIT_TO_BACK, mSideChild);
+
+ TransitionInfo info = new TransitionInfo(TRANSIT_TO_FRONT, 0);
+ info.addChange(homeChange);
+ info.addChange(mainChange);
+ info.addChange(sideChange);
+ mMainStage.onTaskVanished(mMainChild);
+ mSideStage.onTaskVanished(mSideChild);
+ mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertFalse(mStageCoordinator.isSplitScreenVisible());
+ }
+
+ @Test
+ public void testDismissSnap() {
+ enterSplit();
+
+ // simulate the transition
+ TransitionInfo.Change mainChange = createChange(TRANSIT_TO_BACK, mMainChild);
+ TransitionInfo.Change sideChange = createChange(TRANSIT_CHANGE, mSideChild);
+
+ TransitionInfo info = new TransitionInfo(TRANSIT_TO_BACK, 0);
+ info.addChange(mainChange);
+ info.addChange(sideChange);
+ IBinder transition = mStageCoordinator.onSnappedToDismissTransition(
+ false /* mainStageToTop */);
+ mMainStage.onTaskVanished(mMainChild);
+ mSideStage.onTaskVanished(mSideChild);
+ boolean accepted = mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertTrue(accepted);
+ assertFalse(mStageCoordinator.isSplitScreenVisible());
+ }
+
+ @Test
+ public void testDismissFromAppFinish() {
+ enterSplit();
+
+ // Create a request to exit the "last" task on side stage
+ TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_CLOSE, mSideChild, null);
+ IBinder transition = mock(IBinder.class);
+ WindowContainerTransaction result = mStageCoordinator.handleRequest(transition, request);
+
+ assertTrue(containsSplitExit(result));
+
+ // make sure we haven't made any local changes yet (need to wait until transition is ready)
+ assertTrue(mStageCoordinator.isSplitScreenVisible());
+
+ // simulate the transition
+ TransitionInfo.Change mainChange = createChange(TRANSIT_CHANGE, mMainChild);
+ TransitionInfo.Change sideChange = createChange(TRANSIT_CLOSE, mSideChild);
+
+ TransitionInfo info = new TransitionInfo(TRANSIT_CLOSE, 0);
+ info.addChange(mainChange);
+ info.addChange(sideChange);
+ mMainStage.onTaskVanished(mMainChild);
+ mSideStage.onTaskVanished(mSideChild);
+ boolean accepted = mStageCoordinator.startAnimation(transition, info,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ assertTrue(accepted);
+ assertFalse(mStageCoordinator.isSplitScreenVisible());
+ }
+
+ private TransitionInfo createEnterPairInfo() {
+ TransitionInfo.Change mainChange = createChange(TRANSIT_OPEN, mMainChild);
+ TransitionInfo.Change sideChange = createChange(TRANSIT_OPEN, mSideChild);
+
+ TransitionInfo info = new TransitionInfo(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0);
+ info.addChange(mainChange);
+ info.addChange(sideChange);
+ return info;
+ }
+
+ private void enterSplit() {
+ TransitionInfo enterInfo = createEnterPairInfo();
+ IBinder enterTransit = mSplitScreenTransitions.startEnterTransition(
+ TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(),
+ new TestRemoteTransition(), mStageCoordinator);
+ mMainStage.onTaskAppeared(mMainChild, createMockSurface());
+ mSideStage.onTaskAppeared(mSideChild, createMockSurface());
+ mStageCoordinator.startAnimation(enterTransit, enterInfo,
+ mock(SurfaceControl.Transaction.class),
+ mock(Transitions.TransitionFinishCallback.class));
+ mMainStage.activate(new Rect(0, 0, 100, 100), new WindowContainerTransaction());
+ }
+
+ private boolean containsSplitExit(@NonNull WindowContainerTransaction wct) {
+ // reparenting of child tasks to null constitutes exiting split.
+ boolean reparentedMain = false;
+ boolean reparentedSide = false;
+ for (int i = 0; i < wct.getHierarchyOps().size(); ++i) {
+ WindowContainerTransaction.HierarchyOp op = wct.getHierarchyOps().get(i);
+ if (op.getType() == HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT) {
+ if (op.getContainer() == mMainStage.mRootTaskInfo.token.asBinder()
+ && op.getNewParent() == null) {
+ reparentedMain = true;
+ } else if (op.getContainer() == mSideStage.mRootTaskInfo.token.asBinder()
+ && op.getNewParent() == null) {
+ reparentedSide = true;
+ }
+ }
+ }
+ return reparentedMain && reparentedSide;
+ }
+
+ private static TransitionInfo.Change createChange(@TransitionInfo.TransitionMode int mode,
+ ActivityManager.RunningTaskInfo taskInfo) {
+ TransitionInfo.Change out = new TransitionInfo.Change(taskInfo.token, createMockSurface());
+ out.setMode(mode);
+ out.setTaskInfo(taskInfo);
+ return out;
+ }
+
+ class TestRemoteTransition extends IRemoteTransition.Stub {
+ boolean mCalled = false;
+ final WindowContainerTransaction mRemoteFinishWCT = new WindowContainerTransaction();
+
+ @Override
+ public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+ IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+ mCalled = true;
+ finishCallback.onTransitionFinished(mRemoteFinishWCT);
+ }
+ }
+
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
index 74753aa..924e946 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
@@ -17,7 +17,6 @@
package com.android.wm.shell.splitscreen;
import static android.view.Display.DEFAULT_DISPLAY;
-import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_BOTTOM_OR_RIGHT;
@@ -27,11 +26,7 @@
import static org.mockito.Mockito.verify;
import android.app.ActivityManager;
-import android.content.Context;
import android.graphics.Rect;
-import android.window.DisplayAreaInfo;
-import android.window.IWindowContainerToken;
-import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -43,6 +38,8 @@
import com.android.wm.shell.TestRunningTaskInfoBuilder;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.TransactionPool;
+import com.android.wm.shell.transition.Transitions;
import org.junit.Before;
import org.junit.Test;
@@ -60,13 +57,16 @@
@Mock private MainStage mMainStage;
@Mock private SideStage mSideStage;
@Mock private DisplayImeController mDisplayImeController;
+ @Mock private Transitions mTransitions;
+ @Mock private TransactionPool mTransactionPool;
private StageCoordinator mStageCoordinator;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mStageCoordinator = new TestStageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue,
- mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage, mDisplayImeController);
+ mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY,
+ mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage,
+ mDisplayImeController, null /* splitLayout */, mTransitions, mTransactionPool);
}
@Test
@@ -90,22 +90,4 @@
verify(mSideStage).removeTask(
eq(task.taskId), any(), any(WindowContainerTransaction.class));
}
-
- private static class TestStageCoordinator extends StageCoordinator {
- final DisplayAreaInfo mDisplayAreaInfo;
-
- TestStageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
- RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
- MainStage mainStage, SideStage sideStage, DisplayImeController imeController) {
- super(context, displayId, syncQueue, rootTDAOrganizer, taskOrganizer, mainStage,
- sideStage, imeController);
-
- // Prepare default TaskDisplayArea for testing.
- mDisplayAreaInfo = new DisplayAreaInfo(
- new WindowContainerToken(new IWindowContainerToken.Default()),
- DEFAULT_DISPLAY,
- FEATURE_DEFAULT_TASK_CONTAINER);
- this.onDisplayAreaAppeared(mDisplayAreaInfo);
- }
- }
}
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index c75b21f..9270901 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -503,6 +503,7 @@
"RenderProperties.cpp",
"RootRenderNode.cpp",
"SkiaCanvas.cpp",
+ "SkiaInterpolator.cpp",
"VectorDrawable.cpp",
],
diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp
index 2448cc9..51fbf36 100644
--- a/libs/hwui/FrameInfo.cpp
+++ b/libs/hwui/FrameInfo.cpp
@@ -21,29 +21,16 @@
namespace uirenderer {
const std::array FrameInfoNames{
- "Flags",
- "FrameTimelineVsyncId",
- "IntendedVsync",
- "Vsync",
- "InputEventId",
- "HandleInputStart",
- "AnimationStart",
- "PerformTraversalsStart",
- "DrawStart",
- "FrameDeadline",
- "SyncQueued",
- "SyncStart",
- "IssueDrawCommandsStart",
- "SwapBuffers",
- "FrameCompleted",
- "DequeueBufferDuration",
- "QueueBufferDuration",
- "GpuCompleted",
- "SwapBuffersCompleted",
- "DisplayPresentTime",
+ "Flags", "FrameTimelineVsyncId", "IntendedVsync",
+ "Vsync", "InputEventId", "HandleInputStart",
+ "AnimationStart", "PerformTraversalsStart", "DrawStart",
+ "FrameDeadline", "FrameStartTime", "SyncQueued",
+ "SyncStart", "IssueDrawCommandsStart", "SwapBuffers",
+ "FrameCompleted", "DequeueBufferDuration", "QueueBufferDuration",
+ "GpuCompleted", "SwapBuffersCompleted", "DisplayPresentTime",
};
-static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 20,
+static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 21,
"Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)");
void FrameInfo::importUiThreadInfo(int64_t* info) {
diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h
index e9b2f4a..62ac4ca 100644
--- a/libs/hwui/FrameInfo.h
+++ b/libs/hwui/FrameInfo.h
@@ -28,7 +28,7 @@
namespace android {
namespace uirenderer {
-static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 10;
+static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 11;
enum class FrameInfoIndex {
Flags = 0,
@@ -41,6 +41,7 @@
PerformTraversalsStart,
DrawStart,
FrameDeadline,
+ FrameStartTime,
// End of UI frame info
SyncQueued,
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index e58f31f..7af0a22 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -81,6 +81,9 @@
int Properties::contextPriority = 0;
float Properties::defaultSdrWhitePoint = 200.f;
+bool Properties::useHintManager = true;
+int Properties::targetCpuTimePercentage = 70;
+
bool Properties::load() {
bool prevDebugLayersUpdates = debugLayersUpdates;
bool prevDebugOverdraw = debugOverdraw;
@@ -128,6 +131,10 @@
runningInEmulator = base::GetBoolProperty(PROPERTY_IS_EMULATOR, false);
+ useHintManager = base::GetBoolProperty(PROPERTY_USE_HINT_MANAGER, true);
+ targetCpuTimePercentage = base::GetIntProperty(PROPERTY_TARGET_CPU_TIME_PERCENTAGE, 70);
+ if (targetCpuTimePercentage <= 0 || targetCpuTimePercentage > 100) targetCpuTimePercentage = 70;
+
return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw);
}
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index ea9cbd5..1cb87be 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -158,6 +158,20 @@
#define PROPERTY_CAPTURE_SKP_FILENAME "debug.hwui.skp_filename"
/**
+ * Controls whether HWUI will send timing hints to HintManager for
+ * better CPU scheduling. Accepted values are "true" and "false".
+ */
+#define PROPERTY_USE_HINT_MANAGER "debug.hwui.use_hint_manager"
+
+/**
+ * Percentage of frame time that's used for CPU work. The rest is
+ * reserved for GPU work. This is used with use_hint_manager to
+ * provide timing hints to HintManager. Accepted values are
+ * integer from 1-100.
+ */
+#define PROPERTY_TARGET_CPU_TIME_PERCENTAGE "debug.hwui.target_cpu_time_percent"
+
+/**
* Property for whether this is running in the emulator.
*/
#define PROPERTY_IS_EMULATOR "ro.boot.qemu"
@@ -253,6 +267,9 @@
static float defaultSdrWhitePoint;
+ static bool useHintManager;
+ static int targetCpuTimePercentage;
+
private:
static ProfileType sProfileType;
static bool sDisableProfileBars;
diff --git a/libs/hwui/SkiaInterpolator.cpp b/libs/hwui/SkiaInterpolator.cpp
new file mode 100644
index 0000000..0695dd1
--- /dev/null
+++ b/libs/hwui/SkiaInterpolator.cpp
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SkiaInterpolator.h"
+
+#include "include/core/SkMath.h"
+#include "include/private/SkFixed.h"
+#include "include/private/SkMalloc.h"
+#include "include/private/SkTo.h"
+#include "src/core/SkTSearch.h"
+
+typedef int Dot14;
+#define Dot14_ONE (1 << 14)
+#define Dot14_HALF (1 << 13)
+
+#define Dot14ToFloat(x) ((x) / 16384.f)
+
+static inline Dot14 Dot14Mul(Dot14 a, Dot14 b) {
+ return (a * b + Dot14_HALF) >> 14;
+}
+
+static inline Dot14 eval_cubic(Dot14 t, Dot14 A, Dot14 B, Dot14 C) {
+ return Dot14Mul(Dot14Mul(Dot14Mul(C, t) + B, t) + A, t);
+}
+
+static inline Dot14 pin_and_convert(float x) {
+ if (x <= 0) {
+ return 0;
+ }
+ if (x >= SK_Scalar1) {
+ return Dot14_ONE;
+ }
+ return SkScalarToFixed(x) >> 2;
+}
+
+static float SkUnitCubicInterp(float value, float bx, float by, float cx, float cy) {
+ // pin to the unit-square, and convert to 2.14
+ Dot14 x = pin_and_convert(value);
+
+ if (x == 0) return 0;
+ if (x == Dot14_ONE) return SK_Scalar1;
+
+ Dot14 b = pin_and_convert(bx);
+ Dot14 c = pin_and_convert(cx);
+
+ // Now compute our coefficients from the control points
+ // t -> 3b
+ // t^2 -> 3c - 6b
+ // t^3 -> 3b - 3c + 1
+ Dot14 A = 3 * b;
+ Dot14 B = 3 * (c - 2 * b);
+ Dot14 C = 3 * (b - c) + Dot14_ONE;
+
+ // Now search for a t value given x
+ Dot14 t = Dot14_HALF;
+ Dot14 dt = Dot14_HALF;
+ for (int i = 0; i < 13; i++) {
+ dt >>= 1;
+ Dot14 guess = eval_cubic(t, A, B, C);
+ if (x < guess) {
+ t -= dt;
+ } else {
+ t += dt;
+ }
+ }
+
+ // Now we have t, so compute the coeff for Y and evaluate
+ b = pin_and_convert(by);
+ c = pin_and_convert(cy);
+ A = 3 * b;
+ B = 3 * (c - 2 * b);
+ C = 3 * (b - c) + Dot14_ONE;
+ return SkFixedToScalar(eval_cubic(t, A, B, C) << 2);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+SkiaInterpolatorBase::SkiaInterpolatorBase() {
+ fStorage = nullptr;
+ fTimes = nullptr;
+ SkDEBUGCODE(fTimesArray = nullptr;)
+}
+
+SkiaInterpolatorBase::~SkiaInterpolatorBase() {
+ if (fStorage) {
+ sk_free(fStorage);
+ }
+}
+
+void SkiaInterpolatorBase::reset(int elemCount, int frameCount) {
+ fFlags = 0;
+ fElemCount = SkToU8(elemCount);
+ fFrameCount = SkToS16(frameCount);
+ fRepeat = SK_Scalar1;
+ if (fStorage) {
+ sk_free(fStorage);
+ fStorage = nullptr;
+ fTimes = nullptr;
+ SkDEBUGCODE(fTimesArray = nullptr);
+ }
+}
+
+/* Each value[] run is formatted as:
+ <time (in msec)>
+ <blend>
+ <data[fElemCount]>
+
+ Totaling fElemCount+2 entries per keyframe
+*/
+
+bool SkiaInterpolatorBase::getDuration(SkMSec* startTime, SkMSec* endTime) const {
+ if (fFrameCount == 0) {
+ return false;
+ }
+
+ if (startTime) {
+ *startTime = fTimes[0].fTime;
+ }
+ if (endTime) {
+ *endTime = fTimes[fFrameCount - 1].fTime;
+ }
+ return true;
+}
+
+float SkiaInterpolatorBase::ComputeRelativeT(SkMSec time, SkMSec prevTime, SkMSec nextTime,
+ const float blend[4]) {
+ SkASSERT(time > prevTime && time < nextTime);
+
+ float t = (float)(time - prevTime) / (float)(nextTime - prevTime);
+ return blend ? SkUnitCubicInterp(t, blend[0], blend[1], blend[2], blend[3]) : t;
+}
+
+SkiaInterpolatorBase::Result SkiaInterpolatorBase::timeToT(SkMSec time, float* T, int* indexPtr,
+ bool* exactPtr) const {
+ SkASSERT(fFrameCount > 0);
+ Result result = kNormal_Result;
+ if (fRepeat != SK_Scalar1) {
+ SkMSec startTime = 0, endTime = 0; // initialize to avoid warning
+ this->getDuration(&startTime, &endTime);
+ SkMSec totalTime = endTime - startTime;
+ SkMSec offsetTime = time - startTime;
+ endTime = SkScalarFloorToInt(fRepeat * totalTime);
+ if (offsetTime >= endTime) {
+ float fraction = SkScalarFraction(fRepeat);
+ offsetTime = fraction == 0 && fRepeat > 0
+ ? totalTime
+ : (SkMSec)SkScalarFloorToInt(fraction * totalTime);
+ result = kFreezeEnd_Result;
+ } else {
+ int mirror = fFlags & kMirror;
+ offsetTime = offsetTime % (totalTime << mirror);
+ if (offsetTime > totalTime) { // can only be true if fMirror is true
+ offsetTime = (totalTime << 1) - offsetTime;
+ }
+ }
+ time = offsetTime + startTime;
+ }
+
+ int index = SkTSearch<SkMSec>(&fTimes[0].fTime, fFrameCount, time, sizeof(SkTimeCode));
+
+ bool exact = true;
+
+ if (index < 0) {
+ index = ~index;
+ if (index == 0) {
+ result = kFreezeStart_Result;
+ } else if (index == fFrameCount) {
+ if (fFlags & kReset) {
+ index = 0;
+ } else {
+ index -= 1;
+ }
+ result = kFreezeEnd_Result;
+ } else {
+ exact = false;
+ }
+ }
+ SkASSERT(index < fFrameCount);
+ const SkTimeCode* nextTime = &fTimes[index];
+ SkMSec nextT = nextTime[0].fTime;
+ if (exact) {
+ *T = 0;
+ } else {
+ SkMSec prevT = nextTime[-1].fTime;
+ *T = ComputeRelativeT(time, prevT, nextT, nextTime[-1].fBlend);
+ }
+ *indexPtr = index;
+ *exactPtr = exact;
+ return result;
+}
+
+SkiaInterpolator::SkiaInterpolator() {
+ INHERITED::reset(0, 0);
+ fValues = nullptr;
+ SkDEBUGCODE(fScalarsArray = nullptr;)
+}
+
+SkiaInterpolator::SkiaInterpolator(int elemCount, int frameCount) {
+ SkASSERT(elemCount > 0);
+ this->reset(elemCount, frameCount);
+}
+
+void SkiaInterpolator::reset(int elemCount, int frameCount) {
+ INHERITED::reset(elemCount, frameCount);
+ fStorage = sk_malloc_throw((sizeof(float) * elemCount + sizeof(SkTimeCode)) * frameCount);
+ fTimes = (SkTimeCode*)fStorage;
+ fValues = (float*)((char*)fStorage + sizeof(SkTimeCode) * frameCount);
+#ifdef SK_DEBUG
+ fTimesArray = (SkTimeCode(*)[10])fTimes;
+ fScalarsArray = (float(*)[10])fValues;
+#endif
+}
+
+#define SK_Fixed1Third (SK_Fixed1 / 3)
+#define SK_Fixed2Third (SK_Fixed1 * 2 / 3)
+
+static const float gIdentityBlend[4] = {0.33333333f, 0.33333333f, 0.66666667f, 0.66666667f};
+
+bool SkiaInterpolator::setKeyFrame(int index, SkMSec time, const float values[],
+ const float blend[4]) {
+ SkASSERT(values != nullptr);
+
+ if (blend == nullptr) {
+ blend = gIdentityBlend;
+ }
+
+ bool success = ~index == SkTSearch<SkMSec>(&fTimes->fTime, index, time, sizeof(SkTimeCode));
+ SkASSERT(success);
+ if (success) {
+ SkTimeCode* timeCode = &fTimes[index];
+ timeCode->fTime = time;
+ memcpy(timeCode->fBlend, blend, sizeof(timeCode->fBlend));
+ float* dst = &fValues[fElemCount * index];
+ memcpy(dst, values, fElemCount * sizeof(float));
+ }
+ return success;
+}
+
+SkiaInterpolator::Result SkiaInterpolator::timeToValues(SkMSec time, float values[]) const {
+ float T;
+ int index;
+ bool exact;
+ Result result = timeToT(time, &T, &index, &exact);
+ if (values) {
+ const float* nextSrc = &fValues[index * fElemCount];
+
+ if (exact) {
+ memcpy(values, nextSrc, fElemCount * sizeof(float));
+ } else {
+ SkASSERT(index > 0);
+
+ const float* prevSrc = nextSrc - fElemCount;
+
+ for (int i = fElemCount - 1; i >= 0; --i) {
+ values[i] = SkScalarInterp(prevSrc[i], nextSrc[i], T);
+ }
+ }
+ }
+ return result;
+}
diff --git a/libs/hwui/SkiaInterpolator.h b/libs/hwui/SkiaInterpolator.h
new file mode 100644
index 0000000..c03f502
--- /dev/null
+++ b/libs/hwui/SkiaInterpolator.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+#ifndef SkiaInterpolator_DEFINED
+#define SkiaInterpolator_DEFINED
+
+#include "include/private/SkTo.h"
+
+class SkiaInterpolatorBase {
+public:
+ enum Result { kNormal_Result, kFreezeStart_Result, kFreezeEnd_Result };
+
+protected:
+ SkiaInterpolatorBase();
+ ~SkiaInterpolatorBase();
+
+public:
+ void reset(int elemCount, int frameCount);
+
+ /** Return the start and end time for this interpolator.
+ If there are no key frames, return false.
+ @param startTime If not null, returns the time (in milliseconds) of the
+ first keyframe. If there are no keyframes, this param
+ is ignored (left unchanged).
+ @param endTime If not null, returns the time (in milliseconds) of the
+ last keyframe. If there are no keyframes, this parameter
+ is ignored (left unchanged).
+ @return True if there are key frames, or false if there are none.
+ */
+ bool getDuration(uint32_t* startTime, uint32_t* endTime) const;
+
+ /** Set the whether the repeat is mirrored.
+ @param mirror If true, the odd repeats interpolate from the last key
+ frame and the first.
+ */
+ void setMirror(bool mirror) { fFlags = SkToU8((fFlags & ~kMirror) | (int)mirror); }
+
+ /** Set the repeat count. The repeat count may be fractional.
+ @param repeatCount Multiplies the total time by this scalar.
+ */
+ void setRepeatCount(float repeatCount) { fRepeat = repeatCount; }
+
+ /** Set the whether the repeat is mirrored.
+ @param reset If true, the odd repeats interpolate from the last key
+ frame and the first.
+ */
+ void setReset(bool reset) { fFlags = SkToU8((fFlags & ~kReset) | (int)reset); }
+
+ Result timeToT(uint32_t time, float* T, int* index, bool* exact) const;
+
+protected:
+ enum Flags { kMirror = 1, kReset = 2, kHasBlend = 4 };
+ static float ComputeRelativeT(uint32_t time, uint32_t prevTime, uint32_t nextTime,
+ const float blend[4] = nullptr);
+ int16_t fFrameCount;
+ uint8_t fElemCount;
+ uint8_t fFlags;
+ float fRepeat;
+ struct SkTimeCode {
+ uint32_t fTime;
+ float fBlend[4];
+ };
+ SkTimeCode* fTimes; // pointer into fStorage
+ void* fStorage;
+#ifdef SK_DEBUG
+ SkTimeCode (*fTimesArray)[10];
+#endif
+};
+
+class SkiaInterpolator : public SkiaInterpolatorBase {
+public:
+ SkiaInterpolator();
+ SkiaInterpolator(int elemCount, int frameCount);
+
+ void reset(int elemCount, int frameCount);
+
+ /** Add or replace a key frame, copying the values[] data into the
+ interpolator.
+ @param index The index of this frame (frames must be ordered by time)
+ @param time The millisecond time for this frame
+ @param values The array of values [elemCount] for this frame. The data
+ is copied into the interpolator.
+ @param blend A positive scalar specifying how to blend between this
+ and the next key frame. [0...1) is a cubic lag/log/lag
+ blend (slow to change at the beginning and end)
+ 1 is a linear blend (default)
+ */
+ bool setKeyFrame(int index, uint32_t time, const float values[],
+ const float blend[4] = nullptr);
+
+ /** Return the computed values given the specified time. Return whether
+ those values are the result of pinning to either the first
+ (kFreezeStart) or last (kFreezeEnd), or from interpolated the two
+ nearest key values (kNormal).
+ @param time The time to sample (in milliseconds)
+ @param (may be null) where to write the computed values.
+ */
+ Result timeToValues(uint32_t time, float values[] = nullptr) const;
+
+private:
+ float* fValues; // pointer into fStorage
+
+ using INHERITED = SkiaInterpolatorBase;
+};
+
+#endif
diff --git a/libs/hwui/jni/Interpolator.cpp b/libs/hwui/jni/Interpolator.cpp
index 146d634..fc3d70b 100644
--- a/libs/hwui/jni/Interpolator.cpp
+++ b/libs/hwui/jni/Interpolator.cpp
@@ -1,26 +1,26 @@
#include "GraphicsJNI.h"
-#include "SkInterpolator.h"
+#include "SkiaInterpolator.h"
static jlong Interpolator_constructor(JNIEnv* env, jobject clazz, jint valueCount, jint frameCount)
{
- return reinterpret_cast<jlong>(new SkInterpolator(valueCount, frameCount));
+ return reinterpret_cast<jlong>(new SkiaInterpolator(valueCount, frameCount));
}
static void Interpolator_destructor(JNIEnv* env, jobject clazz, jlong interpHandle)
{
- SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
+ SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle);
delete interp;
}
static void Interpolator_reset(JNIEnv* env, jobject clazz, jlong interpHandle, jint valueCount, jint frameCount)
{
- SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
+ SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle);
interp->reset(valueCount, frameCount);
}
static void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHandle, jint index, jint msec, jfloatArray valueArray, jfloatArray blendArray)
{
- SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
+ SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle);
AutoJavaFloatArray autoValues(env, valueArray);
AutoJavaFloatArray autoBlend(env, blendArray, 4);
@@ -36,7 +36,7 @@
static void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong interpHandle, jfloat repeatCount, jboolean mirror)
{
- SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
+ SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle);
if (repeatCount > 32000)
repeatCount = 32000;
@@ -46,8 +46,8 @@
static jint Interpolator_timeToValues(JNIEnv* env, jobject clazz, jlong interpHandle, jint msec, jfloatArray valueArray)
{
- SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
- SkInterpolatorBase::Result result;
+ SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle);
+ SkiaInterpolator::Result result;
float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL;
result = interp->timeToValues(msec, (SkScalar*)values);
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
index f24ba5c..bd1da98 100644
--- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
@@ -34,14 +34,18 @@
#include <renderthread/RenderProxy.h>
#include <renderthread/RenderTask.h>
#include <renderthread/RenderThread.h>
+#include <thread/CommonPool.h>
#include <utils/Color.h>
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
#include <utils/Timers.h>
#include <utils/TraceUtils.h>
+#include <pthread.h>
+
#include <algorithm>
#include <atomic>
+#include <vector>
#include "android_graphics_HardwareRendererObserver.h"
@@ -53,6 +57,10 @@
struct {
jclass clazz;
jmethodID invokePictureCapturedCallback;
+ jmethodID createHintSession;
+ jmethodID updateTargetWorkDuration;
+ jmethodID reportActualWorkDuration;
+ jmethodID closeHintSession;
} gHardwareRenderer;
struct {
@@ -71,6 +79,14 @@
return env;
}
+static bool hasExceptionAndClear(JNIEnv* env) {
+ if (GraphicsJNI::hasException(env)) {
+ env->ExceptionClear();
+ return true;
+ }
+ return false;
+}
+
typedef ANativeWindow* (*ANW_fromSurface)(JNIEnv* env, jobject surface);
ANW_fromSurface fromSurface;
@@ -120,6 +136,67 @@
}
};
+class HintSessionWrapper : public LightRefBase<HintSessionWrapper> {
+public:
+ static sp<HintSessionWrapper> create(JNIEnv* env, RenderProxy* proxy) {
+ if (!Properties::useHintManager) return nullptr;
+
+ // Include UI thread (self), render thread, and thread pool.
+ std::vector<int> tids = CommonPool::getThreadIds();
+ tids.push_back(proxy->getRenderThreadTid());
+ tids.push_back(pthread_gettid_np(pthread_self()));
+
+ jintArray tidsArray = env->NewIntArray(tids.size());
+ if (hasExceptionAndClear(env)) return nullptr;
+ env->SetIntArrayRegion(tidsArray, 0, tids.size(), reinterpret_cast<jint*>(tids.data()));
+ if (hasExceptionAndClear(env)) return nullptr;
+ jobject session = env->CallStaticObjectMethod(
+ gHardwareRenderer.clazz, gHardwareRenderer.createHintSession, tidsArray);
+ if (hasExceptionAndClear(env) || !session) return nullptr;
+ return new HintSessionWrapper(env, session);
+ }
+
+ ~HintSessionWrapper() {
+ if (!mSession) return;
+ JNIEnv* env = getenv(mVm);
+ env->CallStaticVoidMethod(gHardwareRenderer.clazz, gHardwareRenderer.closeHintSession,
+ mSession);
+ hasExceptionAndClear(env);
+ env->DeleteGlobalRef(mSession);
+ mSession = nullptr;
+ }
+
+ void updateTargetWorkDuration(long targetDurationNanos) {
+ if (!mSession) return;
+ JNIEnv* env = getenv(mVm);
+ env->CallStaticVoidMethod(gHardwareRenderer.clazz,
+ gHardwareRenderer.updateTargetWorkDuration, mSession,
+ static_cast<jlong>(targetDurationNanos));
+ hasExceptionAndClear(env);
+ }
+
+ void reportActualWorkDuration(long actualDurationNanos) {
+ if (!mSession) return;
+ JNIEnv* env = getenv(mVm);
+ env->CallStaticVoidMethod(gHardwareRenderer.clazz,
+ gHardwareRenderer.reportActualWorkDuration, mSession,
+ static_cast<jlong>(actualDurationNanos));
+ hasExceptionAndClear(env);
+ }
+
+private:
+ HintSessionWrapper(JNIEnv* env, jobject jobject) {
+ env->GetJavaVM(&mVm);
+ if (jobject) {
+ mSession = env->NewGlobalRef(jobject);
+ LOG_ALWAYS_FATAL_IF(!mSession, "Failed to make global ref");
+ }
+ }
+
+ JavaVM* mVm = nullptr;
+ jobject mSession = nullptr;
+};
+
static void android_view_ThreadedRenderer_rotateProcessStatsBuffer(JNIEnv* env, jobject clazz) {
RenderProxy::rotateProcessStatsBuffer();
}
@@ -147,6 +224,12 @@
RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr);
ContextFactoryImpl factory(rootRenderNode);
RenderProxy* proxy = new RenderProxy(translucent, rootRenderNode, &factory);
+ sp<HintSessionWrapper> wrapper = HintSessionWrapper::create(env, proxy);
+ if (wrapper) {
+ proxy->setHintSessionCallbacks(
+ [wrapper](int64_t nanos) { wrapper->updateTargetWorkDuration(nanos); },
+ [wrapper](int64_t nanos) { wrapper->reportActualWorkDuration(nanos); });
+ }
return (jlong) proxy;
}
@@ -769,6 +852,18 @@
gHardwareRenderer.invokePictureCapturedCallback = GetStaticMethodIDOrDie(env, hardwareRenderer,
"invokePictureCapturedCallback",
"(JLandroid/graphics/HardwareRenderer$PictureCapturedCallback;)V");
+ gHardwareRenderer.createHintSession =
+ GetStaticMethodIDOrDie(env, hardwareRenderer, "createHintSession",
+ "([I)Landroid/os/PerformanceHintManager$Session;");
+ gHardwareRenderer.updateTargetWorkDuration =
+ GetStaticMethodIDOrDie(env, hardwareRenderer, "updateTargetWorkDuration",
+ "(Landroid/os/PerformanceHintManager$Session;J)V");
+ gHardwareRenderer.reportActualWorkDuration =
+ GetStaticMethodIDOrDie(env, hardwareRenderer, "reportActualWorkDuration",
+ "(Landroid/os/PerformanceHintManager$Session;J)V");
+ gHardwareRenderer.closeHintSession =
+ GetStaticMethodIDOrDie(env, hardwareRenderer, "closeHintSession",
+ "(Landroid/os/PerformanceHintManager$Session;)V");
jclass frameCallbackClass = FindClassOrDie(env,
"android/graphics/HardwareRenderer$FrameDrawingCallback");
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp
index 3408ffd..7a38a3b 100644
--- a/libs/hwui/renderthread/DrawFrameTask.cpp
+++ b/libs/hwui/renderthread/DrawFrameTask.cpp
@@ -21,6 +21,7 @@
#include "../DeferredLayerUpdater.h"
#include "../DisplayList.h"
+#include "../Properties.h"
#include "../RenderNode.h"
#include "CanvasContext.h"
#include "RenderThread.h"
@@ -44,6 +45,12 @@
mTargetNode = targetNode;
}
+void DrawFrameTask::setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration,
+ std::function<void(int64_t)> reportActualWorkDuration) {
+ mUpdateTargetWorkDuration = std::move(updateTargetWorkDuration);
+ mReportActualWorkDuration = std::move(reportActualWorkDuration);
+}
+
void DrawFrameTask::pushLayerUpdate(DeferredLayerUpdater* layer) {
LOG_ALWAYS_FATAL_IF(!mContext,
"Lifecycle violation, there's no context to pushLayerUpdate with!");
@@ -102,6 +109,9 @@
CanvasContext* context = mContext;
std::function<void(int64_t)> callback = std::move(mFrameCallback);
mFrameCallback = nullptr;
+ int64_t intendedVsync = mFrameInfo[static_cast<int>(FrameInfoIndex::IntendedVsync)];
+ int64_t frameDeadline = mFrameInfo[static_cast<int>(FrameInfoIndex::FrameDeadline)];
+ int64_t frameStartTime = mFrameInfo[static_cast<int>(FrameInfoIndex::FrameStartTime)];
// From this point on anything in "this" is *UNSAFE TO ACCESS*
if (canUnblockUiThread) {
@@ -124,6 +134,25 @@
if (!canUnblockUiThread) {
unblockUiThread();
}
+
+ // These member callbacks are effectively const as they are set once during init, so it's safe
+ // to use these directly instead of making local copies.
+ if (mUpdateTargetWorkDuration && mReportActualWorkDuration) {
+ constexpr int64_t kSanityCheckLowerBound = 100000; // 0.1ms
+ constexpr int64_t kSanityCheckUpperBound = 10000000000; // 10s
+ int64_t targetWorkDuration = frameDeadline - intendedVsync;
+ targetWorkDuration = targetWorkDuration * Properties::targetCpuTimePercentage / 100;
+ if (targetWorkDuration > kSanityCheckLowerBound &&
+ targetWorkDuration < kSanityCheckUpperBound &&
+ targetWorkDuration != mLastTargetWorkDuration) {
+ mLastTargetWorkDuration = targetWorkDuration;
+ mUpdateTargetWorkDuration(targetWorkDuration);
+ }
+ int64_t frameDuration = systemTime(SYSTEM_TIME_MONOTONIC) - frameStartTime;
+ if (frameDuration > kSanityCheckLowerBound && frameDuration < kSanityCheckUpperBound) {
+ mReportActualWorkDuration(frameDuration);
+ }
+ }
}
bool DrawFrameTask::syncFrameState(TreeInfo& info) {
diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h
index 696cfaef..3bb574a 100644
--- a/libs/hwui/renderthread/DrawFrameTask.h
+++ b/libs/hwui/renderthread/DrawFrameTask.h
@@ -61,6 +61,8 @@
virtual ~DrawFrameTask();
void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode);
+ void setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration,
+ std::function<void(int64_t)> reportActualWorkDuration);
void setContentDrawBounds(int left, int top, int right, int bottom) {
mContentDrawBounds.set(left, top, right, bottom);
}
@@ -107,6 +109,10 @@
std::function<void(int64_t)> mFrameCallback;
std::function<void(int64_t)> mFrameCompleteCallback;
+
+ nsecs_t mLastTargetWorkDuration = 0;
+ std::function<void(int64_t)> mUpdateTargetWorkDuration;
+ std::function<void(int64_t)> mReportActualWorkDuration;
};
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 423cc08..9361abd 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -76,6 +76,12 @@
mRenderThread.queue().runSync([this, name]() { mContext->setName(std::string(name)); });
}
+void RenderProxy::setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration,
+ std::function<void(int64_t)> reportActualWorkDuration) {
+ mDrawFrameTask.setHintSessionCallbacks(std::move(updateTargetWorkDuration),
+ std::move(reportActualWorkDuration));
+}
+
void RenderProxy::setSurface(ANativeWindow* window, bool enableTimeout) {
if (window) { ANativeWindow_acquire(window); }
mRenderThread.queue().post([this, win = window, enableTimeout]() mutable {
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 366d6b5..8d55d3c 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -71,6 +71,8 @@
void setSwapBehavior(SwapBehavior swapBehavior);
bool loadSystemProperties();
void setName(const char* name);
+ void setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration,
+ std::function<void(int64_t)> reportActualWorkDuration);
void setSurface(ANativeWindow* window, bool enableTimeout = true);
void setSurfaceControl(ASurfaceControl* surfaceControl);
diff --git a/libs/hwui/thread/CommonPool.cpp b/libs/hwui/thread/CommonPool.cpp
index d011bdf..dc92f9f 100644
--- a/libs/hwui/thread/CommonPool.cpp
+++ b/libs/hwui/thread/CommonPool.cpp
@@ -29,14 +29,23 @@
ATRACE_CALL();
CommonPool* pool = this;
+ std::mutex mLock;
+ std::vector<int> tids(THREAD_COUNT);
+ std::vector<std::condition_variable> tidConditionVars(THREAD_COUNT);
+
// Create 2 workers
for (int i = 0; i < THREAD_COUNT; i++) {
- std::thread worker([pool, i] {
+ std::thread worker([pool, i, &mLock, &tids, &tidConditionVars] {
{
std::array<char, 20> name{"hwuiTask"};
snprintf(name.data(), name.size(), "hwuiTask%d", i);
auto self = pthread_self();
pthread_setname_np(self, name.data());
+ {
+ std::unique_lock lock(mLock);
+ tids[i] = pthread_gettid_np(self);
+ tidConditionVars[i].notify_one();
+ }
setpriority(PRIO_PROCESS, 0, PRIORITY_FOREGROUND);
auto startHook = renderthread::RenderThread::getOnStartHook();
if (startHook) {
@@ -47,6 +56,15 @@
});
worker.detach();
}
+ {
+ std::unique_lock lock(mLock);
+ for (int i = 0; i < THREAD_COUNT; i++) {
+ while (!tids[i]) {
+ tidConditionVars[i].wait(lock);
+ }
+ }
+ }
+ mWorkerThreadIds = std::move(tids);
}
CommonPool& CommonPool::instance() {
@@ -58,6 +76,10 @@
instance().enqueue(std::move(task));
}
+std::vector<int> CommonPool::getThreadIds() {
+ return instance().mWorkerThreadIds;
+}
+
void CommonPool::enqueue(Task&& task) {
std::unique_lock lock(mLock);
while (!mWorkQueue.hasSpace()) {
@@ -104,4 +126,4 @@
}
} // namespace uirenderer
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/libs/hwui/thread/CommonPool.h b/libs/hwui/thread/CommonPool.h
index 7603eee..74f852b 100644
--- a/libs/hwui/thread/CommonPool.h
+++ b/libs/hwui/thread/CommonPool.h
@@ -25,6 +25,7 @@
#include <functional>
#include <future>
#include <mutex>
+#include <vector>
namespace android {
namespace uirenderer {
@@ -97,6 +98,8 @@
return task.get_future().get();
};
+ static std::vector<int> getThreadIds();
+
// For testing purposes only, blocks until all worker threads are parked.
static void waitForIdle();
@@ -111,6 +114,8 @@
void workerLoop();
+ std::vector<int> mWorkerThreadIds;
+
std::mutex mLock;
std::condition_variable mCondition;
int mWaitingThreads = 0;
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 7e729d8..a031b4c 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -870,8 +870,12 @@
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
- public @NonNull Builder setHotwordMode() {
- mFlags |= FLAG_HW_HOTWORD;
+ public @NonNull Builder setHotwordModeEnabled(boolean enable) {
+ if (enable) {
+ mFlags |= FLAG_HW_HOTWORD;
+ } else {
+ mFlags &= ~FLAG_HW_HOTWORD;
+ }
return this;
}
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 9300f13..09b382e 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -20,6 +20,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.TestApi;
import android.util.SparseIntArray;
import java.lang.annotation.Retention;
@@ -172,6 +173,11 @@
@RequiresPermission(Manifest.permission.CAPTURE_AUDIO_OUTPUT)
public static final int TYPE_ECHO_REFERENCE = 28;
+ /**
+ * A device type describing the Enhanced Audio Return Channel of an HDMI connection.
+ */
+ public static final int TYPE_HDMI_EARC = 29;
+
/** @hide */
@IntDef(flag = false, prefix = "TYPE", value = {
TYPE_BUILTIN_EARPIECE,
@@ -188,6 +194,7 @@
TYPE_TELEPHONY,
TYPE_LINE_ANALOG,
TYPE_HDMI_ARC,
+ TYPE_HDMI_EARC,
TYPE_LINE_DIGITAL,
TYPE_FM,
TYPE_AUX_LINE,
@@ -197,6 +204,8 @@
TYPE_BUILTIN_MIC,
TYPE_FM_TUNER,
TYPE_TV_TUNER,
+ TYPE_BUILTIN_SPEAKER_SAFE,
+ TYPE_REMOTE_SUBMIX,
TYPE_BLE_HEADSET,
TYPE_BLE_SPEAKER,
TYPE_ECHO_REFERENCE}
@@ -222,7 +231,10 @@
TYPE_LINE_DIGITAL,
TYPE_IP,
TYPE_BUS,
+ TYPE_REMOTE_SUBMIX,
TYPE_BLE_HEADSET,
+ TYPE_HDMI_ARC,
+ TYPE_HDMI_EARC,
TYPE_ECHO_REFERENCE}
)
@Retention(RetentionPolicy.SOURCE)
@@ -244,12 +256,14 @@
TYPE_TELEPHONY,
TYPE_LINE_ANALOG,
TYPE_HDMI_ARC,
+ TYPE_HDMI_EARC,
TYPE_LINE_DIGITAL,
TYPE_FM,
TYPE_AUX_LINE,
TYPE_IP,
TYPE_BUS,
TYPE_HEARING_AID,
+ TYPE_BUILTIN_SPEAKER_SAFE,
TYPE_BLE_HEADSET,
TYPE_BLE_SPEAKER}
)
@@ -273,6 +287,7 @@
case TYPE_TELEPHONY:
case TYPE_LINE_ANALOG:
case TYPE_HDMI_ARC:
+ case TYPE_HDMI_EARC:
case TYPE_LINE_DIGITAL:
case TYPE_FM:
case TYPE_AUX_LINE:
@@ -309,6 +324,8 @@
case TYPE_BUS:
case TYPE_REMOTE_SUBMIX:
case TYPE_BLE_HEADSET:
+ case TYPE_HDMI_ARC:
+ case TYPE_HDMI_EARC:
case TYPE_ECHO_REFERENCE:
return true;
default:
@@ -318,9 +335,15 @@
/**
* @hide
- * Throws IAE on an invalid output device type
+ * Enforces whether the audio device type is acceptable for output.
+ *
+ * A vendor implemented output type should modify isValidAudioDeviceTypeOut()
+ * appropriately to accept the new type. Do not remove already acceptable types.
+ *
+ * @throws IllegalArgumentException on an invalid output device type.
* @param type
*/
+ @TestApi
public static void enforceValidAudioDeviceTypeOut(int type) {
if (!isValidAudioDeviceTypeOut(type)) {
throw new IllegalArgumentException("Illegal output device type " + type);
@@ -329,9 +352,15 @@
/**
* @hide
- * Throws IAE on an invalid input device type
+ * Enforces whether the audio device type is acceptable for input.
+ *
+ * A vendor implemented input type should modify isValidAudioDeviceTypeIn()
+ * appropriately to accept the new type. Do not remove already acceptable types.
+ *
+ * @throws IllegalArgumentException on an invalid input device type.
* @param type
*/
+ @TestApi
public static void enforceValidAudioDeviceTypeIn(int type) {
if (!isValidAudioDeviceTypeIn(type)) {
throw new IllegalArgumentException("Illegal input device type " + type);
@@ -609,6 +638,7 @@
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_TELEPHONY_TX, TYPE_TELEPHONY);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_LINE, TYPE_LINE_ANALOG);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI_ARC, TYPE_HDMI_ARC);
+ INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI_EARC, TYPE_HDMI_EARC);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_SPDIF, TYPE_LINE_DIGITAL);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_FM, TYPE_FM);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_AUX_LINE, TYPE_AUX_LINE);
@@ -641,6 +671,8 @@
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BUS, TYPE_BUS);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_REMOTE_SUBMIX, TYPE_REMOTE_SUBMIX);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BLE_HEADSET, TYPE_BLE_HEADSET);
+ INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_HDMI_ARC, TYPE_HDMI_ARC);
+ INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_HDMI_EARC, TYPE_HDMI_EARC);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_ECHO_REFERENCE, TYPE_ECHO_REFERENCE);
@@ -656,6 +688,7 @@
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLUETOOTH_A2DP, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI, AudioSystem.DEVICE_OUT_HDMI);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI_ARC, AudioSystem.DEVICE_OUT_HDMI_ARC);
+ EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI_EARC, AudioSystem.DEVICE_OUT_HDMI_EARC);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_DEVICE, AudioSystem.DEVICE_OUT_USB_DEVICE);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_HEADSET, AudioSystem.DEVICE_OUT_USB_HEADSET);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_ACCESSORY, AudioSystem.DEVICE_OUT_USB_ACCESSORY);
@@ -700,6 +733,8 @@
EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
TYPE_REMOTE_SUBMIX, AudioSystem.DEVICE_IN_REMOTE_SUBMIX);
EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_BLE_HEADSET, AudioSystem.DEVICE_IN_BLE_HEADSET);
+ EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_HDMI_ARC, AudioSystem.DEVICE_IN_HDMI_ARC);
+ EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_HDMI_EARC, AudioSystem.DEVICE_IN_HDMI_EARC);
EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
TYPE_ECHO_REFERENCE, AudioSystem.DEVICE_IN_ECHO_REFERENCE);
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 5332d75..85d1bc5 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -5189,6 +5189,10 @@
*/
public static final int DEVICE_OUT_HDMI_ARC = AudioSystem.DEVICE_OUT_HDMI_ARC;
/** @hide
+ * The audio output device code for HDMI enhanced Audio Return Channel.
+ */
+ public static final int DEVICE_OUT_HDMI_EARC = AudioSystem.DEVICE_OUT_HDMI_EARC;
+ /** @hide
* The audio output device code for S/PDIF digital connection.
*/
public static final int DEVICE_OUT_SPDIF = AudioSystem.DEVICE_OUT_SPDIF;
@@ -5241,6 +5245,12 @@
AudioSystem.DEVICE_IN_HDMI_ARC;
/** @hide
+ * The audio input device code for HDMI EARC
+ */
+ public static final int DEVICE_IN_HDMI_EARC =
+ AudioSystem.DEVICE_IN_HDMI_EARC;
+
+ /** @hide
* The audio input device code for telephony voice RX path
*/
public static final int DEVICE_IN_TELEPHONY_RX =
@@ -5354,6 +5364,7 @@
* {@link #DEVICE_OUT_TELEPHONY_TX}.
* {@link #DEVICE_OUT_LINE}.
* {@link #DEVICE_OUT_HDMI_ARC}.
+ * {@link #DEVICE_OUT_HDMI_EARC}.
* {@link #DEVICE_OUT_SPDIF}.
* {@link #DEVICE_OUT_FM}.
* {@link #DEVICE_OUT_DEFAULT} is not used here.
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 5f60fb6..363da24 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -890,6 +890,8 @@
/** @hide */
public static final int DEVICE_OUT_HDMI_ARC = 0x40000;
/** @hide */
+ public static final int DEVICE_OUT_HDMI_EARC = 0x40001;
+ /** @hide */
public static final int DEVICE_OUT_SPDIF = 0x80000;
/** @hide */
@UnsupportedAppUsage
@@ -961,6 +963,7 @@
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_TELEPHONY_TX);
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_LINE);
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_HDMI_ARC);
+ DEVICE_OUT_ALL_SET.add(DEVICE_OUT_HDMI_EARC);
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_SPDIF);
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_FM);
DEVICE_OUT_ALL_SET.add(DEVICE_OUT_AUX_LINE);
@@ -993,6 +996,7 @@
DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET = new HashSet<>();
DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_AUX_LINE);
DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_HDMI_ARC);
+ DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_HDMI_EARC);
DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_SPDIF);
DEVICE_ALL_HDMI_SYSTEM_AUDIO_AND_SPEAKER_SET = new HashSet<>();
@@ -1074,6 +1078,8 @@
/** @hide */
public static final int DEVICE_IN_HDMI_ARC = DEVICE_BIT_IN | 0x8000000;
/** @hide */
+ public static final int DEVICE_IN_HDMI_EARC = DEVICE_BIT_IN | 0x8000001;
+ /** @hide */
public static final int DEVICE_IN_ECHO_REFERENCE = DEVICE_BIT_IN | 0x10000000;
/** @hide */
public static final int DEVICE_IN_BLE_HEADSET = DEVICE_BIT_IN | 0x20000000;
@@ -1114,6 +1120,7 @@
DEVICE_IN_ALL_SET.add(DEVICE_IN_USB_HEADSET);
DEVICE_IN_ALL_SET.add(DEVICE_IN_BLUETOOTH_BLE);
DEVICE_IN_ALL_SET.add(DEVICE_IN_HDMI_ARC);
+ DEVICE_IN_ALL_SET.add(DEVICE_IN_HDMI_EARC);
DEVICE_IN_ALL_SET.add(DEVICE_IN_ECHO_REFERENCE);
DEVICE_IN_ALL_SET.add(DEVICE_IN_BLE_HEADSET);
DEVICE_IN_ALL_SET.add(DEVICE_IN_DEFAULT);
@@ -1169,6 +1176,7 @@
/** @hide */ public static final String DEVICE_OUT_TELEPHONY_TX_NAME = "telephony_tx";
/** @hide */ public static final String DEVICE_OUT_LINE_NAME = "line";
/** @hide */ public static final String DEVICE_OUT_HDMI_ARC_NAME = "hmdi_arc";
+ /** @hide */ public static final String DEVICE_OUT_HDMI_EARC_NAME = "hmdi_earc";
/** @hide */ public static final String DEVICE_OUT_SPDIF_NAME = "spdif";
/** @hide */ public static final String DEVICE_OUT_FM_NAME = "fm_transmitter";
/** @hide */ public static final String DEVICE_OUT_AUX_LINE_NAME = "aux_line";
@@ -1208,6 +1216,7 @@
/** @hide */ public static final String DEVICE_IN_BLUETOOTH_BLE_NAME = "bt_ble";
/** @hide */ public static final String DEVICE_IN_ECHO_REFERENCE_NAME = "echo_reference";
/** @hide */ public static final String DEVICE_IN_HDMI_ARC_NAME = "hdmi_arc";
+ /** @hide */ public static final String DEVICE_IN_HDMI_EARC_NAME = "hdmi_earc";
/** @hide */ public static final String DEVICE_IN_BLE_HEADSET_NAME = "ble_headset";
/** @hide */
@@ -1253,6 +1262,8 @@
return DEVICE_OUT_LINE_NAME;
case DEVICE_OUT_HDMI_ARC:
return DEVICE_OUT_HDMI_ARC_NAME;
+ case DEVICE_OUT_HDMI_EARC:
+ return DEVICE_OUT_HDMI_EARC_NAME;
case DEVICE_OUT_SPDIF:
return DEVICE_OUT_SPDIF_NAME;
case DEVICE_OUT_FM:
@@ -1339,6 +1350,8 @@
return DEVICE_IN_ECHO_REFERENCE_NAME;
case DEVICE_IN_HDMI_ARC:
return DEVICE_IN_HDMI_ARC_NAME;
+ case DEVICE_IN_HDMI_EARC:
+ return DEVICE_IN_HDMI_EARC_NAME;
case DEVICE_IN_BLE_HEADSET:
return DEVICE_IN_BLE_HEADSET_NAME;
case DEVICE_IN_DEFAULT:
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 4968bd1..cc05ecd 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -4742,6 +4742,25 @@
return mType;
}
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+ if (!(o instanceof ParameterDescriptor)) {
+ return false;
+ }
+ ParameterDescriptor other = (ParameterDescriptor) o;
+ return this.mName.equals(other.mName) && this.mType == other.mType;
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.asList(
+ (Object) mName,
+ (Object) Integer.valueOf(mType)).hashCode();
+ }
+
private String mName;
private @MediaFormat.Type int mType;
}
@@ -4766,7 +4785,8 @@
private native ParameterDescriptor native_getParameterDescriptor(@NonNull String name);
/**
- * Subscribe to vendor parameters, so that changes to these parameters generate
+ * Subscribe to vendor parameters, so that these parameters will be present in
+ * {@link #getOutputFormat} and changes to these parameters generate
* output format change event.
* <p>
* Unrecognized parameter names or standard (non-vendor) parameter names will be ignored.
@@ -4795,8 +4815,9 @@
private native void native_subscribeToVendorParameters(@NonNull List<String> names);
/**
- * Unsubscribe from vendor parameters, so that changes to these parameters
- * no longer generate output format change event.
+ * Unsubscribe from vendor parameters, so that these parameters will not be present in
+ * {@link #getOutputFormat} and changes to these parameters no longer generate
+ * output format change event.
* <p>
* Unrecognized parameter names, standard (non-vendor) parameter names will be ignored.
* {@link #reset} also resets the list of subscribed parameters.
@@ -4804,7 +4825,8 @@
* <p>
* This method can be called in any codec state except for released state. When called in
* running state with newly unsubscribed parameters, it takes effect no later than the
- * processing of the subsequently queued buffer.
+ * processing of the subsequently queued buffer. For the removed parameters, the codec will
+ * generate output format change event.
* <p>
* Note that any vendor parameters set in a {@link #configure} or
* {@link #setParameters} call are automatically subscribed, and with this method
diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java
index 1f07705..cb47ba2 100644
--- a/media/java/android/media/audiopolicy/AudioMixingRule.java
+++ b/media/java/android/media/audiopolicy/AudioMixingRule.java
@@ -291,7 +291,6 @@
final int match_rule = rule & ~RULE_EXCLUSION_MASK;
switch (match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
- case RULE_MATCH_UID:
case RULE_MATCH_USERID:
return true;
default:
@@ -299,6 +298,16 @@
}
}
+ private static boolean isRecorderRule(int rule) {
+ final int match_rule = rule & ~RULE_EXCLUSION_MASK;
+ switch (match_rule) {
+ case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
+ return true;
+ default:
+ return false;
+ }
+ }
+
private static boolean isAudioAttributeRule(int match_rule) {
switch(match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
@@ -460,6 +469,23 @@
}
/**
+ * Set target mix type of the mixing rule.
+ *
+ * <p>Note: If the mix type was not specified, it will be decided automatically by mixing
+ * rule. For {@link #RULE_MATCH_UID}, the default type is {@link AudioMix#MIX_TYPE_PLAYERS}.
+ *
+ * @param mixType {@link AudioMix#MIX_TYPE_PLAYERS} or {@link AudioMix#MIX_TYPE_RECORDERS}
+ * @return the same Builder instance.
+ *
+ * @hide
+ */
+ public @NonNull Builder setTargetMixType(int mixType) {
+ mTargetMixType = mixType;
+ Log.i("AudioMixingRule", "Builder setTargetMixType " + mixType);
+ return this;
+ }
+
+ /**
* Add or exclude a rule for the selection of which streams are mixed together.
* Does error checking on the parameters.
* @param rule
@@ -515,11 +541,15 @@
if (mTargetMixType == AudioMix.MIX_TYPE_INVALID) {
if (isPlayerRule(rule)) {
mTargetMixType = AudioMix.MIX_TYPE_PLAYERS;
- } else {
+ } else if (isRecorderRule(rule)) {
mTargetMixType = AudioMix.MIX_TYPE_RECORDERS;
+ } else {
+ // For rules which are not player or recorder specific (e.g. RULE_MATCH_UID),
+ // the default mix type is MIX_TYPE_PLAYERS.
+ mTargetMixType = AudioMix.MIX_TYPE_PLAYERS;
}
- } else if (((mTargetMixType == AudioMix.MIX_TYPE_PLAYERS) && !isPlayerRule(rule))
- || ((mTargetMixType == AudioMix.MIX_TYPE_RECORDERS) && isPlayerRule(rule)))
+ } else if ((isPlayerRule(rule) && (mTargetMixType != AudioMix.MIX_TYPE_PLAYERS))
+ || (isRecorderRule(rule)) && (mTargetMixType != AudioMix.MIX_TYPE_RECORDERS))
{
throw new IllegalArgumentException("Incompatible rule for mix");
}
diff --git a/media/java/android/media/audiopolicy/AudioPolicyConfig.java b/media/java/android/media/audiopolicy/AudioPolicyConfig.java
index ede68bd..346edc3 100644
--- a/media/java/android/media/audiopolicy/AudioPolicyConfig.java
+++ b/media/java/android/media/audiopolicy/AudioPolicyConfig.java
@@ -100,6 +100,8 @@
dest.writeBoolean(mix.getRule().allowPrivilegedMediaPlaybackCapture());
// write voice communication capture allowed flag
dest.writeBoolean(mix.getRule().voiceCommunicationCaptureAllowed());
+ // write specified mix type
+ dest.writeInt(mix.getRule().getTargetMixType());
// write mix rules
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
dest.writeInt(criteria.size());
@@ -134,6 +136,8 @@
ruleBuilder.allowPrivilegedPlaybackCapture(in.readBoolean());
// read voice capture allowed flag
ruleBuilder.voiceCommunicationCaptureAllowed(in.readBoolean());
+ // read specified mix type
+ ruleBuilder.setTargetMixType(in.readInt());
// read mix rules
int nbRules = in.readInt();
for (int j = 0 ; j < nbRules ; j++) {
@@ -176,6 +180,8 @@
textDump += " allow voice communication capture="
+ mix.getRule().voiceCommunicationCaptureAllowed() + "\n";
// write mix rules
+ textDump += " specified mix type="
+ + mix.getRule().getTargetMixType() + "\n";
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
for (AudioMixMatchCriterion criterion : criteria) {
switch(criterion.mRule) {
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 7562d39..0aae940 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1737,6 +1737,8 @@
fId = static_cast<uint64_t>(id);
}
+ filterClient->getAvSharedHandleInfo();
+
JNIEnv *env = AndroidRuntime::getJNIEnv();
jobject filterObj =
env->NewObject(
@@ -3970,7 +3972,7 @@
if (descramblerClient == NULL) {
return (jint) Result::NOT_INITIALIZED;
}
- sp<FilterClient> filterClient = getFilterClient(env, filter);
+ sp<FilterClient> filterClient = (filter == NULL) ? NULL : getFilterClient(env, filter);
Result result = descramblerClient->addPid(getDemuxPid((int)pidType, (int)pid), filterClient);
return (jint) result;
}
@@ -3981,7 +3983,7 @@
if (descramblerClient == NULL) {
return (jint) Result::NOT_INITIALIZED;
}
- sp<FilterClient> filterClient = getFilterClient(env, filter);
+ sp<FilterClient> filterClient = (filter == NULL) ? NULL : getFilterClient(env, filter);
Result result = descramblerClient->removePid(getDemuxPid((int)pidType, (int)pid), filterClient);
return (jint) result;
}
diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp
index 07be5cf..3e4ed82 100644
--- a/media/jni/tuner/DescramblerClient.cpp
+++ b/media/jni/tuner/DescramblerClient.cpp
@@ -73,26 +73,33 @@
Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
if (mTunerDescrambler != NULL) {
- Status s = mTunerDescrambler->addPid(
- getAidlDemuxPid(pid), optionalSourceFilter->getAidlFilter());
+ shared_ptr<ITunerFilter> aidlFilter = (optionalSourceFilter == NULL)
+ ? NULL : optionalSourceFilter->getAidlFilter();
+ Status s = mTunerDescrambler->addPid(getAidlDemuxPid(pid), aidlFilter);
return ClientHelper::getServiceSpecificErrorCode(s);
}
if (mDescrambler != NULL) {
- return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
+ sp<IFilter> halFilter = (optionalSourceFilter == NULL)
+ ? NULL : optionalSourceFilter->getHalFilter();
+ return mDescrambler->addPid(pid, halFilter);
}
- return Result::INVALID_STATE;}
+ return Result::INVALID_STATE;
+}
Result DescramblerClient::removePid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
if (mTunerDescrambler != NULL) {
- Status s = mTunerDescrambler->removePid(
- getAidlDemuxPid(pid), optionalSourceFilter->getAidlFilter());
+ shared_ptr<ITunerFilter> aidlFilter = (optionalSourceFilter == NULL)
+ ? NULL : optionalSourceFilter->getAidlFilter();
+ Status s = mTunerDescrambler->removePid(getAidlDemuxPid(pid), aidlFilter);
return ClientHelper::getServiceSpecificErrorCode(s);
}
if (mDescrambler != NULL) {
- return mDescrambler->removePid(pid, optionalSourceFilter->getHalFilter());
+ sp<IFilter> halFilter = (optionalSourceFilter == NULL)
+ ? NULL : optionalSourceFilter->getHalFilter();
+ return mDescrambler->removePid(pid, halFilter);
}
return Result::INVALID_STATE;
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index 8846e4d6..2995572 100644
--- a/media/jni/tuner/FilterClient.cpp
+++ b/media/jni/tuner/FilterClient.cpp
@@ -62,6 +62,9 @@
mFilter_1_1 = NULL;
mAvSharedHandle = NULL;
mAvSharedMemSize = 0;
+ mIsMediaFilter = false;
+ mFilterMQ = NULL;
+ mFilterMQEventFlag = NULL;
}
// TODO: remove after migration to Tuner Service is done.
@@ -81,7 +84,7 @@
SharedHandleInfo FilterClient::getAvSharedHandleInfo() {
handleAvShareMemory();
SharedHandleInfo info{
- .sharedHandle = mAvSharedHandle,
+ .sharedHandle = mIsMediaFilter ? mAvSharedHandle : NULL,
.size = mAvSharedMemSize,
};
@@ -259,9 +262,10 @@
}
Result FilterClient::close() {
- if (mFilterMQEventFlag != NULL) {
+ if (mFilterMQEventFlag) {
EventFlag::deleteEventFlag(&mFilterMQEventFlag);
}
+ mFilterMQEventFlag = NULL;
mFilterMQ = NULL;
if (mTunerFilter != NULL) {
@@ -943,7 +947,7 @@
}
int FilterClient::copyData(int8_t* buffer, int size) {
- if (mFilter == NULL || mFilterMQ == NULL || mFilterMQEventFlag == NULL) {
+ if (mFilterMQ == NULL || mFilterMQEventFlag == NULL) {
return -1;
}
@@ -964,6 +968,7 @@
if (type.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO ||
type.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) {
mIsMediaFilter = true;
+ return;
}
}
@@ -971,15 +976,17 @@
if (type.subType.tsFilterType() == DemuxTsFilterType::AUDIO ||
type.subType.tsFilterType() == DemuxTsFilterType::VIDEO) {
mIsMediaFilter = true;
+ return;
}
}
+
+ mIsMediaFilter = false;
}
void FilterClient::handleAvShareMemory() {
if (mAvSharedHandle != NULL) {
return;
}
-
if (mTunerFilter != NULL && mIsMediaFilter) {
TunerFilterSharedHandleInfo aidlHandleInfo;
Status s = mTunerFilter->getAvSharedHandleInfo(&aidlHandleInfo);
@@ -1001,8 +1008,13 @@
}
void FilterClient::closeAvSharedMemory() {
+ if (mAvSharedHandle == NULL) {
+ mAvSharedMemSize = 0;
+ return;
+ }
native_handle_close(mAvSharedHandle);
native_handle_delete(mAvSharedHandle);
mAvSharedMemSize = 0;
+ mAvSharedHandle = NULL;
}
} // namespace android
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index 736b8f9..d032749 100644
--- a/media/jni/tuner/FilterClient.h
+++ b/media/jni/tuner/FilterClient.h
@@ -264,8 +264,8 @@
*/
sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
- AidlMQ* mFilterMQ;
- EventFlag* mFilterMQEventFlag;
+ AidlMQ* mFilterMQ = NULL;
+ EventFlag* mFilterMQEventFlag = NULL;
native_handle_t* mAvSharedHandle;
uint64_t mAvSharedMemSize;
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index e0f6379..7433cf9 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -432,14 +432,27 @@
const ARect& destination, int32_t transform) {
CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
- CHECK_VALID_RECT(source);
CHECK_VALID_RECT(destination);
+ Rect sourceRect = static_cast<const Rect&>(source);
+ // Adjust the source so its top and left are not negative
+ sourceRect.left = std::max(sourceRect.left, 0);
+ sourceRect.top = std::max(sourceRect.top, 0);
+ LOG_ALWAYS_FATAL_IF(sourceRect.isEmpty(), "invalid arg passed as source argument");
+
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
- transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
+ transaction->setCrop(surfaceControl, sourceRect);
+
+ float dsdx = (destination.right - destination.left) /
+ static_cast<float>(sourceRect.right - sourceRect.left);
+ float dsdy = (destination.bottom - destination.top) /
+ static_cast<float>(sourceRect.bottom - sourceRect.top);
+
+ transaction->setPosition(surfaceControl, destination.left - (sourceRect.left * dsdx),
+ destination.top - (sourceRect.top * dsdy));
+ transaction->setMatrix(surfaceControl, dsdx, 0, 0, dsdy);
transaction->setTransform(surfaceControl, transform);
bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
@@ -458,16 +471,18 @@
transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
}
-void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
- ASurfaceControl* aSurfaceControl, const ARect& destination) {
- CHECK_NOT_NULL(aSurfaceTransaction);
+void ASurfaceTransaction_setPosition(ASurfaceTransaction* /* aSurfaceTransaction */,
+ ASurfaceControl* /* aSurfaceControl */,
+ const ARect& /* destination */) {
+ // TODO: Fix this function
+ /* CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
CHECK_VALID_RECT(destination);
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
+ transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));*/
}
void ASurfaceTransaction_setTransform(ASurfaceTransaction* aSurfaceTransaction,
diff --git a/packages/Android.bp b/packages/Android.bp
new file mode 100644
index 0000000..8b0698b
--- /dev/null
+++ b/packages/Android.bp
@@ -0,0 +1,28 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Defaults for platform apps
+java_defaults {
+ name: "platform_app_defaults",
+ plugins: ["error_prone_android_framework"],
+ errorprone: {
+ javacflags: [
+ // We're less worried about performance in app code
+ "-Xep:AndroidFrameworkEfficientCollections:OFF",
+ "-Xep:AndroidFrameworkEfficientParcelable:OFF",
+ "-Xep:AndroidFrameworkEfficientStrings:OFF",
+ "-Xep:AndroidFrameworkEfficientXml:OFF",
+ ],
+ },
+}
diff --git a/packages/Connectivity/framework/Android.bp b/packages/Connectivity/framework/Android.bp
index 5f5ebf4..c62402d 100644
--- a/packages/Connectivity/framework/Android.bp
+++ b/packages/Connectivity/framework/Android.bp
@@ -105,6 +105,7 @@
"//frameworks/libs/net/common/testutils",
"//frameworks/libs/net/common/tests:__subpackages__",
"//frameworks/opt/telephony/tests/telephonytests",
+ "//packages/modules/CaptivePortalLogin/tests",
"//packages/modules/Connectivity/Tethering/tests:__subpackages__",
"//packages/modules/Connectivity/tests:__subpackages__",
"//packages/modules/NetworkStack/tests:__subpackages__",
diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt
index caf7f49..4719772 100644
--- a/packages/Connectivity/framework/api/module-lib-current.txt
+++ b/packages/Connectivity/framework/api/module-lib-current.txt
@@ -133,16 +133,6 @@
method @NonNull public android.net.NetworkRequest.Builder setUids(@Nullable java.util.Set<android.util.Range<java.lang.Integer>>);
}
- public final class TcpRepairWindow {
- ctor public TcpRepairWindow(int, int, int, int, int, int);
- field public final int maxWindow;
- field public final int rcvWnd;
- field public final int rcvWndScale;
- field public final int rcvWup;
- field public final int sndWl1;
- field public final int sndWnd;
- }
-
public final class TestNetworkInterface implements android.os.Parcelable {
ctor public TestNetworkInterface(@NonNull android.os.ParcelFileDescriptor, @NonNull String);
method public int describeContents();
diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt
index 2ac019d..63e0fe9 100644
--- a/packages/Connectivity/framework/api/system-current.txt
+++ b/packages/Connectivity/framework/api/system-current.txt
@@ -260,15 +260,15 @@
public static final class NetworkAgentConfig.Builder {
ctor public NetworkAgentConfig.Builder();
method @NonNull public android.net.NetworkAgentConfig build();
- method @NonNull public android.net.NetworkAgentConfig.Builder disableNat64Detection();
- method @NonNull public android.net.NetworkAgentConfig.Builder disableProvisioningNotification();
method @NonNull public android.net.NetworkAgentConfig.Builder setExplicitlySelected(boolean);
method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyExtraInfo(@NonNull String);
method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubType(int);
method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubTypeName(@NonNull String);
method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyType(int);
method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyTypeName(@NonNull String);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setNat64DetectionEnabled(boolean);
method @NonNull public android.net.NetworkAgentConfig.Builder setPartialConnectivityAcceptable(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setProvisioningNotificationEnabled(boolean);
method @NonNull public android.net.NetworkAgentConfig.Builder setUnvalidatedConnectivityAcceptable(boolean);
}
diff --git a/packages/Connectivity/framework/lint-baseline.xml b/packages/Connectivity/framework/lint-baseline.xml
new file mode 100644
index 0000000..df37ae8
--- /dev/null
+++ b/packages/Connectivity/framework/lint-baseline.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `new android.net.ParseException`"
+ errorLine1=" ParseException pe = new ParseException(e.reason, e.getCause());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/Connectivity/framework/src/android/net/DnsResolver.java"
+ line="301"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 30): `android.telephony.TelephonyCallback`"
+ errorLine1=" protected class ActiveDataSubscriptionIdListener extends TelephonyCallback"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/Connectivity/framework/src/android/net/util/MultinetworkPolicyTracker.java"
+ line="96"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 30): `android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener`"
+ errorLine1=" implements TelephonyCallback.ActiveDataSubscriptionIdListener {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/Connectivity/framework/src/android/net/util/MultinetworkPolicyTracker.java"
+ line="97"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.telephony.TelephonyManager#registerTelephonyCallback`"
+ errorLine1=" ctx.getSystemService(TelephonyManager.class).registerTelephonyCallback("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/Connectivity/framework/src/android/net/util/MultinetworkPolicyTracker.java"
+ line="126"
+ column="54"/>
+ </issue>
+
+</issues>
diff --git a/packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java b/packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java
index 3f058d8..ad8396b 100644
--- a/packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java
+++ b/packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java
@@ -311,26 +311,28 @@
}
/**
- * Disables active detection of NAT64 (e.g., via RFC 7050 DNS lookups). Used to save power
- * and reduce idle traffic on networks that are known to be IPv6-only without a NAT64.
+ * Enables or disables active detection of NAT64 (e.g., via RFC 7050 DNS lookups). Used to
+ * save power and reduce idle traffic on networks that are known to be IPv6-only without a
+ * NAT64. By default, NAT64 detection is enabled.
*
* @return this builder, to facilitate chaining.
*/
@NonNull
- public Builder disableNat64Detection() {
- mConfig.skip464xlat = true;
+ public Builder setNat64DetectionEnabled(boolean enabled) {
+ mConfig.skip464xlat = !enabled;
return this;
}
/**
- * Disables the "Sign in to network" notification. Used if the network transport will
- * perform its own carrier-specific provisioning procedure.
+ * Enables or disables the "Sign in to network" notification. Used if the network transport
+ * will perform its own carrier-specific provisioning procedure. By default, the
+ * notification is enabled.
*
* @return this builder, to facilitate chaining.
*/
@NonNull
- public Builder disableProvisioningNotification() {
- mConfig.provisioningNotificationDisabled = true;
+ public Builder setProvisioningNotificationEnabled(boolean enabled) {
+ mConfig.provisioningNotificationDisabled = !enabled;
return this;
}
diff --git a/packages/Connectivity/framework/src/android/net/TcpRepairWindow.java b/packages/Connectivity/framework/src/android/net/TcpRepairWindow.java
index f062fa9..86034f0 100644
--- a/packages/Connectivity/framework/src/android/net/TcpRepairWindow.java
+++ b/packages/Connectivity/framework/src/android/net/TcpRepairWindow.java
@@ -16,15 +16,12 @@
package android.net;
-import android.annotation.SystemApi;
-
/**
* Corresponds to C's {@code struct tcp_repair_window} from
* include/uapi/linux/tcp.h
*
* @hide
*/
-@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class TcpRepairWindow {
public final int sndWl1;
public final int sndWnd;
diff --git a/packages/Connectivity/framework/src/android/net/UidRange.java b/packages/Connectivity/framework/src/android/net/UidRange.java
index bc67c74..bd33292 100644
--- a/packages/Connectivity/framework/src/android/net/UidRange.java
+++ b/packages/Connectivity/framework/src/android/net/UidRange.java
@@ -46,8 +46,8 @@
/** Creates a UidRange for the specified user. */
public static UidRange createForUser(UserHandle user) {
final UserHandle nextUser = UserHandle.of(user.getIdentifier() + 1);
- final int start = UserHandle.getUid(user, 0 /* appId */);
- final int end = UserHandle.getUid(nextUser, 0) - 1;
+ final int start = user.getUid(0 /* appId */);
+ final int end = nextUser.getUid(0 /* appId */) - 1;
return new UidRange(start, end);
}
diff --git a/packages/Connectivity/service/lint-baseline.xml b/packages/Connectivity/service/lint-baseline.xml
new file mode 100644
index 0000000..35ea2d3
--- /dev/null
+++ b/packages/Connectivity/service/lint-baseline.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.telephony.TelephonyManager#isDataCapable`"
+ errorLine1=" if (tm.isDataCapable()) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/services/core/java/com/android/server/ConnectivityService.java"
+ line="781"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.content.Context#sendStickyBroadcast`"
+ errorLine1=" mUserAllContext.sendStickyBroadcast(intent, options);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/services/core/java/com/android/server/ConnectivityService.java"
+ line="2633"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.content.pm.PackageManager#getTargetSdkVersion`"
+ errorLine1=" final int callingVersion = pm.getTargetSdkVersion(callingPackageName);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/services/core/java/com/android/server/ConnectivityService.java"
+ line="5784"
+ column="43"/>
+ </issue>
+
+</issues>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index cf6e96f..26d108c 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ጥቅል ጫኚ"</string>
<string name="install" msgid="711829760615509273">"ጫን"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"አዘምን"</string>
<string name="done" msgid="6632441120016885253">"ተከናውኗል"</string>
<string name="cancel" msgid="1018267193425558088">"ይቅር"</string>
<string name="installing" msgid="4921993079741206516">"በመጫን ላይ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ን በመጫን ላይ…"</string>
<string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ይህን መተግበሪያ ማዘመን ይፈልጋሉ?"</string>
<string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"በWear ላይ የመጫን/ማራገፍ እርምጃዎች አይደገፉም።"</string>
<string name="message_staging" msgid="8032722385658438567">"መተግበሪያን በማዘጋጀት ላይ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ያልታወቀ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ለእርስዎ ደህንነት ሲባል በአሁኑ ጊዜ ጡባዊዎ ከዚህ ምንጭ ያልታወቁ መተግበሪያዎችን እንዲጭን አይፈቀድለትም። ይህን በቅንብሮች ውስጥ መቀየር ይችላሉ።"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ለእርስዎ ደህንነት ሲባል በአሁኑ ጊዜ የእርስዎ ቲቪ ከዚህ ምንጭ ያልታወቁ መተግበሪያዎችን እንዲጭን አይፈቀድለትም። ይህን በቅንብሮች ውስጥ መቀየር ይችላሉ።"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ለእርስዎ ደህንነት ሲባል በአሁኑ ጊዜ ስልክዎ ከዚህ ምንጭ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም። ይህን በቅንብሮች ውስጥ መቀየር ይችላሉ።"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"የእርስዎ ስልክ እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይልበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ስልክ ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"የእርስዎ ጡባዊ እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ጡባዊ ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"የእርስዎ ቴሌቪዥን እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ቴሌቪዥን ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 7cfa08a..af2e19e 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"أداة تثبيت الحزم"</string>
<string name="install" msgid="711829760615509273">"تثبيت"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"تحديث"</string>
<string name="done" msgid="6632441120016885253">"تم"</string>
<string name="cancel" msgid="1018267193425558088">"إلغاء"</string>
<string name="installing" msgid="4921993079741206516">"جارٍ التثبيت…"</string>
<string name="installing_app" msgid="1165095864863849422">"جارٍ تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"هل تريد تثبيت هذا التطبيق؟"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"هل تريد تحديث هذا التطبيق؟"</string>
<string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"لا تتوافق إجراءات التثبيت/إلغاء التثبيت مع نظام Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"جارٍ الطرح المرحلي للتطبيق…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"غير معروف"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"لأغراض الأمان، غير مسموح حاليًا لجهازك اللوحي بتثبيت تطبيقات غير معروفة من هذا المصدر. ويمكنك تغيير ذلك في \"الإعدادات\"."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"لأغراض الأمان، غير مسموح حاليًا لجهاز التلفزيون الذي تستخدمه بتثبيت تطبيقات غير معروفة من هذا المصدر. ويمكنك تغيير ذلك في \"الإعدادات\"."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"لأغراض الأمان، غير مسموح حاليًا لهاتفك بتثبيت تطبيقات غير معروفة من هذا المصدر. ويمكنك تغيير ذلك في \"الإعدادات\"."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"يعتبر الهاتف والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث لهاتفك أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"يعتبر الجهاز اللوحي والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث للجهاز اللوحي أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"يعتبر جهاز التلفزيون والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث لجهاز التلفزيون أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
index 5c902f0..f355988 100644
--- a/packages/PackageInstaller/res/values-as/strings.xml
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"পেকেজ ইনষ্টলাৰ"</string>
<string name="install" msgid="711829760615509273">"ইনষ্টল কৰক"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"আপডে’ট কৰক"</string>
<string name="done" msgid="6632441120016885253">"সম্পন্ন হ’ল"</string>
<string name="cancel" msgid="1018267193425558088">"বাতিল কৰক"</string>
<string name="installing" msgid="4921993079741206516">"ইনষ্টল কৰি থকা হৈছে…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ইনষ্টল কৰি থকা হৈছে…"</string>
<string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"আপুনি এই এপ্টো ইনষ্টল কৰিবলৈ বিচাৰেনে?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"আপুনি এই এপ্টো আপডে’ট কৰিবলৈ বিচাৰেনে?"</string>
<string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"এপটো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ৱেৰ-ত ইনষ্টল/আনইনষ্টল কৰিব পৰা নাযায়।"</string>
<string name="message_staging" msgid="8032722385658438567">"এপৰ অন্তিম পর্যায়ৰ পৰীক্ষণ চলি আছে…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"অজ্ঞাত"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ টেবলেটটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ টিভিটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ ফ’নটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"আপোনাৰ ফ\'ন আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"আপোনাৰ টেবলেট আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"আপোনাৰ টিভি আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index 485dd16..a7d59dd 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paket quraşdırıcı"</string>
<string name="install" msgid="711829760615509273">"Quraşdırın"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Güncəlləyin"</string>
<string name="done" msgid="6632441120016885253">"Hazırdır"</string>
<string name="cancel" msgid="1018267193425558088">"Ləğv edin"</string>
<string name="installing" msgid="4921993079741206516">"Quraşdırılır..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> quraşdırılır…"</string>
<string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu tətbiqi güncəlləmək istəyirsiniz?"</string>
<string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Yükləmə/Sistemdən silmə fəaliyyətləri Wear\'də dəstəklənmir."</string>
<string name="message_staging" msgid="8032722385658438567">"Tətbiq hazırlanır..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Naməlum"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Təhlükəsizliyiniz üçün planşetinizə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir. Bunu Ayarlarda dəyişə bilərsiniz."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Təhlükəsizliyiniz üçün TV-nizə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir. Bunu Ayarlarda dəyişə bilərsiniz."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Təhlükəsizliyiniz üçün telefonunuza bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir. Bunu Ayarlarda dəyişə bilərsiniz."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla telefona dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planşet və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla planşetə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verə biləcək data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tv və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla Tv-yə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index 9a97dad..31c8bac 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Program za instal. paketa"</string>
<string name="install" msgid="711829760615509273">"Instaliraj"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Ažuriraj"</string>
<string name="done" msgid="6632441120016885253">"Gotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Otkaži"</string>
<string name="installing" msgid="4921993079741206516">"Instalira se..."</string>
<string name="installing_app" msgid="1165095864863849422">"Instalira se <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Želite da instalirate ovu aplikaciju?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite da ažurirate ovu aplikaciju?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Radnje Instaliraj/Deinstaliraj nisu podržane u Wear-u."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikacija se priprema…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Iz bezbednosnih razloga tabletu trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. To možete da promenite u podešavanjima."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Iz bezbednosnih razloga televizoru trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. To možete da promenite u podešavanjima."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Iz bezbednosnih razloga telefonu trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. To možete da promenite u podešavanjima."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja telefona ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja tableta ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja TV-a ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index ceca8a2..670fad4 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Усталёўшчык пакетаў"</string>
<string name="install" msgid="711829760615509273">"Усталяваць"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Абнавіць"</string>
<string name="done" msgid="6632441120016885253">"Гатова"</string>
<string name="cancel" msgid="1018267193425558088">"Скасаваць"</string>
<string name="installing" msgid="4921993079741206516">"Ідзе ўсталёўка…"</string>
<string name="installing_app" msgid="1165095864863849422">"Усталёўваецца <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Усталяваць гэту праграму?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Абнавіць гэту праграму?"</string>
<string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дзеянні па ўсталяванні або выдаленні не падтрымліваюцца на Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Праграма падрыхтоўваецца…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Невядома"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"У мэтах бяспекі вашаму планшэту забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы. Вы можаце змяніць гэты дазвол у Наладах."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"У мэтах бяспекі вашаму тэлевізару забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы. Вы можаце змяніць гэты дазвол у Наладах."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"У мэтах бяспекі вашаму тэлефону забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы. Вы можаце змяніць гэты дазвол у Наладах."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваш тэлефон і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні тэлефона ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваш планшэт і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні планшэта ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваш тэлевізар і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні тэлевізара ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index 54f67c0..0c0dd69 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"প্যাকেজ ইনস্টলার"</string>
<string name="install" msgid="711829760615509273">"ইনস্টল করুন"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"আপডেট করুন"</string>
<string name="done" msgid="6632441120016885253">"হয়ে গেছে"</string>
<string name="cancel" msgid="1018267193425558088">"বাতিল করুন"</string>
<string name="installing" msgid="4921993079741206516">"ইনস্টল করা হচ্ছে…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ইনস্টল করা হচ্ছে…"</string>
<string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"আপনি কি এই অ্যাপটি ইনস্টল করতে চান?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"আপনি কি এই অ্যাপটি আপডেট করতে চান?"</string>
<string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-এ ইনস্টল/আনইনস্টল করা সমর্থিত নয়।"</string>
<string name="message_staging" msgid="8032722385658438567">"অ্যাপ স্টেজ করা হচ্ছে…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"অজানা"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"আপনার নিরাপত্তার জন্য, এই সোর্স থেকে বর্তমানে আপনার ট্যাবে অজানা অ্যাপ ইনস্টল করা যাবে না। আপনি সেটিংস থেকে এটি পরিবর্তন করতে পারবেন।"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"আপনার নিরাপত্তার জন্য, এই সোর্স থেকে বর্তমানে আপনার টিভিতে অজানা অ্যাপ ইনস্টল করা যাবে না। আপনি সেটিংস থেকে এটি পরিবর্তন করতে পারবেন।"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"আপনার নিরাপত্তার জন্য, এই সোর্স থেকে বর্তমানে আপনার ফোনে অজানা অ্যাপ ইনস্টল করা যাবে না। আপনি সেটিংস থেকে এটি পরিবর্তন করতে পারবেন।"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"অজানা অ্যাপের দ্বারা আপনার ফোন এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার ফোনের বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"অজানা অ্যাপের দ্বারা আপনার ট্যাবলেট এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার ট্যাবলেটের বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"অজানা অ্যাপের দ্বারা আপনার টিভি এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার টিভি বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index 47bca79..66d57e3 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instaliranje/deinstaliranje nije podržano na Wearu."</string>
<string name="message_staging" msgid="8032722385658438567">"Pripremanje aplikacije…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Iz sigurnosnih razloga tablet trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Iz sigurnosnih razloga televizor trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Iz sigurnosnih razloga telefon trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Radi vaše sigurnosti, tabletu trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. Ovo možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Radi vaše sigurnosti, TV-u trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. Ovo možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Radi vaše sigurnosti, telefonu trenutno nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora. Ovo možete promijeniti u Postavkama."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Vaši podaci na telefonu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na telefonu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Vaši podaci na tabletu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na tabletu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Vaši podaci na TV-u i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na TV-u ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index 4daf205..5efee3c 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instal·lador de paquets"</string>
<string name="install" msgid="711829760615509273">"Instal·la"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Actualitza"</string>
<string name="done" msgid="6632441120016885253">"Fet"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel·la"</string>
<string name="installing" msgid="4921993079741206516">"S\'està instal·lant…"</string>
<string name="installing_app" msgid="1165095864863849422">"S\'està instal·lant <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vols instal·lar aquesta aplicació?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vols actualitzar aquesta aplicació?"</string>
<string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"S\'està preparant la instal·lació de l\'aplicació…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconeguda"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Per la teva seguretat, actualment la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font. Pots canviar-ho a Configuració."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Per la teva seguretat, actualment la televisió no pot instal·lar aplicacions desconegudes d\'aquesta font. Pots canviar-ho a Configuració."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Per la teva seguretat, actualment el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font. Pots canviar-ho a Configuració."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"El telèfon i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al telèfon o de la pèrdua de dades que pugui resultar del seu ús."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"La tauleta i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi a la tauleta o de la pèrdua de dades que pugui resultar del seu ús."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"El televisor i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al televisor o de la pèrdua de dades que pugui resultar del seu ús."</string>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index 041a375..4bf63c9 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalátor balíčků"</string>
<string name="install" msgid="711829760615509273">"Instalovat"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Aktualizovat"</string>
<string name="done" msgid="6632441120016885253">"Hotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Zrušit"</string>
<string name="installing" msgid="4921993079741206516">"Instalace…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalace balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Chcete tuto aplikaci nainstalovat?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete tuto aplikaci aktualizovat?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Akce instalace/odinstalace nejsou v zařízení Wear podporovány."</string>
<string name="message_staging" msgid="8032722385658438567">"Příprava instalace…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznámé"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Z bezpečnostních důvodů momentálně není dovoleno do tabletu instalovat neznámé aplikace z tohoto zdroje. Změnit to můžete v Nastavení."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Z bezpečnostních důvodů momentálně není dovoleno do televize instalovat neznámé aplikace z tohoto zdroje. Změnit to můžete v Nastavení."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Z bezpečnostních důvodů momentálně není dovoleno do telefonu instalovat neznámé aplikace z tohoto zdroje. Změnit to můžete v Nastavení."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na telefonu nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na tabletu nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televize a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na televizi nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index 9a46fb3..dab3fcb0 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Installations-/Deinstallationsaktion auf Android Wear nicht unterstützt."</string>
<string name="message_staging" msgid="8032722385658438567">"App wird vorbereitet…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unbekannt"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Aus Sicherheitsgründen kannst du auf deinem Tablet keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Aus Sicherheitsgründen kannst du auf deinem Fernseher keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Aus Sicherheitsgründen kannst du auf deinem Smartphone keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Aus Sicherheitsgründen kannst du auf deinem Tablet zurzeit keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Aus Sicherheitsgründen kannst du auf deinem Fernseher zurzeit keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Aus Sicherheitsgründen kannst du auf deinem Smartphone zurzeit keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Unbekannte Apps können gefährlich für dein Smartphone und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Smartphone und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Unbekannte Apps können gefährlich für dein Tablet und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Tablet und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Unbekannte Apps können gefährlich für deinen Fernseher und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Fernseher und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index fd6bf6a..3fd87d9 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Πρόγρ. εγκατάστ. πακέτου"</string>
<string name="install" msgid="711829760615509273">"Εγκατάσταση"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Ενημέρωση"</string>
<string name="done" msgid="6632441120016885253">"Τέλος"</string>
<string name="cancel" msgid="1018267193425558088">"Ακύρωση"</string>
<string name="installing" msgid="4921993079741206516">"Εγκατάσταση…"</string>
<string name="installing_app" msgid="1165095864863849422">"Εγκατάσταση <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Θέλετε να ενημερώσετε αυτήν την εφαρμογή;"</string>
<string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Οι ενέργειες εγκατάστασης/απεγκατάστασης δεν υποστηρίζονται στο Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Σταδιακή διάθεση εφαρμογής…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Άγνωστη"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Για λόγους ασφαλείας, δεν επιτρέπεται προς το παρόν η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο tablet σας. Μπορείτε να αλλάξετε την επιλογή από τις Ρυθμίσεις."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Για λόγους ασφαλείας, δεν επιτρέπεται προς το παρόν η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στην τηλεόρασή σας. Μπορείτε να αλλάξετε την επιλογή από τις Ρυθμίσεις."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Για λόγους ασφαλείας, δεν επιτρέπεται προς το παρόν η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο τηλέφωνό σας. Μπορείτε να αλλάξετε την επιλογή από τις Ρυθμίσεις."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Το τηλέφωνό σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο τηλέφωνο ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Το tablet σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο tablet ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Η τηλεόρασή σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στην τηλεόρασή ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index a43b550..3a0757b 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Actualizar"</string>
<string name="done" msgid="6632441120016885253">"Listo"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Se ha instalado la aplicación."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"¿Quieres instalar esta aplicación?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Quieres actualizar esta aplicación?"</string>
<string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Las acciones de instalar y desinstalar no pueden realizarse en Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconocida"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Por motivos de seguridad, de momento tu tablet no puede instalar aplicaciones desconocidas de esta fuente. Puedes cambiarlo en Ajustes."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Por motivos de seguridad, de momento tu televisor no puede instalar aplicaciones desconocidas de esta fuente. Puedes cambiarlo en Ajustes."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Por motivos de seguridad, de momento tu teléfono no puede instalar aplicaciones desconocidas de esta fuente. Puedes cambiarlo en Ajustes."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tu teléfono y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu teléfono o la pérdida de datos que se pueda derivar de su uso."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tu tablet y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu tablet o la pérdida de datos que se pueda derivar de su uso."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tu TV y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu TV o la pérdida de datos que se pueda derivar de su uso."</string>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index 97f1c67..2225d3b 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketi installiprogramm"</string>
<string name="install" msgid="711829760615509273">"Installi"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Värskenda"</string>
<string name="done" msgid="6632441120016885253">"Valmis"</string>
<string name="cancel" msgid="1018267193425558088">"Tühista"</string>
<string name="installing" msgid="4921993079741206516">"Installimine …"</string>
<string name="installing_app" msgid="1165095864863849422">"Paketi <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installimine …"</string>
<string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Kas soovite selle rakenduse installida?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Kas soovite seda rakendust värskendada?"</string>
<string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei toeta installimist/desinstallimist."</string>
<string name="message_staging" msgid="8032722385658438567">"Rakenduse koondamine …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Teadmata"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Teie turvalisuse huvides ei ole tahvelarvutil praegu lubatud installida sellest allikast tundmatuid rakendusi. Saate seda seadetes muuta."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Teie turvalisuse huvides ei ole teleril praegu lubatud installida sellest allikast tundmatuid rakendusi. Saate seda seadetes muuta."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Teie turvalisuse huvides ei ole telefonil praegu lubatud installida sellest allikast tundmatuid rakendusi. Saate seda seadetes muuta."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Teie telefon ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate telefoni kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Teie tahvelarvuti ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate tahvelarvuti kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Teie teler ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate teleri kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index a62e9ba..9922fe1 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakete-instalatzailea"</string>
<string name="install" msgid="711829760615509273">"Instalatu"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Eguneratu"</string>
<string name="done" msgid="6632441120016885253">"Eginda"</string>
<string name="cancel" msgid="1018267193425558088">"Utzi"</string>
<string name="installing" msgid="4921993079741206516">"Instalatzen…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalatzen…"</string>
<string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Aplikazioa instalatu nahi duzu?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Aplikazioa eguneratu nahi duzu?"</string>
<string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ezin dira gauzatu instalatzeko eta desinstalatzeko ekintzak Wear gailuetan."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikazioa prestatzen…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ezezaguna"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan. Hori aldatzeko, joan Ezarpenak atalera."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan. Hori aldatzeko, joan Ezarpenak atalera."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan. Hori aldatzeko, joan Ezarpenak atalera."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index e7b3de7..8a52d21 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketin asentaja"</string>
<string name="install" msgid="711829760615509273">"Asenna"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Päivitä"</string>
<string name="done" msgid="6632441120016885253">"Valmis"</string>
- <string name="cancel" msgid="1018267193425558088">"Peruuta"</string>
+ <string name="cancel" msgid="1018267193425558088">"Peru"</string>
<string name="installing" msgid="4921993079741206516">"Asennetaan…"</string>
<string name="installing_app" msgid="1165095864863849422">"Asennetaan <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Haluatko asentaa tämän sovelluksen?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Haluatko päivittää tämän sovelluksen?"</string>
<string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei tue asennus- ja poistotoimintoja."</string>
<string name="message_staging" msgid="8032722385658438567">"Valmistellaan sovellusta…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tuntematon"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Turvallisuussyistä tablettisi ei tällä hetkellä voi asentaa tuntemattomia sovelluksia tästä lähteestä. Voit muuttaa tätä asetuksissa."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Turvallisuussyistä televisiosi ei tällä hetkellä voi asentaa tuntemattomia sovelluksia tästä lähteestä. Voit muuttaa tätä asetuksissa."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Turvallisuussyistä puhelimesi ei tällä hetkellä voi asentaa tuntemattomia sovelluksia tästä lähteestä. Voit muuttaa tätä asetuksissa."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tuntemattomat sovellukset voivat helpommin kaapata puhelimesi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa puhelimellesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tuntemattomat sovellukset voivat helpommin kaapata tablettisi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa tabletillesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tuntemattomat sovellukset voivat helpommin kaapata televisiosi ja henkilökohtaiset tietosi. Lataamalla sovelluksen hyväksyt, että olet itse vastuussa mahdollisista televisiolle aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index bc9bad9..4f2a37e 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Progr. d\'inst. de paquet"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Mettre à jour"</string>
<string name="done" msgid="6632441120016885253">"Terminé"</string>
<string name="cancel" msgid="1018267193425558088">"Annuler"</string>
<string name="installing" msgid="4921993079741206516">"Installation en cours…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> en cours…"</string>
<string name="install_done" msgid="5987363587661783896">"Application installée."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette application?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette application?"</string>
<string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les actions d\'installation et de désinstallation ne sont pas prises en charge par Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Pré-production de l\'application en cours…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inconnue"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur cette tablette. Vous pouvez modifier cette option dans les paramètres."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur. Vous pouvez modifier cette option dans les paramètres."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléphone. Vous pouvez modifier cette option dans les paramètres."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données personnelles sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index b9fb05d..3a04a8f 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Programme installation kit"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Mettre à jour"</string>
<string name="done" msgid="6632441120016885253">"OK"</string>
<string name="cancel" msgid="1018267193425558088">"Annuler"</string>
<string name="installing" msgid="4921993079741206516">"Installation…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installation du package <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Application installée."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette appli ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette appli ?"</string>
<string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Opérations d\'installation et de désinstallation impossibles sur Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Préparation de l\'installation de l\'appli…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inconnu"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Pour votre sécurité, l\'installation d\'applis inconnues provenant de cette source n\'est pas autorisée sur cette tablette actuellement. Vous pouvez modifier cette option dans les paramètres."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Pour votre sécurité, l\'installation d\'applis inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur actuellement. Vous pouvez modifier cette option dans les paramètres."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Pour votre sécurité, l\'installation d\'applis inconnues provenant de cette source n\'est pas autorisée sur ce téléphone actuellement. Vous pouvez modifier cette option dans les paramètres."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de son utilisation."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de son utilisation."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 16ad2a3..9d3b775 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Actualizar"</string>
<string name="done" msgid="6632441120016885253">"Feito"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Queres instalar esta aplicación?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Queres actualizar esta aplicación?"</string>
<string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As accións de instalar e desinstalar non son compatibles con Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nome descoñecido"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Por cuestións de seguranza, na tableta non se poden instalar actualmente aplicacións descoñecidas procedentes desta fonte. Podes cambiar esta opción en Configuración."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Por cuestións de seguranza, na televisión non se poden instalar actualmente aplicacións descoñecidas procedentes desta fonte. Podes cambiar esta opción en Configuración."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Por cuestións de seguranza, no teléfono non se poden instalar actualmente aplicacións descoñecidas procedentes desta fonte. Podes cambiar esta opción en Configuración."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O teléfono e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados no teléfono ou da perda dos datos que se poidan derivar do seu uso."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"A tableta e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na tableta ou da perda dos datos que se poidan derivar do seu uso."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A televisión e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na televisión ou da perda dos datos que se poidan derivar do seu uso."</string>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index 8046581..4c7d02d 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"પૅકેજ ઇન્સ્ટૉલર"</string>
<string name="install" msgid="711829760615509273">"ઇન્સ્ટૉલ કરો"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"અપડેટ કરો"</string>
<string name="done" msgid="6632441120016885253">"થઈ ગયું"</string>
<string name="cancel" msgid="1018267193425558088">"રદ કરો"</string>
<string name="installing" msgid="4921993079741206516">"ઇન્સ્ટૉલ કરી રહ્યાં છીએ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ને ઇન્સ્ટૉલ કરી રહ્યાં છીએ…"</string>
<string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"શું તમે આ ઍપ ઇન્સ્ટૉલ કરવા માગો છો?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"શું તમે આ ઍપ અપડેટ કરવા માગો છો?"</string>
<string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear પર ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ ક્રિયાઓ સમર્થિત નથી."</string>
<string name="message_staging" msgid="8032722385658438567">"ઍપ્લિકેશનની પ્રક્રિયા ચાલુ છે…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"અજાણ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"તમારી સુરક્ષા માટે, હાલમાં તમારા ટૅબ્લેટને આ સૉર્સ પરથી અજાણી ઍપ ઇન્સ્ટૉલ કરવાની મંજૂરી નથી. તમે આને સેટિંગમાં બદલી શકો છો."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"તમારી સુરક્ષા માટે, હાલમાં તમારા ટીવીને આ સૉર્સ પરથી અજાણી ઍપ ઇન્સ્ટૉલ કરવાની મંજૂરી નથી. તમે આને સેટિંગમાં બદલી શકો છો."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"તમારી સુરક્ષા માટે, હાલમાં તમારા ફોનને આ સૉર્સ પરથી અજાણી ઍપ ઇન્સ્ટૉલ કરવાની મંજૂરી નથી. તમે આને સેટિંગમાં બદલી શકો છો."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"તમારો ફોન અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ફોનને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"તમારું ટૅબ્લેટ અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ટૅબ્લેટને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"તમારું ટીવી અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ટીવીને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index 290a211..5d59c87 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"पैकेज इंस्टॉलर"</string>
<string name="install" msgid="711829760615509273">"इंस्टॉल करें"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"अपडेट करें"</string>
<string name="done" msgid="6632441120016885253">"हो गया"</string>
<string name="cancel" msgid="1018267193425558088">"रद्द करें"</string>
<string name="installing" msgid="4921993079741206516">"इंस्टॉल हो रहा है..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> इंस्टॉल हो रहा है…"</string>
<string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"क्या आप इस ऐप्लिकेशन को इंस्टॉल करना चाहते हैं?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"क्या आप इस ऐप्लिकेशन को अपडेट करना चाहते हैं?"</string>
<string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear पर ऐप्लिकेशन इंस्टॉल या अनइंस्टॉल नहीं किए जा सकते."</string>
<string name="message_staging" msgid="8032722385658438567">"ऐप्लिकेशन तैयार किया जा रहा है…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"अनजान"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"आपकी सुरक्षा के लिए, आपके टैबलेट को फ़िलहाल इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है. आप \'सेटिंग\' में जाकर इसे बदल सकते हैं."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"आपकी सुरक्षा के लिए, आपके टीवी को फ़िलहाल इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है. आप \'सेटिंग\' में जाकर इसे बदल सकते हैं."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"आपकी सुरक्षा के लिए, आपके फ़ोन को फ़िलहाल इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है. आप \'सेटिंग\' में जाकर इसे बदल सकते हैं."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"आपका फ़ोन और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके फ़ोन को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"आपका टैबलेट और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके टैबलेट को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"आपका टीवी और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके टीवी को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index c8517fa..6b37633 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Csomagtelepítő"</string>
<string name="install" msgid="711829760615509273">"Telepítés"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Frissítés"</string>
<string name="done" msgid="6632441120016885253">"Kész"</string>
<string name="cancel" msgid="1018267193425558088">"Mégse"</string>
<string name="installing" msgid="4921993079741206516">"Telepítés…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> telepítése…"</string>
<string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Telepíti ezt az alkalmazást?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Frissíti ezt az alkalmazást?"</string>
<string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"A Wear nem támogatja a telepítés/eltávolítás műveletet."</string>
<string name="message_staging" msgid="8032722385658438567">"Alkalmazás fokozatos közzététele…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ismeretlen"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Az Ön biztonsága érdekében táblagépe jelenleg nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat. Ezt módosíthatja a Beállítások között."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Az Ön biztonsága érdekében tévéje jelenleg nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat. Ezt módosíthatja a Beállítások között."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Az Ön biztonsága érdekében telefonja jelenleg nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat. Ezt módosíthatja a Beállítások között."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonja és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a telefont ért károkért."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Táblagépe és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a táblagépet ért károkért."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tévéje és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a tévét ért károkért."</string>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index 82cd089..4c2b0ad 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package Installer"</string>
<string name="install" msgid="711829760615509273">"Տեղադրել"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Թարմացնել"</string>
<string name="done" msgid="6632441120016885253">"Պատրաստ է"</string>
<string name="cancel" msgid="1018267193425558088">"Չեղարկել"</string>
<string name="installing" msgid="4921993079741206516">"Տեղադրում…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> հավելվածը տեղադրվում է…"</string>
<string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Տեղադրե՞լ այս հավելվածը:"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Թարմացնե՞լ այս հավելվածը։"</string>
<string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string>
@@ -83,15 +80,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Տեղադրման/ապատեղադրման գործողությունները Android Wear-ում չեն աջակցվում:"</string>
<string name="message_staging" msgid="8032722385658438567">"Սպասեք…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Անհայտ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ձեր հեռախոսը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռախոսին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
- <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ձեր պլանշետը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր պլանշետին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
- <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ձեր հեռուստացույցը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռուստացույցին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Անվտանգության նկատառումներից ելնելով՝ ձեր պլանշետում ներկայումս չի թույլատրվում անհայտ հավելվածներ տեղադրել այս աղբյուրից: Սա կարող եք փոխել կարգավորումներում։"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռուստացույցում ներկայումս չի թույլատրվում անհայտ հավելվածներ տեղադրել այս աղբյուրից: Սա կարող եք փոխել կարգավորումներում։"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռախոսում ներկայումս չի թույլատրվում անհայտ հավելվածներ տեղադրել այս աղբյուրից: Սա կարող եք փոխել կարգավորումներում։"</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ձեր հեռախոսը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռախոսին հասցված ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ձեր պլանշետը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր պլանշետին հասցված ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ձեր հեռուստացույցը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռուստացույցին հասցված ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"Շարունակել"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Կարգավորումներ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear հավելվածների տեղադրում/ապատեղադրում"</string>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index db5954d..bc368e7 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Installer paket"</string>
<string name="install" msgid="711829760615509273">"Instal"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Selesai"</string>
<string name="cancel" msgid="1018267193425558088">"Batal"</string>
<string name="installing" msgid="4921993079741206516">"Menginstal..."</string>
<string name="installing_app" msgid="1165095864863849422">"Menginstal <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Ingin menginstal aplikasi ini?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingin mengupdate aplikasi ini?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan Instal/Uninstal tidak didukung di Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Menyiapkan aplikasi..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tidak dikenal"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Demi keamanan, tablet Anda saat ini tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini. Anda dapat mengubahnya di Setelan."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Demi keamanan, TV Anda saat ini tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini. Anda dapat mengubahnya di Setelan."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Demi keamanan, ponsel Anda saat ini tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini. Anda dapat mengubahnya di Setelan."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ponsel dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan ponsel atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan tablet atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan TV atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index 9fc4d70..2b2e215 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Uppsetningarforrit pakka"</string>
<string name="install" msgid="711829760615509273">"Setja upp"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Uppfæra"</string>
<string name="done" msgid="6632441120016885253">"Lokið"</string>
<string name="cancel" msgid="1018267193425558088">"Hætta við"</string>
<string name="installing" msgid="4921993079741206516">"Setur upp…"</string>
<string name="installing_app" msgid="1165095864863849422">"Setur <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> upp…"</string>
<string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Viltu setja upp þetta forrit?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Viltu uppfæra þetta forrit?"</string>
<string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Aðgerðir til að setja upp / fjarlægja eru ekki studdar í Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Setur upp forrit…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Óþekkt"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Af öryggisástæðum er ekki heimilt að setja upp óþekkt forrit frá þessum uppruna í spjaldtölvunni þinni. Þú getur breytt þessu í stillingum."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Af öryggisástæðum er ekki heimilt að setja upp óþekkt forrit frá þessum uppruna í sjónvarpinu þínu. Þú getur breytt þessu í stillingum."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Af öryggisástæðum er ekki heimilt að setja upp óþekkt forrit frá þessum uppruna í símanum þínum. Þú getur breytt þessu í stillingum."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Síminn þinn og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á símanum eða gagnatapi sem leiða kann af notkun þess."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Spjaldtölvan þín og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á spjaldtölvunni eða gagnatapi sem leiða kann af notkun þess."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sjónvarpið þitt og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á sjónvarpinu eða gagnatapi sem leiða kann af notkun þess."</string>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 868c1a6..0351c45 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"מתקין החבילה"</string>
<string name="install" msgid="711829760615509273">"התקנה"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"עדכון"</string>
<string name="done" msgid="6632441120016885253">"סיום"</string>
<string name="cancel" msgid="1018267193425558088">"ביטול"</string>
<string name="installing" msgid="4921993079741206516">"בהתקנה…"</string>
<string name="installing_app" msgid="1165095864863849422">"מתבצעת התקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"האם ברצונך להתקין אפליקציה זו?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"האם ברצונך לעדכן אפליקציה זו?"</string>
<string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"פעולות התקנה/הסרת התקנה אינן נתמכות ב-Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"בתהליך הכנת האפליקציה להתקנה…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"לא ידוע"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"לצורכי אבטחה, הטאבלט שלך חסום להתקנת אפליקציות לא מוכרות מהמקור הזה. אפשר לשנות זאת ב\'הגדרות\'."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"לצורכי אבטחה, הטלוויזיה שלך חסומה להתקנת אפליקציות לא מוכרות מהמקור הזה. אפשר לשנות זאת ב\'הגדרות\'."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"לצורכי אבטחה, הטלפון שלך חסום להתקנת אפליקציות לא מוכרות מהמקור הזה. אפשר לשנות זאת ב\'הגדרות\'."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלפון שלך בעקבות השימוש באפליקציה."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"נתוני הטאבלט והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטאבלט בעקבות השימוש באפליקציה."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"נתוני הטלוויזיה והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלוויזיה שלך בעקבות השימוש באפליקציה."</string>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 535c1ae..880ff86 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"パッケージ インストーラ"</string>
<string name="install" msgid="711829760615509273">"インストール"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"更新"</string>
<string name="done" msgid="6632441120016885253">"完了"</string>
<string name="cancel" msgid="1018267193425558088">"キャンセル"</string>
<string name="installing" msgid="4921993079741206516">"インストールしています…"</string>
<string name="installing_app" msgid="1165095864863849422">"「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」をインストールしています…"</string>
<string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"このアプリをインストールしますか?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"このアプリを更新しますか?"</string>
<string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ではインストールやアンインストールはできません。"</string>
<string name="message_staging" msgid="8032722385658438567">"アプリを準備しています…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"セキュリティ上の理由から、お使いのタブレットでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"セキュリティ上の理由から、お使いのテレビでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"セキュリティ上の理由から、お使いのスマートフォンでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"不明なアプリをインストールするとスマートフォンや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるスマートフォンへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"不明なアプリをインストールするとタブレットや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるタブレットへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"不明なアプリをインストールするとテレビや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるテレビへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index c8b4401..4d83332 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"პაკეტის ინსტალატორი"</string>
<string name="install" msgid="711829760615509273">"ინსტალაცია"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"განახლება"</string>
<string name="done" msgid="6632441120016885253">"მზადაა"</string>
<string name="cancel" msgid="1018267193425558088">"გაუქმება"</string>
<string name="installing" msgid="4921993079741206516">"მიმდინარეობს ინსტალაცია…"</string>
<string name="installing_app" msgid="1165095864863849422">"მიმდინარეობს <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-ის ინსტალაცია…"</string>
<string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"გნებავთ ამ აპის დაყენება?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"გსურთ ამ აპის განახლება?"</string>
<string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ინსტალაცია/დეინსტალაცია მხარდაუჭერელია Wear-ზე."</string>
<string name="message_staging" msgid="8032722385658438567">"მიმდინარეობს აპის შუალედური შენახვა…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"უცნობი"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"თქვენივე უსაფრთხოებისთვის თქვენს ტაბლეტს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის ნებართვა. ამის შეცვლა პარამეტრებში შეგიძლიათ."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"თქვენივე უსაფრთხოებისთვის თქვენს ტელეფონს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის ნებართვა. ამის შეცვლა პარამეტრებში შეგიძლიათ."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"თქვენივე უსაფრთხოებისთვის, ტელეფონს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება. ამის შეცვლა პარამეტრებში შეგიძლიათ."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"თქვენი ტელეფონი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტელეფონისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"თქვენი ტაბლეტი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტაბლეტისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"თქვენი ტელევიზორი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტელევიზორისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index badfa4e..964e2c3 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Пакет орнатқыш"</string>
<string name="install" msgid="711829760615509273">"Орнату"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Жаңарту"</string>
<string name="done" msgid="6632441120016885253">"Дайын"</string>
<string name="cancel" msgid="1018267193425558088">"Бас тарту"</string>
<string name="installing" msgid="4921993079741206516">"Орнатылуда…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> орнатылуда…"</string>
<string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Бұл қолданбаны орнатқыңыз келе ме?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Бұл қолданбаны жаңартқыңыз келе ме?"</string>
<string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear жүйесінде \"Орнату/Жою\" әрекеттері қолданылмайды."</string>
<string name="message_staging" msgid="8032722385658438567">"Қолданба дайындалуда…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Белгісіз"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Қауіпсіздік үшін планшетке бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді. Мұны \"Параметрлер\" бөлімінен өзгертуіңізге болады."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Қауіпсіздік үшін теледидарға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді. Мұны \"Параметрлер\" бөлімінен өзгертуіңізге болады."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Қауіпсіздік үшін телефонға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді. Мұны \"Параметрлер\" бөлімінен өзгертуіңізге болады."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефон және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі телефонға келетін залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Планшет және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі планшетке келетін залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Теледидар және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі теледидарға келетін қандай да бір залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index eb13774..0ca4c12 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"កម្មវិធីដំឡើងកញ្ចប់"</string>
<string name="install" msgid="711829760615509273">"ដំឡើង"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"ដំឡើងកំណែ"</string>
<string name="done" msgid="6632441120016885253">"រួចរាល់"</string>
<string name="cancel" msgid="1018267193425558088">"បោះបង់"</string>
<string name="installing" msgid="4921993079741206516">"កំពុងដំឡើង…"</string>
<string name="installing_app" msgid="1165095864863849422">"កំពុងដំឡើង <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"តើអ្នកចង់ដំឡើងកំណែកម្មវិធីនេះដែរទេ?"</string>
<string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string>
@@ -83,13 +80,10 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"សកម្មភាពដំឡើង/លុបចេញមិនអាចប្រើនៅលើ Wear បានទេ។"</string>
<string name="message_staging" msgid="8032722385658438567">"កំពុងសាកល្បងកម្មវិធី…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"មិនស្គាល់"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ទូរសព្ទ និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះទូរសព្ទ ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ដើម្បីសុវត្ថិភាពរបស់អ្នក បច្ចុប្បន្នទូរទស្សន៍របស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។ អ្នកអាចប្ដូរវាបាននៅក្នុងការកំណត់។"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ដើម្បីសុវត្ថិភាពរបស់អ្នក បច្ចុប្បន្នទូរទស្សន៍របស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។ អ្នកអាចប្ដូរវាបាននៅក្នុងការកំណត់។"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ដើម្បីសុវត្ថិភាពរបស់អ្នក បច្ចុប្បន្នទូរទស្សន៍របស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។ អ្នកអាចប្ដូរវាបាននៅក្នុងការកំណត់។"</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ទូរសព្ទ និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកកាន់តែងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ អ្នកយល់ព្រមថា អ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយមកលើទូរសព្ទរបស់អ្នក ឬការបាត់បង់ទិន្នន័យ ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ថេប្លេត និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះថេប្លេត ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ទូរទស្សន៍ និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះទូរទស្សន៍ ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"បន្ត"</string>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index 66df526..045c481 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ಪ್ಯಾಕೇಜ್ ಇನ್ಸ್ಟಾಲರ್"</string>
<string name="install" msgid="711829760615509273">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"ಅಪ್ಡೇಟ್ ಮಾಡಿ"</string>
<string name="done" msgid="6632441120016885253">"ಮುಗಿದಿದೆ"</string>
<string name="cancel" msgid="1018267193425558088">"ರದ್ದುಮಾಡಿ"</string>
<string name="installing" msgid="4921993079741206516">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
<string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
<string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ನಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್/ಅನ್ಇನ್ಸ್ಟಾಲ್ ಕ್ರಿಯೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
<string name="message_staging" msgid="8032722385658438567">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಿದ್ಧವಿರುವ ಆ್ಯಪ್…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ಅಪರಿಚಿತ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪ್ರಸ್ತುತ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ. ನೀವು ಇದನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪ್ರಸ್ತುತ ನಿಮ್ಮ ಟಿವಿಗೆ ಅನುಮತಿಯಿಲ್ಲ. ನೀವು ಇದನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪ್ರಸ್ತುತ ನಿಮ್ಮ ಫೋನ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ. ನೀವು ಇದನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ನಿಮ್ಮ ಫೋನ್ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ನಿಮ್ಮ ಟಿವಿ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಟಿವಿಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 2eada00..1afdc34 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"패키지 설치 프로그램"</string>
<string name="install" msgid="711829760615509273">"설치"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"업데이트"</string>
<string name="done" msgid="6632441120016885253">"완료"</string>
<string name="cancel" msgid="1018267193425558088">"취소"</string>
<string name="installing" msgid="4921993079741206516">"설치 중..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 설치 중…"</string>
<string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"이 앱을 설치하시겠습니까?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"이 앱을 업데이트하시겠습니까?"</string>
<string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear에서 지원되지 않는 설치/제거 작업"</string>
<string name="message_staging" msgid="8032722385658438567">"앱 준비 중…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"알 수 없음"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"보안상의 이유로 이 출처의 알 수 없는 앱을 태블릿에 설치할 수 없습니다. 설정에서 변경할 수 있습니다."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"보안상의 이유로 현재 이 출처의 알 수 없는 앱을 TV에 설치할 수 없습니다. 설정에서 변경할 수 있습니다."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"보안상의 이유로 현재 이 출처의 알 수 없는 앱을 휴대전화에 설치할 수 없습니다. 설정에서 변경할 수 있습니다."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"휴대전화와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 휴대전화 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"태블릿과 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 태블릿 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 TV 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index ef65291..b9ceb08 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Топтомду орноткуч"</string>
<string name="install" msgid="711829760615509273">"Орнотуу"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Жаңыртуу"</string>
<string name="done" msgid="6632441120016885253">"Бүттү"</string>
<string name="cancel" msgid="1018267193425558088">"Жокко чыгаруу"</string>
<string name="installing" msgid="4921993079741206516">"Орнотулууда…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> орнотулууда…"</string>
<string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Бул колдонмону орнотоюн деп жатасызбы?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Бул колдонмону жаңыртайын деп жатасызбы?"</string>
<string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Орнотуу/чыгарып салуу аракеттери Android Wear\'де колдоого алынбайт."</string>
<string name="message_staging" msgid="8032722385658438567">"Күтө туруңуз…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Белгисиз"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Коопсуздукту сактоо максатында, азырынча планшетиңизге бул булактан колдонмолорду орнотууга уруксат жок. Муну Жөндөөлөрдөн өзгөртсөңүз болот."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Коопсуздукту сактоо максатында, азырынча сыналгыңызга бул булактан колдонмолорду орнотууга уруксат жок. Муну Жөндөөлөрдөн өзгөртсөңүз болот."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Коопсуздукту сактоо максатында, азырынча телефонуңузга бул булактан колдонмолорду орнотууга уруксат жок. Муну Жөндөөлөрдөн өзгөртсөңүз болот."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефонуңуз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам телефонуңузга кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Планшетиңиз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам планшетиңизге кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Сыналгыңыз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам сыналгыңызга кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index 78209bf..52c8b46 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ຕົວຕິດຕັ້ງແພັກເກດ"</string>
<string name="install" msgid="711829760615509273">"ຕິດຕັ້ງ"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"ອັບເດດ"</string>
<string name="done" msgid="6632441120016885253">"ແລ້ວໆ"</string>
<string name="cancel" msgid="1018267193425558088">"ຍົກເລີກ"</string>
<string name="installing" msgid="4921993079741206516">"ກຳລັງຕິດຕັ້ງ…"</string>
<string name="installing_app" msgid="1165095864863849422">"ກຳລັງຕິດຕັ້ງ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບນີ້ບໍ່?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ທ່ານຕ້ອງການອັບເດດແອັບນີ້ບໍ່?"</string>
<string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ຕິດຕັ້ງ/ຖອນການຕິດຕັ້ງ ຄຳສັ່ງທີ່ບໍ່ຮອງຮັບຢູ່ Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"ກຳລັງຮຽງແອັບ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ບໍ່ຮູ້ຈັກ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ຕອນນີ້ແທັບເລັດຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ຈັກຈາກແຫຼ່ງທີ່ມານີ້ໄດ້. ທ່ານສາມາດປ່ຽນສິ່ງນີ້ໄດ້ໃນການຕັ້ງຄ່າ."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ຕອນນີ້ໂທລະທັດຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ຈັກຈາກແຫຼ່ງທີ່ມານີ້ໄດ້. ທ່ານສາມາດປ່ຽນສິ່ງນີ້ໄດ້ໃນການຕັ້ງຄ່າ."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ຕອນນີ້ໂທລະສັບຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ຈັກຈາກແຫຼ່ງທີ່ມານີ້ໄດ້. ທ່ານສາມາດປ່ຽນສິ່ງນີ້ໄດ້ໃນການຕັ້ງຄ່າ."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ໂທລະສັບ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ແທັບເລັດ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ໂທລະທັດ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml
index b0bff20..5d57b03 100644
--- a/packages/PackageInstaller/res/values-lt/strings.xml
+++ b/packages/PackageInstaller/res/values-lt/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketo diegimo programa"</string>
<string name="install" msgid="711829760615509273">"Įdiegti"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Naujinys"</string>
<string name="done" msgid="6632441120016885253">"Atlikta"</string>
<string name="cancel" msgid="1018267193425558088">"Atšaukti"</string>
<string name="installing" msgid="4921993079741206516">"Įdiegiama…"</string>
<string name="installing_app" msgid="1165095864863849422">"Įdiegiamas paketas „<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>“…"</string>
<string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Ar norite įdiegti šią programą?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Ar norite atnaujinti šią programą?"</string>
<string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Diegimo / pašalinimo veiksmai nepalaikomi sistemoje „Wear“."</string>
<string name="message_staging" msgid="8032722385658438567">"Programa pateikiama etapais…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nežinoma"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Saugos sumetimais šiuo metu planšetiniame kompiuteryje neleidžiama diegti nežinomų programų iš šio šaltinio. Tai galite pakeisti nustatymuose."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Saugos sumetimais šiuo metu televizoriuje neleidžiama diegti nežinomų programų iš šio šaltinio. Tai galite pakeisti nustatymuose."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Saugos sumetimais šiuo metu telefone neleidžiama diegti nežinomų programų iš šio šaltinio. Tai galite pakeisti nustatymuose."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonas ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą telefonui arba prarastus duomenis dėl šios programos naudojimo."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planšetinis kompiuteris ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą planšetiniam kompiuteriui arba prarastus duomenis dėl šios programos naudojimo."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą TV arba prarastus duomenis dėl šios programos naudojimo."</string>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index 70ea596..c58b293 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakotnes instalēš. progr."</string>
<string name="install" msgid="711829760615509273">"Instalēt"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Atjaunināt"</string>
<string name="done" msgid="6632441120016885253">"Gatavs"</string>
<string name="cancel" msgid="1018267193425558088">"Atcelt"</string>
<string name="installing" msgid="4921993079741206516">"Notiek instalēšana…"</string>
<string name="installing_app" msgid="1165095864863849422">"Notiek pakotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalēšana…"</string>
<string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vai vēlaties instalēt šo lietotni?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vai vēlaties atjaunināt šo lietotni?"</string>
<string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Operētājsistēmā Wear netiek atbalstīta instalēšana/atinstalēšana."</string>
<string name="message_staging" msgid="8032722385658438567">"Lietotne tiek izstādīta…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nezināma"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Drošības apsvērumu dēļ jūsu planšetdatorā pašlaik nav atļauts instalēt nezināmas lietotnes no šī avota. Jūs varat to mainīt iestatījumos."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Drošības apsvērumu dēļ jūsu televizorā pašlaik nav atļauts instalēt nezināmas lietotnes no šī avota. Jūs varat to mainīt iestatījumos."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Drošības apsvērumu dēļ jūsu tālrunī pašlaik nav atļauts instalēt nezināmas lietotnes no šī avota. Jūs varat to mainīt iestatījumos."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Jūsu tālrunis un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par tālruņa bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Jūsu planšetdators un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par planšetdatora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Jūsu televizors un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par televizora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index 6152b398..4ebe101 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Инсталатор на пакет"</string>
<string name="install" msgid="711829760615509273">"Инсталирај"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Ажурирај"</string>
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Откажи"</string>
<string name="installing" msgid="4921993079741206516">"Се инсталира…"</string>
<string name="installing_app" msgid="1165095864863849422">"Се инсталира <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Дали сакате да ја инсталирате апликацијава?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Дали сакате да ја ажурирате апликацијава?"</string>
<string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дејствата „Инсталирај/деинсталирај“ не се поддржани на Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Апликацијата се поставува…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Непозната"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"За ваша безбедност, таблетот нема дозвола за инсталирање непознати апликации од изворов во моментов. Ова може да го промените во „Поставки“."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"За ваша безбедност, телевизорот нема дозвола за инсталирање непознати апликации од изворов во моментов. Ова може да го промените во „Поставки“."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"За ваша безбедност, телефонот нема дозвола за инсталирање непознати апликации од изворов во моментов. Ова може да го промените во „Поставки“."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефонот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на телефонот или губењето податоци што може да произлезат од нејзиното користење."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таблетот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на таблетот или губењето податоци што може да произлезат од нејзиното користење."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Телевизорот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на телевизорот или губењето податоци што може да произлезат од нејзиното користење."</string>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index d66f4d6..0d24f87 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"പാക്കേജ് ഇൻസ്റ്റാളർ"</string>
<string name="install" msgid="711829760615509273">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"അപ്ഡേറ്റ് ചെയ്യൂ"</string>
<string name="done" msgid="6632441120016885253">"പൂർത്തിയായി"</string>
<string name="cancel" msgid="1018267193425558088">"റദ്ദാക്കുക"</string>
<string name="installing" msgid="4921993079741206516">"ഇൻസ്റ്റാൾ ചെയ്യുന്നു…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ഇൻസ്റ്റാൾ ചെയ്യുന്നു…"</string>
<string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?"</string>
<string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ഇൻസ്റ്റാൾ/അൺഇൻസ്റ്റാൾ ചെയ്യുന്നത് Wear പിന്തുണയ്ക്കുന്നില്ല."</string>
<string name="message_staging" msgid="8032722385658438567">"ആപ്പ് തയ്യാറാക്കുന്നു…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"അജ്ഞാതം"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഈ ഉറവിടത്തിൽ നിന്നുള്ള അജ്ഞാതമായ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ നിലവിൽ നിങ്ങളുടെ ടാബ്ലെറ്റിന് അനുമതിയില്ല. നിങ്ങൾക്ക് ഇത് ക്രമീകരണത്തിൽ മാറ്റാം."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഈ ഉറവിടത്തിൽ നിന്നുള്ള അജ്ഞാതമായ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ നിലവിൽ നിങ്ങളുടെ ടിവിക്ക് അനുമതിയില്ല. നിങ്ങൾക്ക് ഇത് ക്രമീകരണത്തിൽ മാറ്റാം."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഈ ഉറവിടത്തിൽ നിന്നുള്ള അജ്ഞാതമായ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ നിലവിൽ നിങ്ങളുടെ ഫോണിന് അനുമതിയില്ല. നിങ്ങൾക്ക് ഇത് ക്രമീകരണത്തിൽ മാറ്റാം."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ഫോണും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ഫോണിന് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ടാബ്ലെറ്റും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ടാബ്ലെറ്റിന് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ടിവിയും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ടിവിക്ക് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index 6cc992a..3f49e8c 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Багц суулгагч"</string>
<string name="install" msgid="711829760615509273">"Суулгах"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Шинэчлэх"</string>
<string name="done" msgid="6632441120016885253">"Болсон"</string>
<string name="cancel" msgid="1018267193425558088">"Болих"</string>
<string name="installing" msgid="4921993079741206516">"Суулгаж байна…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-г суулгаж байна…"</string>
<string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Та энэ аппыг шинэчлэхийг хүсэж байна уу?"</string>
<string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-д суулгах/устгах үйлдлийг дэмждэггүй."</string>
<string name="message_staging" msgid="8032722385658438567">"Аппыг байршуулж байна…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Тодорхойгүй"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Таны аюулгүй байдлыг хангах үүднээс таны таблетыг одоогоор энэ эх сурвалжаас тодорхойгүй аппууд суулгахыг зөвшөөрөөгүй. Та үүнийг Тохиргоо хэсэгт өөрчлөх боломжтой."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Таны аюулгүй байдлыг хангах үүднээс таны ТВ-ийг одоогоор энэ эх сурвалжаас тодорхойгүй аппууд суулгахыг зөвшөөрөөгүй. Та үүнийг Тохиргоо хэсэгт өөрчлөх боломжтой."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Таны аюулгүй байдлыг хангах үүднээс таны утсыг одоогоор энэ эх сурвалжаас тодорхойгүй аппууд суулгахыг зөвшөөрөөгүй. Та үүнийг Тохиргоо хэсэгт өөрчлөх боломжтой."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Таны утас болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны утсанд гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таны таблет болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны таблетад гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Таны ТВ болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны ТВ-д гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index 844ed81..e5adc8a 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"पॅकेज इंस्टॉलर"</string>
<string name="install" msgid="711829760615509273">"इंस्टॉल करा"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"अपडेट करा"</string>
<string name="done" msgid="6632441120016885253">"पूर्ण झाले"</string>
<string name="cancel" msgid="1018267193425558088">"रद्द करा"</string>
<string name="installing" msgid="4921993079741206516">"इंस्टॉल होत आहे…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> इंस्टॉल होत आहे…"</string>
<string name="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"तुम्हाला हे ॲप इंस्टॉल करायचे आहे का?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"तुम्हाला हे ॲप अपडेट करायचे आहे का?"</string>
<string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"इंस्टॉल करा/अनइंस्टॉल करा क्रिया Wear वर सपोर्ट करत नाहीत."</string>
<string name="message_staging" msgid="8032722385658438567">"अॅप सुरुवातीच्या स्थितीत आहे…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"तुमच्या सुरक्षिततेसाठी, तुमच्या टॅबलेटला सध्या या स्रोतावरील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही. तुम्ही हे सेटिंग्ज मध्ये बदलू शकता."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"तुमच्या सुरक्षिततेसाठी, तुमच्या टीव्हीला सध्या या स्रोतावरील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही. तुम्ही हे सेटिंग्ज मध्ये बदलू शकता."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"तुमच्या सुरक्षिततेसाठी, तुमच्या फोनला सध्या या स्रोतावरील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही. तुम्ही हे सेटिंग्ज मध्ये बदलू शकता."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तुमचा फोन आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने होणार्या तुमच्या फोनचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तुमचा टॅबलेट आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने तुमच्या टॅबलेटचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तुमचा टीव्ही आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने तुमच्या टीव्हीचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index ce251a5..3adfe88 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pemasang pakej"</string>
<string name="install" msgid="711829760615509273">"Pasang"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Kemas kini"</string>
<string name="done" msgid="6632441120016885253">"Selesai"</string>
<string name="cancel" msgid="1018267193425558088">"Batal"</string>
<string name="installing" msgid="4921993079741206516">"Memasang…"</string>
<string name="installing_app" msgid="1165095864863849422">"Memasang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Adakah anda ingin memasang aplikasi ini?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Adakah anda mahu mengemas kini apl ini?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan pasang/nyahpasang tidak disokong pada Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Pemeringkatan apl…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tidak diketahui"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Untuk keselamatan, tablet anda kini tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini buat masa ini. Anda boleh menukar pilihan ini dalam Tetapan."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Untuk keselamatan, TV anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini buat masa ini. Anda boleh menukar pilihan ini dalam Tetapan."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Untuk keselamatan anda, telefon anda kini tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini buat masa ini. Anda boleh menukar pilihan ini dalam Tetapan."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada telefon anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada tablet anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada TV anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index 3c3ed99..e0fa952 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ပက်ကေ့ဂျ်ထည့်သွင်းကိရိယာ"</string>
<string name="install" msgid="711829760615509273">"ထည့်သွင်းရန်"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"အပ်ဒိတ်လုပ်ရန်"</string>
<string name="done" msgid="6632441120016885253">"ပြီးပြီ"</string>
<string name="cancel" msgid="1018267193425558088">"မလုပ်တော့"</string>
<string name="installing" msgid="4921993079741206516">"ထည့်သွင်းနေသည်…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ထည့်သွင်းနေသည်…"</string>
<string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ဤအက်ပ်ကို ထည့်သွင်းလိုသလား။"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ဤအက်ပ်ကို အပ်ဒိတ်လုပ်လိုသလား။"</string>
<string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string>
@@ -70,8 +67,8 @@
<string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ဖယ်ရှားလိုက်ပါပြီ"</string>
<string name="uninstall_failed" msgid="1847750968168364332">"ဖယ်ရှား၍ မရပါ။"</string>
<string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ဖယ်ရှား၍မရပါ။"</string>
- <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"ဖွင့်ထားသော စက်ပစ္စည်းစီမံခန့်ခွဲမှုအက်ပ်အား ဖယ်ရှား၍မရပါ"</string>
- <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> အတွက် ဖွင့်ထားသော စက်ပစ္စည်းစီမံခန့်ခွဲမှုအက်ပ်အား ဖယ်ရှား၍မရပါ"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"အသုံးပြုနေသော စက်စီမံအက်ပ်ကို ဖယ်ရှား၍မရပါ"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> အတွက် ဖွင့်ထားသော စက်စီမံအက်ပ်ကို ဖယ်ရှား၍မရပါ"</string>
<string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"ဤအက်ပ်သည် အချို့အသုံးပြုသူများ သို့မဟုတ် ပရိုဖိုင်များအတွက် လိုအပ်ပြီး အခြားသူများအတွက် ဖယ်ရှားထားသည်"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"သင့်ပရိုဖိုင်အတွက် ဤအက်ပ်ကိုလိုအပ်သောကြောင့် ဖယ်ရှား၍မရပါ။"</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"ဤအက်ပ်ကို သင်၏ စီမံခန့်ခွဲသူကလိုအပ်သောကြောင့် ၎င်းကို ဖယ်ရှား၍မရပါ။"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ပေါ်တွင် ထည့်သွင်းခြင်း/ဖယ်ရှားခြင်းများကို ပံ့ပိုးမထားပါ။"</string>
<string name="message_staging" msgid="8032722385658438567">"အက်ပ်ကို ပြင်ဆင်နေသည်…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"အမည်မသိ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"လုံခြုံရေးအရ ဤရင်းမြစ်မှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင့်တက်ဘလက်တွင် လောလောဆယ် ထည့်သွင်းခွင့်မရှိပါ။ ၎င်းကို ‘ဆက်တင်များ’ တွင် ပြောင်းနိုင်ပါသည်။"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"လုံခြုံရေးအရ ဤရင်းမြစ်မှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင့် TV တွင် လောလောဆယ် ထည့်သွင်းခွင့်မရှိပါ။ ၎င်းကို ‘ဆက်တင်များ’ တွင် ပြောင်းနိုင်ပါသည်။"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"လုံခြုံရေးအရ ဤရင်းမြစ်မှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင့်ဖုန်းတွင် လောလောဆယ် ထည့်သွင်းခွင့်မရှိပါ။ ၎င်းကို ‘ဆက်တင်များ’ တွင် ပြောင်းနိုင်ပါသည်။"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"သင်၏ဖုန်းနှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော ဖုန်းပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"သင်၏ တက်ဘလက်နှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော တက်ဘလက်ပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"သင်၏ TV နှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော TV ပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index e0faa84..e382620 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakkeinstallasjon"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Oppdater"</string>
<string name="done" msgid="6632441120016885253">"Ferdig"</string>
<string name="cancel" msgid="1018267193425558088">"Avbryt"</string>
<string name="installing" msgid="4921993079741206516">"Installerer …"</string>
<string name="installing_app" msgid="1165095864863849422">"Installerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string>
<string name="install_done" msgid="5987363587661783896">"Appen er installert."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne appen?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du oppdatere denne appen?"</string>
<string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Handlinger for å installere og avinstallere støttes ikke på Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Klargjør appen …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ukjent"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Nettbrettet har for øyeblikket ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din. Du kan endre dette i innstillingene."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"TV-en har for øyeblikket ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din. Du kan endre dette i innstillingene."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Telefonen har for øyeblikket ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din. Du kan endre dette i innstillingene."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonen din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på telefonen eller tap av data som kan skyldes bruk av appen"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Nettbrettet ditt og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på nettbrettet eller tap av data som kan skyldes bruk av appen."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV-en din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på TV-en eller tap av data som kan skyldes bruk av appen."</string>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index 4405123..1f378c5 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -41,8 +41,8 @@
<string name="install_failed_msg" product="default" msgid="6484461562647915707">"तपाईंको फोनमा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string>
<string name="launch" msgid="3952550563999890101">"खोल्नुहोस्"</string>
<string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"तपाईंका प्रशासकले अज्ञात स्रोतहरूबाट प्राप्त एपहरूलाई स्थापना गर्ने अनुमति दिनुहुन्न"</string>
- <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात एपहरू स्थापना गर्न सक्नुहुन्न"</string>
- <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई एपहरू स्थापना गर्ने अनुमति छैन"</string>
+ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात एपहरू इन्स्टल गर्न सक्नुहुन्न"</string>
+ <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई एपहरू इन्स्टल गर्ने अनुमति छैन"</string>
<string name="ok" msgid="7871959885003339302">"ठिक छ"</string>
<string name="manage_applications" msgid="5400164782453975580">"एपको प्रबन्ध गर्नु…"</string>
<string name="out_of_space_dlg_title" msgid="4156690013884649502">"खाली ठाउँ छैन"</string>
@@ -57,10 +57,10 @@
<string name="uninstall_update_title" msgid="824411791011583031">"अद्यावधिकको स्थापना रद्द गर्नु…"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> निम्न एपको अंश हो:"</string>
<string name="uninstall_application_text" msgid="3816830743706143980">"तपाईं यो एपको स्थापना रद्द गर्न चाहनुहुन्छ?"</string>
- <string name="uninstall_application_text_all_users" msgid="575491774380227119">"तपाईं "<b>"सबै"</b>" प्रयोगकर्ताका लागि यो एपको स्थापना रद्द गर्न चाहनुहुन्छ? यन्त्रका "<b>"सबै"</b>" प्रयोगकर्ताहरूबाट उक्त एप र यसको डेटा हटाइने छ।"</string>
+ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"तपाईं "<b>"सबै"</b>" प्रयोगकर्ताका लागि यो एपको स्थापना रद्द गर्न चाहनुहुन्छ? डिभाइसका "<b>"सबै"</b>" प्रयोगकर्ताहरूबाट उक्त एप र यसको डेटा हटाइने छ।"</string>
<string name="uninstall_application_text_user" msgid="498072714173920526">"तपाईं प्रयोगकर्ता <xliff:g id="USERNAME">%1$s</xliff:g> का लागि यो एपको स्थापना रद्द गर्न चाहनुहुन्छ?"</string>
<string name="uninstall_update_text" msgid="863648314632448705">"यस एपलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ।"</string>
- <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"यस एपलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ। यसले यस यन्त्रका कार्य प्रोफाइल भएका लगायत सबै प्रयोगकर्ताहरूमा असर पार्छ।"</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"यस एपलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ। यसले यस डिभाइसका कार्य प्रोफाइल भएका लगायत सबै प्रयोगकर्ताहरूमा असर पार्छ।"</string>
<string name="uninstall_keep_data" msgid="7002379587465487550">"<xliff:g id="SIZE">%1$s</xliff:g> एपको डेटा राख्नुहोस्।"</string>
<string name="uninstalling_notification_channel" msgid="840153394325714653">"चलिरहेका स्थापना रद्द गर्ने कार्यहरू"</string>
<string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"असफल भएका स्थापना रद्द गर्ने कार्यहरू"</string>
@@ -70,12 +70,12 @@
<string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गरियो"</string>
<string name="uninstall_failed" msgid="1847750968168364332">"स्थापना रद्द गर्न सकिएन।"</string>
<string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गर्ने कार्य असफल भयो।"</string>
- <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"यन्त्रको सक्रिय प्रशासकीय एपको स्थापना रद्द गर्न मिल्दैन"</string>
- <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> को यन्त्रको सक्रिय प्रशासकीय एपको स्थापना रद्द गर्न मिल्दैन"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"डिभाइसको सक्रिय प्रशासकीय एपको स्थापना रद्द गर्न मिल्दैन"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> को डिभाइसको सक्रिय प्रशासकीय एपको स्थापना रद्द गर्न मिल्दैन"</string>
<string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"अन्य प्रयोगकर्ताहरूका लागि यस एपको स्थापना रद्द गरे पनि केही प्रयोगकर्ता वा प्रोफाइलहरूलाई यसको आवश्यकता पर्दछ"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"यो एप तपाईंको प्रोफाइलका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string>
- <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"यो एप तपाईंको यन्त्रका प्रशासकका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string>
- <string name="manage_device_administrators" msgid="3092696419363842816">"यन्त्रका व्यवस्थापकीय एपको व्यवस्थापन गर्नु…"</string>
+ <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"यो एप तपाईंको डिभाइसका प्रशासकका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string>
+ <string name="manage_device_administrators" msgid="3092696419363842816">"डिभाइसका व्यवस्थापकीय एपको व्यवस्थापन गर्नु…"</string>
<string name="manage_users" msgid="1243995386982560813">"प्रयोगकर्ताहरूको व्यवस्थापन गर्नुहोस्"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> को स्थापना रद्द गर्न सकिएन।"</string>
<string name="Parse_error_dlg_text" msgid="1661404001063076789">"प्याकेजलाई पार्स गर्ने क्रममा समस्या भयो।"</string>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index 3c26eec..ea675b1 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakket-installatie"</string>
<string name="install" msgid="711829760615509273">"Installeren"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Updaten"</string>
<string name="done" msgid="6632441120016885253">"Klaar"</string>
<string name="cancel" msgid="1018267193425558088">"Annuleren"</string>
<string name="installing" msgid="4921993079741206516">"Installeren…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeren…"</string>
<string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Wil je deze app installeren?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil je deze app updaten?"</string>
<string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acties voor installeren/verwijderen niet ondersteund op Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"App uitvoeren…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Onbekend"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Uit veiligheidsoverwegingen heeft je tablet momenteel geen toestemming om onbekende apps van deze bron te installeren. Je kunt dit wijzigen via Instellingen."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Uit veiligheidsoverwegingen heeft je tv momenteel geen toestemming om onbekende apps van deze bron te installeren. Je kunt dit wijzigen via Instellingen."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Uit veiligheidsoverwegingen heeft je telefoon momenteel geen toestemming op onbekende apps van deze bron te installeren. Je kunt dit wijzigen via Instellingen."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Je telefoon en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je telefoon of gegevensverlies als gevolg van het gebruik van de app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Je tablet en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tablet of gegevensverlies als gevolg van het gebruik van de app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Je tv en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tv of gegevensverlies als gevolg van het gebruik van de app."</string>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
index e1617f4..3ea1e99 100644
--- a/packages/PackageInstaller/res/values-or/strings.xml
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲର୍"</string>
<string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"ଅପଡେଟ୍ କରନ୍ତୁ"</string>
<string name="done" msgid="6632441120016885253">"ହୋଇଗଲା"</string>
<string name="cancel" msgid="1018267193425558088">"ବାତିଲ୍ କରନ୍ତୁ"</string>
<string name="installing" msgid="4921993079741206516">"ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string>
<string name="install_done" msgid="5987363587661783896">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ଆପଣ ଏହି ଆପକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ଆପଣ ଏହି ଆପକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string>
<string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ୱିଅର୍ରେ ଇନଷ୍ଟଲ୍/ଅନଇନଷ୍ଟଲ୍ କାର୍ଯ୍ୟ ସପୋର୍ଟ କରେନାହିଁ।"</string>
<string name="message_staging" msgid="8032722385658438567">"ଆପ୍ ପର୍ଯ୍ୟାୟଭୁକ୍ତ କରାଯାଉଛି…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ଅଜଣା"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟାବଲେଟକୁ ବର୍ତ୍ତମାନ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ। ଆପଣ ଏହାକୁ ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟିଭିକୁ ବର୍ତ୍ତମାନ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ। ଆପଣ ଏହାକୁ ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଫୋନକୁ ବର୍ତ୍ତମାନ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ। ଆପଣ ଏହାକୁ ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଫୋନ୍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଫୋନ୍ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟାବଲେଟ୍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟାବ୍ଲେଟ୍ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟିଭି ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟିଭିରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index ce56ab1..0d44440 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ਪੈਕੇਜ ਸਥਾਪਨਾਕਾਰ"</string>
<string name="install" msgid="711829760615509273">"ਸਥਾਪਤ ਕਰੋ"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"ਅੱਪਡੇਟ ਕਰੋ"</string>
<string name="done" msgid="6632441120016885253">"ਹੋ ਗਿਆ"</string>
<string name="cancel" msgid="1018267193425558088">"ਰੱਦ ਕਰੋ"</string>
<string name="installing" msgid="4921993079741206516">"ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
@@ -83,13 +80,10 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear \'ਤੇ ਸਥਾਪਤ ਜਾਂ ਅਣਸਥਾਪਤ ਕਰਨ ਦੀਆਂ ਕਾਰਵਾਈਆਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।"</string>
<string name="message_staging" msgid="8032722385658438567">"ਐਪ ਨੂੰ ਸਟੇਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ਅਗਿਆਤ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਟੀਵੀ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹੋਣ ਵਾਲੇ ਹਮਲਿਆਂ ਕਰਕੇ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਨਿੱਜੀ ਡਾਟੇ ਨਾਲ ਛੇੜਛਾੜ ਹੋ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ਤੁਹਾਡਾ ਟੀਵੀ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੀਵੀ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"ਜਾਰੀ ਰੱਖੋ"</string>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index 57ee7fe..9fd3ada 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalator pakietu"</string>
<string name="install" msgid="711829760615509273">"Zainstaluj"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Aktualizuj"</string>
<string name="done" msgid="6632441120016885253">"Gotowe"</string>
<string name="cancel" msgid="1018267193425558088">"Anuluj"</string>
<string name="installing" msgid="4921993079741206516">"Instaluję…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instaluję pakiet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Zainstalować tę aplikację?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Zaktualizować tę aplikację?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nie obsługuje instalowania ani odinstalowywania."</string>
<string name="message_staging" msgid="8032722385658438567">"Przygotowuję aplikację…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inny"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Ze względów bezpieczeństwa na Twoim tablecie nie można obecnie instalować nieznanych aplikacji z tego źródła. Możesz to zmienić w Ustawieniach."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Ze względów bezpieczeństwa na Twoim telewizorze nie można obecnie instalować nieznanych aplikacji z tego źródła. Możesz to zmienić w Ustawieniach."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Ze względów bezpieczeństwa na Twoim telefonie nie można obecnie instalować nieznanych aplikacji z tego źródła. Możesz to zmienić w Ustawieniach."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Dane na telefonie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telefonu lub utratę danych w wyniku jej używania."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Dane na tablecie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie tabletu lub utratę danych w wyniku jej używania."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Dane na telewizorze i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telewizora lub utratę danych w wyniku jej używania."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index cef7681..2111b87 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Atualizar"</string>
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalado."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string>
<string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Testando app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Para sua segurança, o tablet não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Para sua segurança, a TV não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Para sua segurança, o smartphone não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index 0710aa3..9689415 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Atualizar"</string>
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"A instalar…"</string>
<string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalada."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Pretende instalar esta app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"A preparar a app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecida"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Para sua segurança, o tablet não está atualmente autorizado a instalar apps desconhecidas a partir desta origem. Pode alterar esta opção nas Definições."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Para sua segurança, a TV não está atualmente autorizada a instalar apps desconhecidas a partir desta origem. Pode alterar esta opção nas Definições."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Para sua segurança, o telemóvel não está atualmente autorizado a instalar apps desconhecidas a partir desta origem. Pode alterar esta opção nas Definições."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O seu telemóvel e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao telemóvel ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"O seu tablet e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao tablet ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A sua TV e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados à TV ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index cef7681..2111b87 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Atualizar"</string>
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalado."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string>
<string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Testando app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Para sua segurança, o tablet não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Para sua segurança, a TV não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Para sua segurança, o smartphone não tem permissão para instalar apps desconhecidos dessa fonte. Você pode mudar isso nas configurações."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index 1198601..5627c29 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Program de instalare a pachetelor"</string>
<string name="install" msgid="711829760615509273">"Instalați"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Actualizați"</string>
<string name="done" msgid="6632441120016885253">"Gata"</string>
<string name="cancel" msgid="1018267193425558088">"Anulați"</string>
<string name="installing" msgid="4921993079741206516">"Se instalează…"</string>
<string name="installing_app" msgid="1165095864863849422">"Se instalează <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Doriți să instalați această aplicație?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Doriți să actualizați această aplicație?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acțiunile de instalare și dezinstalare nu sunt acceptate pe Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Se pregătește aplicația…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Necunoscut"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableta și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați aplicația, acceptați că sunteți singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizorul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index b5477c1..f277eca 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Установщик пакетов"</string>
<string name="install" msgid="711829760615509273">"Установить"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Обновить"</string>
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Отмена"</string>
<string name="installing" msgid="4921993079741206516">"Установка…"</string>
<string name="installing_app" msgid="1165095864863849422">"Установка приложения \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string>
<string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Установить приложение?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Обновить приложение?"</string>
<string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Установка и удаление не поддерживаются в Wear OS."</string>
<string name="message_staging" msgid="8032722385658438567">"Подождите…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Неизвестное приложение"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"В целях безопасности ваш планшет блокирует установку неизвестных приложений из этого источника. Этот параметр можно изменить в настройках."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"В целях безопасности ваш телевизор блокирует установку неизвестных приложений из этого источника. Этот параметр можно изменить в настройках."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"В целях безопасности ваш телефон блокирует установку неизвестных приложений из этого источника. Этот параметр можно изменить в настройках."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваши персональные данные и данные телефона более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный телефону, и возможную потерю данных."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваши персональные данные и данные планшета более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный планшету, и возможную потерю данных."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваши персональные данные и данные телевизора более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный телевизору, и возможную потерю данных."</string>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index b517efa..4b941bb 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"පැකේජ ස්ථාපනකරු"</string>
<string name="install" msgid="711829760615509273">"ස්ථාපනය කරන්න"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"යාවත්කාලීන කර."</string>
<string name="done" msgid="6632441120016885253">"කළා"</string>
<string name="cancel" msgid="1018267193425558088">"අවලංගු කරන්න"</string>
<string name="installing" msgid="4921993079741206516">"ස්ථාපනය කරමින්…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ස්ථාපනය කරමින්…"</string>
<string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"ඔබට මෙම යෙදුම යාවත්කාලීන කිරීමට අවශ්යද?"</string>
<string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear මත ස්ථාපන/අස්ථාපනය ක්රියා සහාය දක්වන්නේ නැත."</string>
<string name="message_staging" msgid="8032722385658438567">"යෙදුම වේදිකාගත කරමින්..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"නොදනී"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ඔබගේ ආරක්ෂාව සඳහා, ඔබගේ ටැබ්ලටයට දැනට මෙම මූලාශ්රයෙන් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට ඉඩ නොදේ. ඔබට සැකසීම් තුළ මෙය වෙනස් කළ හැකිය."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ඔබගේ ආරක්ෂාව සඳහා, ඔබගේ TV හට දැනට මෙම මූලාශ්රයෙන් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට ඉඩ නොදේ. ඔබට සැකසීම් තුළ මෙය වෙනස් කළ හැකිය."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ඔබගේ ආරක්ෂාව සඳහා, ඔබගේ දුරකථනයට දැනට මෙම මූලාශ්රයෙන් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට ඉඩ නොදේ. ඔබට සැකසීම් තුළ මෙය වෙනස් කළ හැකිය."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ඔබගේ දුරකථනය සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ දුරකථනය සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ඔබගේ ටැබ්ලට් පරිගණකය සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ ටැබ්ලට් පරිගණකය සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ඔබගේ TV සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ TV සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index aa02eb4..10aa411 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Nástroj na inštaláciu balíkov"</string>
<string name="install" msgid="711829760615509273">"Inštalovať"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Aktualizovať"</string>
<string name="done" msgid="6632441120016885253">"Hotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Zrušiť"</string>
<string name="installing" msgid="4921993079741206516">"Inštaluje sa…"</string>
<string name="installing_app" msgid="1165095864863849422">"Inštaluje sa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Chcete túto aplikáciu nainštalovať?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete túto aplikáciu aktualizovať?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string>
@@ -83,13 +80,10 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nepodporuje akciu inštalácie/odinštalovania."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikácia je zavádzaná po etapách…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznáma"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Váš telefón a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie telefónu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Váš tablet momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Váš televízor momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Váš telefón momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Váš telefón a osobné údaje sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie telefónu alebo stratu údajov, ktoré by mohli nastať pri jej používaní."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Váš tablet a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie tabletu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Váš televízor a osobné údaje sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie televízora alebo stratu údajov, ktoré by mohli nastať pri jej používaní."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"Pokračovať"</string>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index add57cf..a1e56fe 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Namest. program za paket"</string>
<string name="install" msgid="711829760615509273">"Namesti"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Posodobi"</string>
<string name="done" msgid="6632441120016885253">"Končano"</string>
<string name="cancel" msgid="1018267193425558088">"Prekliči"</string>
<string name="installing" msgid="4921993079741206516">"Nameščanje …"</string>
<string name="installing_app" msgid="1165095864863849422">"Nameščanje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Ali želite namestiti to aplikacijo?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Ali želite posodobiti to aplikacijo?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Dejanja namestitve in odstranitve v sistemu Android Wear niso podprta."</string>
<string name="message_staging" msgid="8032722385658438567">"Priprava aplikacije …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznano"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Tablični računalnik zaradi varnosti trenutno nima dovoljenja za nameščanje neznanih aplikacij iz tega vira. To lahko spremenite v nastavitvah."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Televizor zaradi varnosti trenutno nima dovoljenja za nameščanje neznanih aplikacij iz tega vira. To lahko spremenite v nastavitvah."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Telefon zaradi varnosti trenutno nima dovoljenja za nameščanje neznanih aplikacij iz tega vira. To lahko spremenite v nastavitvah."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Neznane aplikacije lahko resno ogrozijo varnost telefona in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v telefonu, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Neznane aplikacije lahko resno ogrozijo varnost tabličnega računalnika in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v tabličnem računalniku, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Neznane aplikacije lahko resno ogrozijo varnost televizorja in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v televizorju, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index e5b8c01..f7dca91 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instaluesi i paketës"</string>
<string name="install" msgid="711829760615509273">"Instalo"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Përditëso"</string>
<string name="done" msgid="6632441120016885253">"U krye"</string>
<string name="cancel" msgid="1018267193425558088">"Anulo"</string>
<string name="installing" msgid="4921993079741206516">"Po instalohet…"</string>
<string name="installing_app" msgid="1165095864863849422">"Po instalohet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Dëshiron ta instalosh këtë aplikacion?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Dëshiron ta përditësosh këtë aplikacion?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string>
@@ -70,12 +67,12 @@
<string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> u çinstalua"</string>
<string name="uninstall_failed" msgid="1847750968168364332">"Çinstalimi nuk pati sukses."</string>
<string name="uninstall_failed_app" msgid="5506028705017601412">"Çinstalimi i <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nuk u krye me sukses."</string>
- <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Nuk mund të çinstalohet aplikacioni aktiv i administratorit të pajisjes"</string>
- <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Nuk mund të çinstalohet aplikacioni aktiv i administratorit të pajisjes për <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Nuk mund të çinstalohet aplikacioni aktiv i administrimit të pajisjes"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Nuk mund të çinstalohet aplikacioni aktiv i administrimit të pajisjes për <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
<string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"Ky aplikacion kërkohet për disa përdorues ose profile dhe është çinstaluar për të tjerët"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"Ky aplikacion nevojitet për profilin tënd dhe nuk mund të çinstalohet."</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"Ky aplikacion kërkohet nga administratori i pajisjes dhe nuk mund të çinstalohet."</string>
- <string name="manage_device_administrators" msgid="3092696419363842816">"Menaxho aplikacionet e administratorit të pajisjes"</string>
+ <string name="manage_device_administrators" msgid="3092696419363842816">"Menaxho aplikacionet e administrimit të pajisjes"</string>
<string name="manage_users" msgid="1243995386982560813">"Menaxho përdoruesit"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mund të çinstalohej."</string>
<string name="Parse_error_dlg_text" msgid="1661404001063076789">"Kishte një problem me analizimin e paketës."</string>
@@ -83,15 +80,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instalo/çinstalo veprimet që nuk mbështeten në Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Po vihet në përdorim aplikacioni..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"I panjohur"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoni dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj telefonit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
- <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableti dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj tabletit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
- <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizori dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj televizorit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Për sigurinë tënde, tableti yt nuk lejohet aktualisht të instalojë aplikacione të panjohura nga ky burim. Këtë mund ta ndryshosh te \"Cilësimet\"."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Për sigurinë tënde, televizori yt nuk lejohet aktualisht të instalojë aplikacione të panjohura nga ky burim. Këtë mund ta ndryshosh te \"Cilësimet\"."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Për sigurinë tënde, telefoni yt nuk lejohet aktualisht të instalojë aplikacione të panjohura nga ky burim. Këtë mund ta ndryshosh te \"Cilësimet\"."</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoni dhe të dhënat e tua personale janë më të cenueshme nga sulmet nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj telefonit tënd ose çdo humbje të të dhënave që mund të rezultojë nga përdorimi i tij."</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableti dhe të dhënat e tua personale janë më të cenueshme nga sulmet nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj tabletit tënd ose çdo humbje të të dhënave që mund të rezultojë nga përdorimi i tij."</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizori dhe të dhënat e tua personale janë më të cenueshme nga sulmet nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj televizorit tënd ose çdo humbje të të dhënave që mund të rezultojë nga përdorimi i tij."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"Vazhdo"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Cilësimet"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalimi/çinstalimi i aplikacioneve të Wear"</string>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 14ca7a4..c6d5279 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Програм за инстал. пакета"</string>
<string name="install" msgid="711829760615509273">"Инсталирај"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Ажурирај"</string>
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Откажи"</string>
<string name="installing" msgid="4921993079741206516">"Инсталира се..."</string>
<string name="installing_app" msgid="1165095864863849422">"Инсталира се <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Желите да инсталирате ову апликацију?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Желите да ажурирате ову апликацију?"</string>
<string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Радње Инсталирај/Деинсталирај нису подржане у Wear-у."</string>
<string name="message_staging" msgid="8032722385658438567">"Апликација се припрема…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Непознато"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Из безбедносних разлога таблету тренутно није дозвољено да инсталира непознате апликације из овог извора. То можете да промените у подешавањима."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Из безбедносних разлога телевизору тренутно није дозвољено да инсталира непознате апликације из овог извора. То можете да промените у подешавањима."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Из безбедносних разлога телефону тренутно није дозвољено да инсталира непознате апликације из овог извора. То можете да промените у подешавањима."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефон и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења телефона или губитак података до којих може да дође због њеног коришћења."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таблет и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења таблета или губитак података до којих може да дође због њеног коришћења."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ТВ и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења ТВ-а или губитак података до којих може да дође због њеног коришћења."</string>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index 7252651..c64c02f 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketinstallationsprogram"</string>
<string name="install" msgid="711829760615509273">"Installera"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Uppdatera"</string>
<string name="done" msgid="6632441120016885253">"Klar"</string>
<string name="cancel" msgid="1018267193425558088">"Avbryt"</string>
<string name="installing" msgid="4921993079741206516">"Installerar …"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeras …"</string>
<string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vill du installera den här appen?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vill du uppdatera den här appen?"</string>
<string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Åtgärder för att installera/avinstallera stöds inte på Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Provkör appen …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Okänd"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Av säkerhetsskäl får okända appar från den här källan inte installeras på surfplattan. Du kan ändra det här i inställningarna."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Av säkerhetsskäl får okända appar från den här källan inte installeras på tv:n. Du kan ändra det här i inställningarna."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Av säkerhetsskäl får okända appar från den här källan inte installeras på telefonen. Du kan ändra det här i inställningarna."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Din mobil och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på mobilen och för dataförlust som kan uppstå vid användning av denna app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Din surfplatta och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på surfplattan och för dataförlust som kan uppstå vid användning av denna app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Din tv och personliga data är mer sårbar för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på tv:n och för dataförlust som kan uppstå vid användning av denna app."</string>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index dd301b0..5c2ec6e 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Kisakinishaji cha kifurushi"</string>
<string name="install" msgid="711829760615509273">"Sakinisha"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Sasisha"</string>
<string name="done" msgid="6632441120016885253">"Nimemaliza"</string>
<string name="cancel" msgid="1018267193425558088">"Ghairi"</string>
<string name="installing" msgid="4921993079741206516">"Inasakinisha…"</string>
<string name="installing_app" msgid="1165095864863849422">"Inasakinisha <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Ungependa kusakinisha programu hii?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Ungependa kusasisha programu hii?"</string>
<string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Huduma ya Android Wear haiwezi kutekeleza vitendo vya Kusakinisha au Kuondoa vipengee."</string>
<string name="message_staging" msgid="8032722385658438567">"Inatayarisha programu…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Haijulikani"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Kwa sababu ya usalama wako, kompyuta yako kibao kwa sasa hairuhusiwi kusakinisha programu zisizojulikana kutoka chanzo hiki. Unaweza kubadilisha hili katika Mipangilio."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Kwa sababu ya usalama wako, TV yako kwa sasa hairuhusiwi kusakinisha programu zisizojulikana kutoka chanzo hiki. Unaweza kubadilisha hili katika Mipangilio."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Kwa sababu ya usalama wako, simu yako kwa sasa hairuhusiwi kusakinisha programu zisizojulikana kutoka chanzo hiki. Unaweza kubadilisha hili katika Mipangilio."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Data yako ya binafsi na ya simu yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye simu yako au kupotea kwa data kutokana na matumizi yake."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Data yako ya binafsi na ya kompyuta yako kibao inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye kompyuta yako kibao au kupotea kwa data kutokana na matumizi yake."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Data yako ya binafsi na ya televisheni yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye televisheni yako au kupotea kwa data kutokana na matumizi yake."</string>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index f070b45..4493a41 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"தொகுப்பு நிறுவி"</string>
<string name="install" msgid="711829760615509273">"நிறுவு"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"புதுப்பி"</string>
<string name="done" msgid="6632441120016885253">"முடிந்தது"</string>
<string name="cancel" msgid="1018267193425558088">"ரத்துசெய்"</string>
<string name="installing" msgid="4921993079741206516">"நிறுவுகிறது…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ஐ நிறுவுகிறது…"</string>
<string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"இந்த ஆப்ஸை நிறுவ வேண்டுமா?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?"</string>
<string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearரில் நிறுவல்கள்/நிறுவல் நீக்கங்கள் செய்ய இயலாது"</string>
<string name="message_staging" msgid="8032722385658438567">"ஆப்ஸ் தயாராகிறது…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"அறியப்படாதது"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"உங்கள் பாதுகாப்புக்காக, இந்த மூலத்திலிருந்து அறியப்படாத ஆப்ஸை டேப்லெட்டில் நிறுவ தற்போது அனுமதியில்லை. இதை அமைப்புகளில் மாற்றலாம்."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"உங்கள் பாதுகாப்புக்காக, இந்த மூலத்திலிருந்து அறியப்படாத ஆப்ஸை டிவியில் நிறுவ தற்போது அனுமதியில்லை. இதை அமைப்புகளில் மாற்றலாம்."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"உங்கள் பாதுகாப்புக்காக, இந்த மூலத்திலிருந்து அறியப்படாத ஆப்ஸை மொபைலில் நிறுவ தற்போது அனுமதியில்லை. இதை அமைப்புகளில் மாற்றலாம்."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"அறியப்படாத ஆப்ஸால் உங்கள் மொபைலும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது மொபைலில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"அறியப்படாத ஆப்ஸால் உங்கள் டேப்லெட்டும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டேப்லெட்டில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"அறியப்படாத ஆப்ஸால் உங்கள் டிவியும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டிவியில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index c4b0fc2..8951e0d 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ప్యాకేజీ ఇన్స్టాలర్"</string>
<string name="install" msgid="711829760615509273">"ఇన్స్టాల్ చేయి"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"అప్డేట్ చేయి"</string>
<string name="done" msgid="6632441120016885253">"పూర్తయింది"</string>
<string name="cancel" msgid="1018267193425558088">"రద్దు చేయి"</string>
<string name="installing" msgid="4921993079741206516">"ఇన్స్టాల్ చేస్తోంది…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ని ఇన్స్టాల్ చేస్తోంది…"</string>
<string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"మీరు ఈ యాప్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"మీరు ఈ యాప్ను అప్డేట్ చేయాలనుకుంటున్నారా?"</string>
<string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string>
@@ -83,13 +80,10 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearలో ఇన్స్టాల్/అన్ఇన్స్టాల్ చర్యలకు మద్దతు లేదు."</string>
<string name="message_staging" msgid="8032722385658438567">"యాప్ను సిద్ధం చేస్తుంది…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"తెలియదు"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"మీ ఫోన్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ ఫోన్కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టాబ్లెట్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టీవీ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ ఫోన్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"తెలియని యాప్లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"కొనసాగించు"</string>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index 1a8e3a9..5b15f0b 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"โปรแกรมติดตั้งแพ็กเกจ"</string>
<string name="install" msgid="711829760615509273">"ติดตั้ง"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"อัปเดต"</string>
<string name="done" msgid="6632441120016885253">"เสร็จ"</string>
<string name="cancel" msgid="1018267193425558088">"ยกเลิก"</string>
<string name="installing" msgid="4921993079741206516">"กำลังติดตั้ง…"</string>
<string name="installing_app" msgid="1165095864863849422">"กำลังติดตั้ง <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"คุณต้องการติดตั้งแอปนี้ไหม"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"คุณต้องการอัปเดตแอปนี้ไหม"</string>
<string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ติดตั้ง/ถอนการติดตั้งใน Wear ไม่ได้"</string>
<string name="message_staging" msgid="8032722385658438567">"กำลังปรับสภาพแวดล้อมของแอป…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ไม่ทราบ"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"เพื่อความปลอดภัย ปัจจุบันไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในแท็บเล็ต คุณเปลี่ยนแปลงได้ในการตั้งค่า"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"เพื่อความปลอดภัย ปัจจุบันไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในทีวี คุณเปลี่ยนแปลงได้ในการตั้งค่า"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"เพื่อความปลอดภัย ปัจจุบันไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในโทรศัพท์ คุณเปลี่ยนแปลงได้ในการตั้งค่า"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"โทรศัพท์และข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับโทรศัพท์หรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"แท็บเล็ตและข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับแท็บเล็ตหรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ทีวีและข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับทีวีหรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index 22a565e..6b992f6 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Installer ng package"</string>
<string name="install" msgid="711829760615509273">"I-install"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"I-update"</string>
<string name="done" msgid="6632441120016885253">"Tapos na"</string>
<string name="cancel" msgid="1018267193425558088">"Kanselahin"</string>
<string name="installing" msgid="4921993079741206516">"Nag-i-install…"</string>
<string name="installing_app" msgid="1165095864863849422">"Ini-install ang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Gusto mo bang i-install ang app na ito?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Gusto mo bang i-update ang app na ito?"</string>
<string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ang mga pagkilos na I-install/I-uninstall ay hindi sinusuportahan sa Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Inihahanda ang app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Hindi Kilala"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Para sa iyong seguridad, kasalukuyang hindi pinapayagan ang tablet mo na mag-install ng mga hindi kilalang app mula sa source na ito. Mababago mo ito sa Mga Setting."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Para sa iyong seguridad, kasalukuyang hindi pinapayagan ang TV mo na mag-install ng mga hindi kilalang app mula sa source na ito. Mababago mo ito sa Mga Setting."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Para sa iyong seguridad, kasalukuyang hindi pinapayagan ang telepono mo na mag-install ng mga hindi kilalang app mula sa source na ito. Mababago mo ito sa Mga Setting."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Mas nanganganib ang iyong telepono at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong telepono o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Mas nanganganib ang iyong tablet at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong tablet o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Mas nanganganib ang iyong TV at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong TV o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index 13fbf0f..44a496d 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Програма встановлення пакета"</string>
<string name="install" msgid="711829760615509273">"Установити"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Оновити"</string>
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Скасув."</string>
<string name="installing" msgid="4921993079741206516">"Встановлення…"</string>
<string name="installing_app" msgid="1165095864863849422">"Установлюється <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Установити цей додаток?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Оновити цей додаток?"</string>
<string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Встановлення й видалення не підтримуються на пристроях Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Підготовка додатка…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Невідомо"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"З міркувань безпеки на вашому планшеті зараз заборонено встановлювати невідомі додатки з цього джерела. Ви можете змінити це в налаштуваннях."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"З міркувань безпеки на вашому телевізорі зараз заборонено встановлювати невідомі додатки з цього джерела. Ви можете змінити це в налаштуваннях."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"З міркувань безпеки на вашому телефоні зараз заборонено встановлювати невідомі додатки з цього джерела. Ви можете змінити це в налаштуваннях."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваш телефон і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження телефона чи втрату даних унаслідок використання додатка."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваш планшет і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження планшета чи втрату даних унаслідок використання додатка."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваш телевізор і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження телевізора чи втрату даних унаслідок використання додатка."</string>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
index e122f3e..afe46997 100644
--- a/packages/PackageInstaller/res/values-ur/strings.xml
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"پیکیج انسٹالر"</string>
<string name="install" msgid="711829760615509273">"انسٹال کریں"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"اپ ڈیٹ کریں"</string>
<string name="done" msgid="6632441120016885253">"ہو گیا"</string>
<string name="cancel" msgid="1018267193425558088">"منسوخ کریں"</string>
<string name="installing" msgid="4921993079741206516">"انسٹال ہو رہی ہے…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کو انسٹال کیا جا رہا ہے…"</string>
<string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"کیا آپ یہ ایپ انسٹال کرنا چاہتے ہیں؟"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"کیا آپ یہ ایپ اپ ڈیٹ کرنا چاہتے ہیں؟"</string>
<string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"\'انسٹال/اَن انسٹال کی کارروائیاں\' Wear پر تعاون یافتہ نہیں ہیں۔"</string>
<string name="message_staging" msgid="8032722385658438567">"ایپ کی ٹیسٹنگ ہو رہی ہے…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"نامعلوم"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"آپ کی سیکیورٹی کی خاطر فی الحال آپ کے ٹیبلیٹ کو اس ماخذ سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔ آپ ترتیبات میں اسے تبدیل کر سکتے ہیں۔"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"آپ کی سیکیورٹی کی خاطر فی الحال آپ کے TV کو اس ماخذ سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔ آپ ترتیبات میں اسے تبدیل کر سکتے ہیں۔"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"آپ کی سیکیورٹی کی خاطر فی الحال آپ کے فون کو اس ماخذ سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔ آپ ترتیبات میں اسے تبدیل کر سکتے ہیں۔"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"آپ کے فون اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے فون کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"آپ کے ٹیبلیٹ اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے ٹیبلیٹ کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"آپ کے TV اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے TV کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index e862e7d..fc1b916 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paket o‘rnatish vositasi"</string>
<string name="install" msgid="711829760615509273">"O‘rnatish"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Yangilash"</string>
<string name="done" msgid="6632441120016885253">"OK"</string>
<string name="cancel" msgid="1018267193425558088">"Bekor qilish"</string>
<string name="installing" msgid="4921993079741206516">"O‘rnatilmoqda…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> o‘rnatilmoqda…"</string>
<string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Bu ilovani oʻrnatmoqchimisiz?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu ilova yangilansinmi?"</string>
<string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear qurilmasi o‘rnatish/o‘chirish amallarini qo‘llab-quvvatlamaydi."</string>
<string name="message_staging" msgid="8032722385658438567">"Kutib turing…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Noaniq"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Xavfsizlik yuzasidan, planshetingizga hozirda bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan. Buni sozlamalardan oʻzgartirish mumkin."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Xavfsizlik yuzasidan, televizoringizga hozirda bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan. Buni sozlamalardan oʻzgartirish mumkin."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Xavfsizlik yuzasidan, telefoningizga hozirda bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan. Buni sozlamalardan oʻzgartirish mumkin."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoningiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan telefoningizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planshetingiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan planshetingizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan televizoringizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index 13ddac5..03b381b 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Trình cài đặt gói"</string>
<string name="install" msgid="711829760615509273">"Cài đặt"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Cập nhật"</string>
<string name="done" msgid="6632441120016885253">"Xong"</string>
<string name="cancel" msgid="1018267193425558088">"Hủy"</string>
<string name="installing" msgid="4921993079741206516">"Đang cài đặt…"</string>
<string name="installing_app" msgid="1165095864863849422">"Đang cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Bạn có muốn cài đặt ứng dụng này không?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Bạn có muốn cập nhật ứng dụng này không?"</string>
<string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Không hỗ trợ thao tác Cài đặt/Gỡ cài đặt trên ứng dụng Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Đang thử nghiệm ứng dụng…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Không xác định"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Để bảo mật, máy tính bảng của bạn hiện không được phép cài đặt các ứng dụng không xác định từ nguồn này. Bạn có thể thay đổi chế độ này trong phần Cài đặt."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Để bảo mật, TV của bạn hiện không được phép cài đặt các ứng dụng không xác định từ nguồn này. Bạn có thể thay đổi chế độ này trong phần Cài đặt."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Để bảo mật, điện thoại của bạn hiện không được phép cài đặt các ứng dụng không xác định từ nguồn này. Bạn có thể thay đổi chế độ này trong phần Cài đặt."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Điện thoại và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với điện thoại của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Máy tính bảng và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với máy tính bảng của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với TV của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index 49e0b86..e53dd46 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"软件包安装程序"</string>
<string name="install" msgid="711829760615509273">"安装"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"更新"</string>
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"正在安装…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安装<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"已安装应用。"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"要安装此应用吗?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此应用吗?"</string>
<string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支持安装/卸载操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在准备安装应用…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"未知"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"出于安全考虑,目前已禁止您的平板电脑安装来自此来源的未知应用。您可以在“设置”中对此进行更改。"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"出于安全考虑,目前已禁止您的电视安装来自此来源的未知应用。您可以在“设置”中对此进行更改。"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"出于安全考虑,目前已禁止您的手机安装来自此来源的未知应用。您可以在“设置”中对此进行更改。"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"来历不明的应用很可能会损害您的手机和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何手机损坏或数据丢失情况,您负有全部责任。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"来历不明的应用很可能会损害您的平板电脑和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何平板电脑损坏或数据丢失情况,您负有全部责任。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"来历不明的应用很可能会损害您的电视和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何电视损坏或数据丢失情况,您负有全部责任。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index 7c1cc52..1d00963 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string>
<string name="install" msgid="711829760615509273">"安裝"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"更新"</string>
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"正在安裝…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string>
<string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"要安裝此應用程式嗎?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此應用程式嗎?"</string>
<string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝/解除安裝操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在準備安裝應用程式…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"為安全起見,您的平板電腦目前不得安裝此來源的不明應用程式。您可以在「設定」中變更這項設定。"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"為安全起見,您的電視目前不得安裝此來源的不明應用程式。您可以在「設定」中變更這項設定。"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"為安全起見,您的手機目前不得安裝此來源的不明應用程式。您可以在「設定」中變更這項設定。"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"來源不明的應用程式可能會侵害您的手機和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致手機損壞或資料遺失的責任。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"來源不明的應用程式可能會侵害您的平板電腦和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致平板電腦損壞或資料遺失的責任。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"來源不明的應用程式可能會侵害您的電視和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致電視損壞或資料遺失的責任。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 9c089dd..e54e351 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string>
<string name="install" msgid="711829760615509273">"安裝"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"更新"</string>
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"安裝中…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string>
<string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"要安裝這個應用程式嗎?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新這個應用程式嗎?"</string>
<string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝及解除安裝操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在準備應用程式安裝程序…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"為了安全起見,你的平板電腦目前禁止安裝這個來源提供的不明應用程式。如要進行變更,請前往「設定」。"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"為了安全起見,你的電視目前禁止安裝這個來源提供的不明應用程式。如要進行變更,請前往「設定」。"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"為了安全起見,你的手機目前禁止安裝這個來源提供的不明應用程式。如要進行變更,請前往「設定」。"</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"來歷不明的應用程式可能會損害你的手機和個人資料。如因安裝及使用這個應用程式,導致你的手機受損或資料遺失,請自行負責。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"來歷不明的應用程式可能會損害你的平板電腦和個人資料。如因安裝及使用這個應用程式,導致你的平板電腦受損或資料遺失,請自行負責。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"來歷不明的應用程式可能會損害你的電視和個人資料。如因安裝及使用這個應用程式,導致你的電視受損或資料遺失,請自行負責。"</string>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index 6f911bf..c61b980 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -18,17 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Isifaki sephakheji"</string>
<string name="install" msgid="711829760615509273">"Faka"</string>
- <!-- no translation found for update (3932142540719227615) -->
- <skip />
+ <string name="update" msgid="3932142540719227615">"Vuselela"</string>
<string name="done" msgid="6632441120016885253">"Kwenziwe"</string>
<string name="cancel" msgid="1018267193425558088">"Khansela"</string>
<string name="installing" msgid="4921993079741206516">"Iyafaka..."</string>
<string name="installing_app" msgid="1165095864863849422">"Ifaka i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string>
- <!-- no translation found for install_confirm_question (7663733664476363311) -->
- <skip />
- <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
- <skip />
+ <string name="install_confirm_question" msgid="7663733664476363311">"Ingabe ufuna ukufaka le app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingabe ufuna ukubuyekeza le app?"</string>
<string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string>
@@ -83,12 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Izenzo zokufaka/ukukhipha azisekelwe ku-Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Ifaka kusiteji uhlelo lokusebenza…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Akwaziwa"</string>
- <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
- <skip />
- <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
- <skip />
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Mayelana nokuphepha kwakho, ithebulethi yakho okwamanje ayivumelekanga ukufaka ama-app angaziwa avela kulo mthombo. Ungashintsha lokhu kumaSethingi."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Mayelana nokuphepha kwakho, i-TV yakho okwamanje ayivumelekanga ukufaka ama-app angaziwa avela kulo mthombo. Ungashintsha lokhu kumaSethingi."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Mayelana nokuvikeleka kwakho, ifoni yakho okwamanje ayivunyelwe ukufaka ama-app angaziwa avela kulo mthombo. Ungashintsha lokhu kumaSethingi."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Idatha yakho yefoni neyohlelo lwakho lokusebenza isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kufoni yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ithebulethi yakho nedatha yomuntu siqu zisengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kuthebulethi yakho noma ukulahleka kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Idatha yakho ye-TV neyomuntu siqu isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala ku-TV yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
diff --git a/packages/SettingsLib/ActionBarShadow/lint-baseline.xml b/packages/SettingsLib/ActionBarShadow/lint-baseline.xml
new file mode 100644
index 0000000..4d5de5f
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/lint-baseline.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.view.View#setOnScrollChangeListener`"
+ errorLine1=" mScrollView.setOnScrollChangeListener(mScrollChangeWatcher);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java"
+ line="81"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.view.View#setOnScrollChangeListener`"
+ errorLine1=" mScrollView.setOnScrollChangeListener(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java"
+ line="88"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 23 (current min is 21): `android.view.View.OnScrollChangeListener`"
+ errorLine1=" final class ScrollChangeWatcher implements View.OnScrollChangeListener {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java"
+ line="95"
+ column="48"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/ActionButtonsPreference/lint-baseline.xml b/packages/SettingsLib/ActionButtonsPreference/lint-baseline.xml
new file mode 100644
index 0000000..a19f7af
--- /dev/null
+++ b/packages/SettingsLib/ActionButtonsPreference/lint-baseline.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="`android:Widget.DeviceDefault.Button.Borderless.Colored` requires API level 28 (current min is 21)"
+ errorLine1=" <style name="SettingsActionButton" parent="android:Widget.DeviceDefault.Button.Borderless.Colored">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/values/styles.xml"
+ line="19"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`android:drawableTint` requires API level 23 (current min is 21)"
+ errorLine1=" <item name="android:drawableTint">@*android:color/btn_colored_borderless_text_material</item>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/values/styles.xml"
+ line="21"
+ column="15"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/AdaptiveIcon/lint-baseline.xml b/packages/SettingsLib/AdaptiveIcon/lint-baseline.xml
new file mode 100644
index 0000000..7f16517
--- /dev/null
+++ b/packages/SettingsLib/AdaptiveIcon/lint-baseline.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.res.Resources#getColor`"
+ errorLine1=" .getColor(colorRes, null /* theme */);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveIcon.java"
+ line="78"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getColor`"
+ errorLine1=" setBackgroundColor(context.getColor(R.color.homepage_generic_icon_background));"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveIcon.java"
+ line="90"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 23 (current min is 21): `android.graphics.drawable.DrawableWrapper`"
+ errorLine1="public class AdaptiveOutlineDrawable extends DrawableWrapper {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java"
+ line="43"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `new android.graphics.drawable.DrawableWrapper`"
+ errorLine1=" super(new AdaptiveIconShapeDrawable(resources));"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java"
+ line="65"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `new android.graphics.drawable.DrawableWrapper`"
+ errorLine1=" super(new AdaptiveIconShapeDrawable(resources));"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java"
+ line="72"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.graphics.drawable.DrawableWrapper#getDrawable`"
+ errorLine1=" getDrawable().setTint(Color.WHITE);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java"
+ line="80"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.res.Resources#getColor`"
+ errorLine1=" return resources.getColor(resId, /* theme */ null);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java"
+ line="105"
+ column="26"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/BannerMessagePreference/lint-baseline.xml b/packages/SettingsLib/BannerMessagePreference/lint-baseline.xml
new file mode 100644
index 0000000..ba02a1f
--- /dev/null
+++ b/packages/SettingsLib/BannerMessagePreference/lint-baseline.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="`@android:style/Widget.DeviceDefault.Button.Borderless.Colored` requires API level 28 (current min is 21)"
+ errorLine1=" style="@android:style/Widget.DeviceDefault.Button.Borderless.Colored"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/BannerMessagePreference/res/layout/banner_message.xml"
+ line="65"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`@android:style/Widget.DeviceDefault.Button.Borderless.Colored` requires API level 28 (current min is 21)"
+ errorLine1=" style="@android:style/Widget.DeviceDefault.Button.Borderless.Colored"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/BannerMessagePreference/res/layout/banner_message.xml"
+ line="71"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/colorError` requires API level 26 (current min is 21)"
+ errorLine1=" android:fillColor="?android:attr/colorError""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/BannerMessagePreference/res/drawable/ic_warning.xml"
+ line="24"
+ column="9"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/BarChartPreference/lint-baseline.xml b/packages/SettingsLib/BarChartPreference/lint-baseline.xml
new file mode 100644
index 0000000..f1043bb
--- /dev/null
+++ b/packages/SettingsLib/BarChartPreference/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="`@android:style/Widget.DeviceDefault.Button.Borderless.Colored` requires API level 28 (current min is 21)"
+ errorLine1=" parent="@android:style/Widget.DeviceDefault.Button.Borderless.Colored">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/BarChartPreference/res/values/styles.xml"
+ line="35"
+ column="12"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/EmergencyNumber/lint-baseline.xml b/packages/SettingsLib/EmergencyNumber/lint-baseline.xml
new file mode 100644
index 0000000..e9c687f
--- /dev/null
+++ b/packages/SettingsLib/EmergencyNumber/lint-baseline.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getSystemService`"
+ errorLine1=" mTelephonyManager = context.getSystemService(TelephonyManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="77"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getSystemService`"
+ errorLine1=" mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="78"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 23 (current min is 21): `android.telephony.CarrierConfigManager`"
+ errorLine1=" mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="78"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.telephony.TelephonyManager#getEmergencyNumberList`"
+ errorLine1=" Map<Integer, List<EmergencyNumber>> allLists = mTelephonyManager.getEmergencyNumberList("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="173"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.telephony.emergency.EmergencyNumber#getEmergencyNumberSources`"
+ errorLine1=" emergencyNumber.getEmergencyNumberSources().contains("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="196"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 24 (current min is 21): `android.telephony.SubscriptionManager#getDefaultSubscriptionId`"
+ errorLine1=" return promotedEmergencyNumberLists.get(SubscriptionManager.getDefaultSubscriptionId());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="219"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.telephony.emergency.EmergencyNumber#getNumber`"
+ errorLine1=" String number = emergencyNumber.getNumber();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="234"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.telephony.CarrierConfigManager#getConfigForSubId`"
+ errorLine1=" PersistableBundle b = carrierConfigManager.getConfigForSubId(subId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java"
+ line="251"
+ column="52"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/HelpUtils/lint-baseline.xml b/packages/SettingsLib/HelpUtils/lint-baseline.xml
new file mode 100644
index 0000000..940f027
--- /dev/null
+++ b/packages/SettingsLib/HelpUtils/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 21): `android.content.pm.PackageInfo#getLongVersionCode`"
+ errorLine1=" sCachedVersionCode = Long.toString(info.getLongVersionCode());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/HelpUtils/src/com/android/settingslib/HelpUtils.java"
+ line="239"
+ column="57"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/MainSwitchPreference/lint-baseline.xml b/packages/SettingsLib/MainSwitchPreference/lint-baseline.xml
new file mode 100644
index 0000000..0ecf979
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/lint-baseline.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="`@android:id/switch_widget` requires API level 24 (current min is 21)"
+ errorLine1=" android:id="@android:id/switch_widget""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/MainSwitchPreference/res/layout/main_switch_bar.xml"
+ line="49"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`@android:style/Widget.Material.CompoundButton.Switch` requires API level 24 (current min is 21)"
+ errorLine1=" <style name="Settings.MainSwitch" parent="@android:style/Widget.Material.CompoundButton.Switch">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml"
+ line="24"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`@android:style/Widget.Material.CompoundButton.Switch` requires API level 24 (current min is 21)"
+ errorLine1=" <style name="Widget.SwitchBar.Switch" parent="@android:style/Widget.Material.CompoundButton.Switch">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml"
+ line="28"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="`android:trackTint` requires API level 23 (current min is 21)"
+ errorLine1=" <item name="android:trackTint">@color/switchbar_switch_track_tint</item>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml"
+ line="29"
+ column="15"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/main_switch_bar.xml
new file mode 100644
index 0000000..3ce9421
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/main_switch_bar.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:background="?android:attr/colorBackground"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/frame"
+ android:minHeight="@dimen/min_switch_bar_height"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingLeft="@dimen/switchbar_margin_start"
+ android:paddingRight="@dimen/switchbar_margin_end">
+
+ <TextView
+ android:id="@+id/switch_text"
+ android:layout_height="wrap_content"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_marginRight="16dp"
+ android:layout_gravity="center_vertical"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:textAppearance="?android:attr/textAppearanceListItem"
+ android:textAlignment="viewStart"
+ style="@style/MainSwitchText" />
+
+ <ImageView
+ android:id="@+id/restricted_icon"
+ android:layout_width="@dimen/restricted_icon_size"
+ android:layout_height="@dimen/restricted_icon_size"
+ android:tint="?android:attr/colorAccent"
+ android:theme="@android:style/Theme.Material"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="@dimen/restricted_icon_margin_end"
+ android:src="@*android:drawable/ic_info"
+ android:visibility="gone" />
+
+ <Switch
+ android:id="@android:id/switch_widget"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:track="@drawable/track_selector"
+ android:thumb="@drawable/thumb_selector"
+ android:theme="@style/Settings.MainSwitch"/>
+ </LinearLayout>
+
+ <View
+ android:id="@+id/below_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?android:attr/listDivider" />
+</LinearLayout>
+
+
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/main_switch_bar.xml
index 85c01c5..5dc3209 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout/main_switch_bar.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout/main_switch_bar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2020 The Android Open Source Project
+ Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -18,58 +18,40 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:background="?android:attr/colorBackground"
- android:orientation="vertical">
+ android:layout_width="match_parent">
- <LinearLayout
- android:id="@+id/frame"
- android:minHeight="@dimen/min_switch_bar_height"
+ <TextView
+ android:id="@+id/switch_text"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:background="?android:attr/selectableItemBackground"
- android:paddingLeft="@dimen/switchbar_margin_start"
- android:paddingRight="@dimen/switchbar_margin_end">
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_gravity="center_vertical"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
+ android:textSize="16sp"
+ android:textColor="?android:attr/textColorPrimaryInverse"
+ android:layout_marginStart="@dimen/switchbar_subsettings_margin_start"
+ android:textAlignment="viewStart"/>
- <TextView
- android:id="@+id/switch_text"
- android:layout_height="wrap_content"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_marginRight="16dp"
- android:layout_gravity="center_vertical"
- android:maxLines="2"
- android:ellipsize="end"
- android:textAppearance="?android:attr/textAppearanceListItem"
- android:textAlignment="viewStart"
- style="@style/MainSwitchText" />
+ <ImageView
+ android:id="@+id/restricted_icon"
+ android:layout_width="@dimen/restricted_icon_size"
+ android:layout_height="@dimen/restricted_icon_size"
+ android:tint="?android:attr/colorAccent"
+ android:theme="@android:style/Theme.Material"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="@dimen/restricted_icon_margin_end"
+ android:src="@*android:drawable/ic_info"
+ android:visibility="gone"/>
- <ImageView
- android:id="@+id/restricted_icon"
- android:layout_width="@dimen/restricted_icon_size"
- android:layout_height="@dimen/restricted_icon_size"
- android:tint="?android:attr/colorAccent"
- android:theme="@android:style/Theme.Material"
- android:layout_gravity="center_vertical"
- android:layout_marginEnd="@dimen/restricted_icon_margin_end"
- android:src="@*android:drawable/ic_info"
- android:visibility="gone" />
-
- <Switch
- android:id="@android:id/switch_widget"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:track="@drawable/track_selector"
- android:thumb="@drawable/thumb_selector"
- android:theme="@style/Settings.MainSwitch"/>
- </LinearLayout>
-
- <View
- android:id="@+id/below_divider"
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="?android:attr/listDivider" />
+ <Switch
+ android:id="@android:id/switch_widget"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="@dimen/switchbar_subsettings_margin_end"
+ android:theme="@style/Widget.SwitchBar.Switch"/>
</LinearLayout>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml b/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml
index 147db77..e54569e 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml
@@ -20,4 +20,6 @@
<color name="thumb_off">#BFFFFFFF</color>
<color name="track_off">@*android:color/material_grey_600</color>
+ <color name="switchbar_switch_track_tint">#82000000</color>
+ <color name="switchbar_switch_thumb_tint">@android:color/black</color>
</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml
new file mode 100644
index 0000000..c6bb77d
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- SwitchBar sub settings margin start / end -->
+ <dimen name="switchbar_subsettings_margin_start">80dp</dimen>
+</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml
new file mode 100644
index 0000000..3e941c2
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- SwitchBar sub settings margin start / end -->
+ <dimen name="switchbar_subsettings_margin_start">128dp</dimen>
+ <dimen name="switchbar_subsettings_margin_end">128dp</dimen>
+</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml
new file mode 100644
index 0000000..2f040da
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- SwitchBar sub settings margin start / end -->
+ <dimen name="switchbar_subsettings_margin_start">80dp</dimen>
+ <dimen name="switchbar_subsettings_margin_end">80dp</dimen>
+</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml b/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml
index 147db77..b5a73b1 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml
@@ -20,4 +20,7 @@
<color name="thumb_off">#BFFFFFFF</color>
<color name="track_off">@*android:color/material_grey_600</color>
+ <color name="switchbar_background_color">@*android:color/material_grey_600</color>
+ <color name="switchbar_switch_track_tint">#BFFFFFFF</color>
+ <color name="switchbar_switch_thumb_tint">@android:color/white</color>
</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
index b145c9b..c471bcd 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
@@ -34,4 +34,8 @@
<!-- Restricted icon in switch bar -->
<dimen name="restricted_icon_margin_end">16dp</dimen>
+
+ <!-- SwitchBar sub settings margin start / end -->
+ <dimen name="switchbar_subsettings_margin_start">72dp</dimen>
+ <dimen name="switchbar_subsettings_margin_end">16dp</dimen>
</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml b/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml
index 59b5899..e058097 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values/styles.xml
@@ -25,4 +25,10 @@
<item name="android:switchMinWidth">@dimen/min_switch_width</item>
</style>
+ <style name="Widget.SwitchBar.Switch" parent="@android:style/Widget.Material.CompoundButton.Switch">
+ <item name="android:trackTint">@color/switchbar_switch_track_tint</item>
+ <item name="android:thumbTint">@color/switchbar_switch_thumb_tint</item>
+ <item name="android:minHeight">48dp</item>
+ <item name="android:minWidth">48dp</item>
+ </style>
</resources>
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
index ae9261c..2be3f0d 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
@@ -28,7 +28,8 @@
import android.widget.Switch;
import android.widget.TextView;
-import androidx.core.content.res.TypedArrayUtils;
+import androidx.annotation.ColorInt;
+import androidx.core.os.BuildCompat;
import java.util.ArrayList;
import java.util.List;
@@ -42,8 +43,11 @@
private final List<OnMainSwitchChangeListener> mSwitchChangeListeners = new ArrayList<>();
- private View mAboveDivider;
- private View mBelowDivider;
+ @ColorInt
+ private int mBackgroundColor;
+ @ColorInt
+ private int mBackgroundActivatedColor;
+
protected TextView mTextView;
protected Switch mSwitch;
@@ -66,6 +70,14 @@
LayoutInflater.from(context).inflate(resourceId(context, "layout", "main_switch_bar"),
this);
+ if (!BuildCompat.isAtLeastS()) {
+ final TypedArray a = context.obtainStyledAttributes(
+ new int[]{android.R.attr.colorAccent});
+ mBackgroundActivatedColor = a.getColor(0, 0);
+ mBackgroundColor = context.getColor(R.color.switchbar_background_color);
+ a.recycle();
+ }
+
setFocusable(true);
setClickable(true);
@@ -80,12 +92,13 @@
final TypedArray a = context.obtainStyledAttributes(attrs,
androidx.preference.R.styleable.Preference, 0 /*defStyleAttr*/,
0 /*defStyleRes*/);
- final CharSequence title = TypedArrayUtils.getText(a,
- androidx.preference.R.styleable.Preference_title,
+ final CharSequence title = a.getText(
androidx.preference.R.styleable.Preference_android_title);
setTitle(title);
a.recycle();
}
+
+ setBackground(true);
}
@Override
@@ -105,6 +118,7 @@
if (mSwitch != null) {
mSwitch.setChecked(checked);
}
+ setBackground(checked);
}
/**
@@ -189,6 +203,14 @@
}
}
+ private void setBackground(boolean checked) {
+ if (BuildCompat.isAtLeastS()) {
+ return;
+ }
+
+ setBackgroundColor(checked ? mBackgroundActivatedColor : mBackgroundColor);
+ }
+
static class SavedState extends BaseSavedState {
boolean mChecked;
boolean mVisible;
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
index ebeffcc..1f7f8d4 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
@@ -20,7 +20,6 @@
import android.content.res.TypedArray;
import android.util.AttributeSet;
-import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.PreferenceViewHolder;
import androidx.preference.TwoStatePreference;
@@ -79,8 +78,7 @@
final TypedArray a = context.obtainStyledAttributes(attrs,
androidx.preference.R.styleable.Preference, 0 /*defStyleAttr*/,
0 /*defStyleRes*/);
- final CharSequence title = TypedArrayUtils.getText(a,
- androidx.preference.R.styleable.Preference_title,
+ final CharSequence title = a.getText(
androidx.preference.R.styleable.Preference_android_title);
setTitle(title);
a.recycle();
diff --git a/packages/SettingsLib/ProgressBar/lint-baseline.xml b/packages/SettingsLib/ProgressBar/lint-baseline.xml
new file mode 100644
index 0000000..03d0f3f
--- /dev/null
+++ b/packages/SettingsLib/ProgressBar/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="`?android:attr/colorSecondary` requires API level 25 (current min is 21)"
+ errorLine1=" android:background="?android:attr/colorSecondary" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/ProgressBar/res/layout/progress_header.xml"
+ line="27"
+ column="9"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/RestrictedLockUtils/lint-baseline.xml b/packages/SettingsLib/RestrictedLockUtils/lint-baseline.xml
new file mode 100644
index 0000000..173c735
--- /dev/null
+++ b/packages/SettingsLib/RestrictedLockUtils/lint-baseline.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getSystemService`"
+ errorLine1=" ComponentName adminComponent = userContext.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java"
+ line="59"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getSystemService`"
+ errorLine1=" UserManager um = context.getSystemService(UserManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java"
+ line="101"
+ column="34"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/SettingsSpinner/lint-baseline.xml b/packages/SettingsLib/SettingsSpinner/lint-baseline.xml
new file mode 100644
index 0000000..ae1ed38e
--- /dev/null
+++ b/packages/SettingsLib/SettingsSpinner/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `new android.widget.Spinner`"
+ errorLine1=" super(context, attrs, defStyleAttr, defStyleRes, mode, null);"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinner.java"
+ line="122"
+ column="9"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
index 17b6805..d092666 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
@@ -19,7 +19,7 @@
<dimen name="preference_title_font_size">20sp</dimen>
<dimen name="icon_min_width">48dp</dimen>
<dimen name="preference_padding_start">24dp</dimen>
- <dimen name="preference_padding_end">24dp</dimen>
+ <dimen name="preference_padding_end">16dp</dimen>
<dimen name="app_preference_padding_start">20dp</dimen>
<dimen name="app_icon_min_width">52dp</dimen>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
index 17596ac2..dcbdc07 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
@@ -15,6 +15,7 @@
limitations under the License.
-->
<resources>
+ <!--DEPRECATED. It will remove after all of client team migrated to new style. -->
<style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay">
<item name="preferenceCategoryStyle">@style/SettingsCategoryPreference</item>
<item name="preferenceStyle">@style/SettingsPreference</item>
@@ -27,6 +28,18 @@
<item name="footerPreferenceStyle">@style/Preference.Material</item>
</style>
+ <style name="SettingsPreferenceTheme" parent="@style/PreferenceThemeOverlay">
+ <item name="preferenceCategoryStyle">@style/SettingsCategoryPreference</item>
+ <item name="preferenceStyle">@style/SettingsPreference</item>
+ <item name="checkBoxPreferenceStyle">@style/SettingsCheckBoxPreference</item>
+ <item name="dialogPreferenceStyle">@style/SettingsPreference</item>
+ <item name="editTextPreferenceStyle">@style/SettingsEditTextPreference</item>
+ <item name="dropdownPreferenceStyle">@style/SettingsDropdownPreference</item>
+ <item name="switchPreferenceStyle">@style/SettingsSwitchPreference</item>
+ <item name="seekBarPreferenceStyle">@style/SettingsSeekbarPreference</item>
+ <item name="footerPreferenceStyle">@style/Preference.Material</item>
+ </style>
+
<style name="SettingsCategoryPreference" parent="@style/Preference.Category.Material">
<item name="iconSpaceReserved">@bool/config_icon_space_reserved</item>
<item name="allowDividerAbove">@bool/config_allow_divider</item>
diff --git a/packages/SettingsLib/SettingsTheme/res/values/themes.xml b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
index 36ca684..13c7523 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
@@ -21,7 +21,7 @@
<item name="android:textAppearanceListItem">@style/TextAppearance.PreferenceTitle</item>
<item name="android:listPreferredItemPaddingStart">@dimen/preference_padding_start</item>
<item name="android:listPreferredItemPaddingEnd">@dimen/preference_padding_end</item>
- <item name="preferenceTheme">@style/PreferenceTheme</item>
+ <item name="preferenceTheme">@style/SettingsPreferenceTheme</item>
</style>
<!-- Using in SubSettings page including injected settings page -->
diff --git a/packages/SettingsLib/Tile/lint-baseline.xml b/packages/SettingsLib/Tile/lint-baseline.xml
new file mode 100644
index 0000000..4df6bd9
--- /dev/null
+++ b/packages/SettingsLib/Tile/lint-baseline.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 24 (current min is 21): `java.lang.Iterable#forEach`"
+ errorLine1=" controllers.forEach(controller -> {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/SwitchesProvider.java"
+ line="79"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.os.Parcel#readBoolean`"
+ errorLine1=" final boolean isProviderTile = in.readBoolean();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java"
+ line="83"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.os.Parcel#writeBoolean`"
+ errorLine1=" dest.writeBoolean(this instanceof ProviderTile);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java"
+ line="102"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.graphics.drawable.Icon#createWithResource`"
+ errorLine1=" final Icon icon = Icon.createWithResource(componentInfo.packageName, iconResId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java"
+ line="314"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.graphics.drawable.Icon#setTint`"
+ errorLine1=" icon.setTint(tintColor);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java"
+ line="320"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 21): `android.os.Parcel#readBoolean`"
+ errorLine1=" final boolean isProviderTile = source.readBoolean();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java"
+ line="364"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 21): `android.content.Context#getAttributionSource`"
+ errorLine1=" return provider.call(context.getAttributionSource(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/TileUtils.java"
+ line="558"
+ column="42"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/Utils/lint-baseline.xml b/packages/SettingsLib/Utils/lint-baseline.xml
new file mode 100644
index 0000000..172bde3
--- /dev/null
+++ b/packages/SettingsLib/Utils/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `android.content.Context#getSystemService`"
+ errorLine1=" return context.getSystemService(UserManager.class).isManagedProfile(userId)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java"
+ line="58"
+ column="24"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/lint-baseline.xml b/packages/SettingsLib/lint-baseline.xml
new file mode 100644
index 0000000..f6d6ca6
--- /dev/null
+++ b/packages/SettingsLib/lint-baseline.xml
@@ -0,0 +1,895 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.ims.ImsMmTelManager#getRegistrationState`"
+ errorLine1=" imsMmTelManager.getRegistrationState(executors, stateCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java"
+ line="116"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.hotspot2.PasspointConfiguration#getUniqueId`"
+ errorLine1=" mPasspointUniqueId = config.getUniqueId();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="379"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.hotspot2.PasspointConfiguration#getSubscriptionExpirationTimeMillis`"
+ errorLine1=" mSubscriptionExpirationTimeInMillis = config.getSubscriptionExpirationTimeMillis();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="382"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.hotspot2.PasspointConfiguration#isOsuProvisioned`"
+ errorLine1=" if (config.isOsuProvisioned()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="383"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiConfiguration#getKey`"
+ errorLine1=" mPasspointUniqueId = config.getKey();"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="400"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiManager#calculateSignalLevel`"
+ errorLine1=" int difference = wifiManager.calculateSignalLevel(other.mRssi)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="481"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiManager#calculateSignalLevel`"
+ errorLine1=" - wifiManager.calculateSignalLevel(mRssi);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="482"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiConfiguration#getKey`"
+ errorLine1=" return getKey(config.getKey());"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="707"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiConfiguration#getKey`"
+ errorLine1=" return (isPasspoint() && config.getKey().equals(mConfig.getKey()));"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="796"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiConfiguration#getKey`"
+ errorLine1=" return (isPasspoint() && config.getKey().equals(mConfig.getKey()));"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="796"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiManager#calculateSignalLevel`"
+ errorLine1=" return getWifiManager().calculateSignalLevel(mRssi);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="903"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.hotspot2.PasspointConfiguration#getUniqueId`"
+ errorLine1=" String uniqueId = passpointConfig.getUniqueId();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="1988"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiConfiguration#getKey`"
+ errorLine1=" if (TextUtils.equals(config.getKey(), uniqueId)) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java"
+ line="1992"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.util.SparseArray#contains`"
+ errorLine1=" return mEntriesMap.contains(userId);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java"
+ line="1503"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.bluetooth.BluetoothDevice#getAlias`"
+ errorLine1=" + mDevice.getAlias() + ", newProfileState " + newProfileState);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java"
+ line="155"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.bluetooth.BluetoothDevice#getAlias`"
+ errorLine1=" final String aliasName = mDevice.getAlias();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java"
+ line="431"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.bluetooth.BluetoothDevice#setAlias`"
+ errorLine1=" mDevice.setAlias(name);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java"
+ line="442"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.bluetooth.BluetoothDevice#getAlias`"
+ errorLine1=" return !TextUtils.isEmpty(mDevice.getAlias());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java"
+ line="489"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.bluetooth.BluetoothDevice#getAlias`"
+ errorLine1=" Log.d(TAG, "updating profiles for " + mDevice.getAlias());"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java"
+ line="638"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.bluetooth.BluetoothDevice#getAlias`"
+ errorLine1=" String name = device.getAlias();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java"
+ line="171"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.net.wifi.WifiManager.SubsystemRestartTrackingCallback`"
+ errorLine1=" new SubsystemRestartTrackingCallback() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="62"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback`"
+ errorLine1=" private class MobileTelephonyCallback extends TelephonyCallback implements"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="77"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.net.wifi.WifiManager#registerSubsystemRestartTrackingCallback`"
+ errorLine1=" mWifiManager.registerSubsystemRestartTrackingCallback(new HandlerExecutor(mHandler),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="197"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.net.wifi.WifiManager#unregisterSubsystemRestartTrackingCallback`"
+ errorLine1=" mWifiManager.unregisterSubsystemRestartTrackingCallback("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="202"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#registerTelephonyCallback`"
+ errorLine1=" mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(mHandler),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="207"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#unregisterTelephonyCallback`"
+ errorLine1=" mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java"
+ line="212"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#isDataCapable`"
+ errorLine1=" return getTelephonyManager().isDataCapable()"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java"
+ line="236"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.TelephonyManager#getSubscriptionId`"
+ errorLine1=" final int mobileDefaultSubId = telephonyManager.getSubscriptionId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java"
+ line="41"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getName`"
+ errorLine1=" return mRouteInfo.getName().toString();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java"
+ line="51"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getClientPackageName`"
+ errorLine1=" return mRouteInfo.getClientPackageName() != null"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java"
+ line="56"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getFeatures`"
+ errorLine1=" final List<String> features = mRouteInfo.getFeatures();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java"
+ line="93"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getId`"
+ errorLine1=" if (info != null && info.getSelectableRoutes().contains(device.mRouteInfo.getId())) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="131"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getSelectableRoutes`"
+ errorLine1=" if (info != null && info.getSelectableRoutes().contains(device.mRouteInfo.getId())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="131"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getId`"
+ errorLine1=" if (info != null && info.getSelectedRoutes().contains(device.mRouteInfo.getId())) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="162"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getSelectedRoutes`"
+ errorLine1=" if (info != null && info.getSelectedRoutes().contains(device.mRouteInfo.getId())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="162"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getName`"
+ errorLine1=" Log.d(TAG, route.getName() + " is deselectable for " + mPackageName);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="238"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getVolumeMax`"
+ errorLine1=" return info.getVolumeMax();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="320"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getVolume`"
+ errorLine1=" return info.getVolume();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="341"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getName`"
+ errorLine1=" return info.getName();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="357"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getName`"
+ errorLine1=" Log.d(TAG, "buildAllRoutes() route : " + route.getName() + ", volume : ""
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="408"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getVolume`"
+ errorLine1=" + route.getVolume() + ", type : " + route.getType());"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="409"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#isSystemRoute`"
+ errorLine1=" if (route.isSystemRoute()) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="411"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getName`"
+ errorLine1=" Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : ""
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="424"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getVolume`"
+ errorLine1=" + route.getVolume() + ", type : " + route.getType());"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="425"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getId`"
+ errorLine1=" && getRoutingSessionInfo().getSelectedRoutes().contains(route.getId())"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="444"
+ column="87"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getSelectedRoutes`"
+ errorLine1=" && getRoutingSessionInfo().getSelectedRoutes().contains(route.getId())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="444"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getName`"
+ errorLine1=" Log.d(TAG, "onTransferred() oldSession : " + oldSession.getName()"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="509"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getName`"
+ errorLine1=" + ", newSession : " + newSession.getName());"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java"
+ line="510"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.RoutingSessionInfo#getId`"
+ errorLine1=" if (TextUtils.equals(sessionId, info.getId())) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java"
+ line="342"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getVolumeMax`"
+ errorLine1=" return mRouteInfo.getVolumeMax();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java"
+ line="221"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getVolume`"
+ errorLine1=" return mRouteInfo.getVolume();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java"
+ line="234"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getClientPackageName`"
+ errorLine1=" return mRouteInfo.getClientPackageName();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java"
+ line="247"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getFeatures`"
+ errorLine1=" return mRouteInfo.getFeatures();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java"
+ line="387"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getId`"
+ errorLine1=" return route.getId();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/MediaDeviceUtils.java"
+ line="57"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.TelephonyDisplayInfo#getOverrideNetworkType`"
+ errorLine1=" if (telephonyDisplayInfo.getOverrideNetworkType()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileMappings.java"
+ line="42"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.TelephonyDisplayInfo#getNetworkType`"
+ errorLine1=" return toIconKey(telephonyDisplayInfo.getNetworkType());"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileMappings.java"
+ line="44"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.TelephonyDisplayInfo#getOverrideNetworkType`"
+ errorLine1=" return toDisplayIconKey(telephonyDisplayInfo.getOverrideNetworkType());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileMappings.java"
+ line="46"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#registerTelephonyCallback`"
+ errorLine1=" mPhone.registerTelephonyCallback(mReceiverHandler::post, mTelephonyCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="80"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#unregisterTelephonyCallback`"
+ errorLine1=" mPhone.unregisterTelephonyCallback(mTelephonyCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="82"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback`"
+ errorLine1=" public class MobileTelephonyCallback extends TelephonyCallback implements"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="109"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.ServiceStateListener`"
+ errorLine1=" TelephonyCallback.ServiceStateListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="110"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.SignalStrengthsListener`"
+ errorLine1=" TelephonyCallback.SignalStrengthsListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="111"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.DataConnectionStateListener`"
+ errorLine1=" TelephonyCallback.DataConnectionStateListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="112"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.DataActivityListener`"
+ errorLine1=" TelephonyCallback.DataActivityListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="113"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.CarrierNetworkListener`"
+ errorLine1=" TelephonyCallback.CarrierNetworkListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="114"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener`"
+ errorLine1=" TelephonyCallback.ActiveDataSubscriptionIdListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="115"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 29): `android.telephony.TelephonyCallback.DisplayInfoListener`"
+ errorLine1=" TelephonyCallback.DisplayInfoListener{"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="116"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.telephony.SubscriptionManager#getActiveDataSubscriptionId`"
+ errorLine1=" return SubscriptionManager.getActiveDataSubscriptionId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java"
+ line="207"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `com.google.android.collect.Lists#newArrayList`"
+ errorLine1=" private ArrayList<NetworkPolicy> mPolicies = Lists.newArrayList();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/NetworkPolicyEditor.java"
+ line="54"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.media.MediaRoute2Info#getName`"
+ errorLine1=" name = mRouteInfo.getName();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java"
+ line="71"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.app.admin.DevicePolicyManager#isOrganizationOwnedDeviceWithManagedProfile`"
+ errorLine1=" if (profileAdmin != null && dpm.isOrganizationOwnedDeviceWithManagedProfile()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java"
+ line="280"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.content.Context#bindServiceAsUser`"
+ errorLine1=" mContext.bindServiceAsUser(mServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java"
+ line="83"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `new android.net.NetworkInfo`"
+ errorLine1=" mNetworkInfo = new NetworkInfo("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java"
+ line="110"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiManager#getMaxSignalLevel`"
+ errorLine1=" int maxSignalLevel = wifiManager.getMaxSignalLevel();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java"
+ line="131"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.telephony.TelephonyManager#isDataCapable`"
+ errorLine1=" return !context.getSystemService(TelephonyManager.class).isDataCapable();"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/Utils.java"
+ line="447"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.NetworkRequest.Builder#clearCapabilities`"
+ errorLine1=" .clearCapabilities()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java"
+ line="72"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.net.wifi.WifiInfo#getSubscriptionId`"
+ errorLine1=" subId = mWifiInfo.getSubscriptionId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java"
+ line="231"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `android.net.wifi.WifiInfo#getSubscriptionId`"
+ errorLine1=" subId = mWifiInfo.getSubscriptionId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java"
+ line="263"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiManager#calculateSignalLevel`"
+ errorLine1=" level = mWifiManager.calculateSignalLevel(rssi);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java"
+ line="279"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.NetworkRequest.Builder#clearCapabilities`"
+ errorLine1=" .clearCapabilities()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java"
+ line="243"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 29): `android.net.wifi.WifiInfo#getWifiStandard`"
+ errorLine1=" visibility.append(" standard = ").append(info.getWifiStandard());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java"
+ line="104"
+ column="59"/>
+ </issue>
+
+</issues>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index dfd3d88..14ccd80 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1277,18 +1277,32 @@
<!-- Label for the settings activity for controlling apps that can schedule alarms [CHAR LIMIT=30] -->
<string name="alarms_and_reminders_label">Alarms and reminders</string>
<!-- Label for the switch to toggler the permission for scheduling alarms [CHAR LIMIT=50] -->
- <string name="alarms_and_reminders_switch_title">Allow to set alarms or reminders</string>
+ <string name="alarms_and_reminders_switch_title">Allow setting alarms and reminders</string>
<!-- Title for the setting screen for controlling apps that can schedule alarms [CHAR LIMIT=30] -->
- <string name="alarms_and_reminders_title">Alarms and reminders</string>
+ <string name="alarms_and_reminders_title">Alarms & reminders</string>
<!-- Description that appears below the alarms_and_reminders switch [CHAR LIMIT=NONE] -->
- <string name="alarms_and_reminders_footer_title">
- Allow this app to schedule alarms or other timing based events.
- This will allow the app to wake up and run even when you are not using the device.
- Note that revoking this permission may cause the app to malfunction, specifically any alarms
- that the app has scheduled will no longer work.
+ <string name="alarms_and_reminders_footer_title" product="default">
+ Allow this app to set alarms and schedule other actions.
+ This app may be used when you\u2019re not using your phone, which may use more battery.
+ If this permission is off, this app may not function normally,
+ and its alarms won\u2019t work as scheduled.
+ </string>
+ <!-- Description that appears below the alarms_and_reminders switch [CHAR LIMIT=NONE] -->
+ <string name="alarms_and_reminders_footer_title" product="tablet">
+ Allow this app to set alarms and schedule other actions.
+ This app may be used when you\u2019re not using your tablet, which may use more battery.
+ If this permission is off, this app may not function normally,
+ and its alarms won\u2019t work as scheduled.
+ </string>
+ <!-- Description that appears below the alarms_and_reminders switch [CHAR LIMIT=NONE] -->
+ <string name="alarms_and_reminders_footer_title" product="device">
+ Allow this app to set alarms and schedule other actions.
+ This app may be used when you\u2019re not using your device, which may use more battery.
+ If this permission is off, this app may not function normally,
+ and its alarms won\u2019t work as scheduled.
</string>
<!-- Keywords for setting screen for controlling apps that can schedule alarms [CHAR LIMIT=100] -->
- <string name="keywords_alarms_and_reminders">schedule, alarm, reminder, event</string>
+ <string name="keywords_alarms_and_reminders">schedule, alarm, reminder, clock</string>
<!-- Do not disturb: Label for button in enable zen dialog that will turn on zen mode. [CHAR LIMIT=30] -->
<string name="zen_mode_enable_dialog_turn_on">Turn on</string>
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 46ecbd4..cb41743 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -694,6 +694,16 @@
assertThat(ap.getTitle()).isEqualTo(providerFriendlyName);
}
+ // This method doesn't copy mIsFailover, mIsAvailable and mIsRoaming because NetworkInfo
+ // doesn't expose those three set methods. But that's fine since the tests don't use those three
+ // variables.
+ private NetworkInfo copyNetworkInfo(NetworkInfo ni) {
+ final NetworkInfo copy = new NetworkInfo(ni.getType(), ni.getSubtype(), ni.getTypeName(),
+ ni.getSubtypeName());
+ copy.setDetailedState(ni.getDetailedState(), ni.getReason(), ni.getExtraInfo());
+ return copy;
+ }
+
@Test
public void testUpdateNetworkInfo_returnsTrue() {
int networkId = 123;
@@ -715,7 +725,7 @@
.setWifiInfo(wifiInfo)
.build();
- NetworkInfo newInfo = new NetworkInfo(networkInfo);
+ NetworkInfo newInfo = copyNetworkInfo(networkInfo);
newInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
assertThat(ap.update(config, wifiInfo, newInfo)).isTrue();
}
@@ -741,7 +751,7 @@
.setWifiInfo(wifiInfo)
.build();
- NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values
+ NetworkInfo newInfo = copyNetworkInfo(networkInfo); // same values
assertThat(ap.update(config, wifiInfo, newInfo)).isFalse();
}
@@ -766,7 +776,7 @@
.setWifiInfo(wifiInfo)
.build();
- NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values
+ NetworkInfo newInfo = copyNetworkInfo(networkInfo); // same values
wifiInfo.setRssi(rssi + 1);
assertThat(ap.update(config, wifiInfo, newInfo)).isTrue();
}
@@ -792,7 +802,7 @@
.setWifiInfo(wifiInfo)
.build();
- NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values
+ NetworkInfo newInfo = copyNetworkInfo(networkInfo); // same values
wifiInfo.setRssi(WifiInfo.INVALID_RSSI);
assertThat(ap.update(config, wifiInfo, newInfo)).isFalse();
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index 0790189..97032dd 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -127,6 +127,7 @@
VALIDATORS.put(Global.POWER_BUTTON_LONG_PRESS, new InclusiveIntegerRangeValidator(0, 5));
VALIDATORS.put(
Global.POWER_BUTTON_VERY_LONG_PRESS, new InclusiveIntegerRangeValidator(0, 1));
+ VALIDATORS.put(Global.KEY_CHORD_POWER_VOLUME_UP, new InclusiveIntegerRangeValidator(0, 2));
VALIDATORS.put(Global.NOTIFICATION_BUBBLES, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_APP, ANY_STRING_VALIDATOR);
VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_USER, ANY_INTEGER_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 081f3f6..91667c4 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -1941,7 +1941,10 @@
if (ai.isSystemApp() || ai.isSignedWithPlatformKey()) {
return;
}
- checkReadableAnnotation(settingsType, settingName);
+ if ((ai.flags & ApplicationInfo.FLAG_TEST_ONLY) == 0) {
+ // Skip checking readable annotations for test_only apps
+ checkReadableAnnotation(settingsType, settingName);
+ }
if (!ai.isInstantApp()) {
return;
}
@@ -1983,9 +1986,9 @@
if (allFields.contains(settingName) && !readableFields.contains(settingName)) {
throw new SecurityException(
- "Settings key: <" + settingName + "> is not readable. From S+, new public "
- + "settings keys need to be annotated with @Readable unless they are "
- + "annotated with @hide.");
+ "Settings key: <" + settingName + "> is not readable. From S+, settings keys "
+ + "annotated with @hide are restricted to system_server and system "
+ + "apps only, unless they are annotated with @Readable.");
}
}
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 3877b1e..150d10d 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -593,6 +593,7 @@
Settings.Global.INTEGRITY_CHECK_INCLUDES_RULE_PROVIDER,
Settings.Global.CACHED_APPS_FREEZER_ENABLED,
Settings.Global.APP_INTEGRITY_VERIFICATION_TIMEOUT,
+ Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT);
private static final Set<String> BACKUP_DENY_LIST_SECURE_SETTINGS =
@@ -750,7 +751,7 @@
Settings.Secure.SUPPRESS_DOZE,
Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED,
Settings.Secure.ACCESSIBILITY_SHOW_WINDOW_MAGNIFICATION_PROMPT,
- Settings.Secure.TRANSFORM_ENABLED);
+ Settings.Secure.UI_TRANSLATION_ENABLED);
@Test
public void systemSettingsBackedUpOrDenied() {
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 820b180..bef6423f 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -42,6 +42,75 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
+ <uses-permission android:name="android.permission.RECEIVE_SMS" />
+ <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
+ <uses-permission android:name="android.permission.RECEIVE_MMS" />
+ <uses-permission android:name="android.permission.READ_CELL_BROADCASTS" />
+ <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
+ <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
+ <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
+ <uses-permission android:name="android.permission.USE_SIP" />
+ <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
+ <uses-permission android:name="android.permission.ACCEPT_HANDOVER" />
+ <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
+ <uses-permission android:name="android.permission.BODY_SENSORS" />
+ <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
+ <uses-permission android:name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
+ <uses-permission android:name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" />
+ <uses-permission android:name="android.permission.READ_LOGS" />
+ <uses-permission android:name="android.permission.BRIGHTNESS_SLIDER_USAGE" />
+ <uses-permission android:name="android.permission.ACCESS_AMBIENT_LIGHT_STATS" />
+ <uses-permission android:name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS" />
+ <uses-permission android:name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
+ <uses-permission android:name="android.permission.SET_MEDIA_KEY_LISTENER" />
+ <uses-permission android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE" />
+ <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
+ <uses-permission android:name="android.permission.CALL_COMPANION_APP" />
+ <uses-permission android:name="android.permission.USE_FINGERPRINT" />
+ <uses-permission android:name="android.permission.READ_PROFILE" />
+ <uses-permission android:name="android.permission.WRITE_PROFILE" />
+ <uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
+ <uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
+ <uses-permission android:name="android.permission.WRITE_SMS" />
+ <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+ <uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ" />
+ <uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE" />
+ <uses-permission android:name="android.permission.FLASHLIGHT" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.NFC" />
+ <uses-permission android:name="android.permission.NFC_TRANSACTION_EVENT" />
+ <uses-permission android:name="android.permission.NFC_PREFERRED_PAYMENT_INFO" />
+ <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
+ <uses-permission android:name="android.permission.TRANSMIT_IR" />
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+ <uses-permission android:name="android.permission.REQUEST_PASSWORD_COMPLEXITY" />
+ <uses-permission android:name="android.permission.GET_TASKS" />
+ <uses-permission android:name="android.permission.RESTART_PACKAGES" />
+ <uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
+ <uses-permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND" />
+ <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" />
+ <uses-permission android:name="android.permission.HIDE_OVERLAY_WINDOWS" />
+ <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.READ_SYNC_STATS" />
+ <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
+ <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
+ <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+ <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
+ <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
+ <uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" />
+ <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
+ <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
+ <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
+ <uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
+ <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
+ <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
+ <uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
+ <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<!-- ACCESS_BACKGROUND_LOCATION is needed for testing purposes only. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 6574353..8b226c9 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -71,6 +71,7 @@
],
static_libs: [
"WindowManager-Shell",
+ "SystemUIAnimationLib",
"SystemUIPluginLib",
"SystemUISharedLib",
"SystemUI-statsd",
@@ -139,6 +140,7 @@
"src/**/I*.aidl",
],
static_libs: [
+ "SystemUIAnimationLib",
"SystemUIPluginLib",
"SystemUISharedLib",
"SystemUI-statsd",
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3801749..a834784 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -276,6 +276,8 @@
<!-- Permission to make accessibility service access Bubbles -->
<uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />
+ <!-- Permission for Smartspace. -->
+ <uses-permission android:name="android.permission.MANAGE_SMARTSPACE" />
<protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
<protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" />
@@ -680,7 +682,7 @@
<activity
android:name=".settings.brightness.BrightnessDialog"
android:label="@string/quick_settings_brightness_dialog_title"
- android:theme="@*android:style/Theme.DeviceDefault.SystemUI.Dialog"
+ android:theme="@style/Theme.SystemUI.QuickSettings.BrightnessDialog"
android:finishOnCloseSystemDialogs="true"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp
new file mode 100644
index 0000000..ab9ab83
--- /dev/null
+++ b/packages/SystemUI/animation/Android.bp
@@ -0,0 +1,44 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"],
+}
+
+android_library {
+
+ name: "SystemUIAnimationLib",
+
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+
+ resource_dirs: [
+ "res",
+ ],
+
+ static_libs: [
+ "PluginCoreLib",
+ "SystemUI-sensors",
+ ],
+
+ manifest: "AndroidManifest.xml",
+
+}
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/animation/AndroidManifest.xml
similarity index 63%
copy from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
copy to packages/SystemUI/animation/AndroidManifest.xml
index 41d88b4..321cc531 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/packages/SystemUI/animation/AndroidManifest.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
+<!--
+ Copyright (C) 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,11 +14,9 @@
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:shape="oval">
- <size
- android:height="50dp"
- android:width="50dp" />
- <solid android:color="@android:color/transparent" />
- <stroke android:width="2dp" android:color="#AECBFA" />
-</shape>
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.systemui.animation">
+
+
+</manifest>
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_x.xml
similarity index 63%
copy from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
copy to packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_x.xml
index 41d88b4..620dd48 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_x.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
+<!--
+ Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,11 +14,5 @@
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:shape="oval">
- <size
- android:height="50dp"
- android:width="50dp" />
- <solid android:color="@android:color/transparent" />
- <stroke android:width="2dp" android:color="#AECBFA" />
-</shape>
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0, 0 C 0.1217, 0.0462, 0.15, 0.4686, 0.1667, 0.66 C 0.1834, 0.8878, 0.1667, 1, 1, 1" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_y.xml
similarity index 63%
copy from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
copy to packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_y.xml
index 41d88b4..a268abc 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/packages/SystemUI/animation/res/interpolator/launch_animation_interpolator_y.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
+<!--
+ Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,11 +14,5 @@
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:shape="oval">
- <size
- android:height="50dp"
- android:width="50dp" />
- <solid android:color="@android:color/transparent" />
- <stroke android:width="2dp" android:color="#AECBFA" />
-</shape>
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1" />
\ No newline at end of file
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
similarity index 86%
rename from packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/ActivityLaunchAnimator.kt
rename to packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
index 5af8dab..da78a7c 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/ActivityLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
@@ -1,10 +1,11 @@
-package com.android.systemui.plugins.animation
+package com.android.systemui.animation
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.app.ActivityManager
import android.app.PendingIntent
+import android.content.Context
import android.graphics.Matrix
import android.graphics.Rect
import android.os.RemoteException
@@ -16,7 +17,7 @@
import android.view.SyncRtSurfaceTransactionApplier
import android.view.View
import android.view.WindowManager
-import android.view.animation.LinearInterpolator
+import android.view.animation.AnimationUtils
import android.view.animation.PathInterpolator
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.policy.ScreenDecorationsUtils
@@ -26,24 +27,18 @@
* A class that allows activities to be started in a seamless way from a view that is transforming
* nicely into the starting window.
*/
-class ActivityLaunchAnimator {
+class ActivityLaunchAnimator(context: Context) {
companion object {
- const val ANIMATION_DURATION = 400L
- const val ANIMATION_DURATION_FADE_OUT_CONTENT = 67L
- const val ANIMATION_DURATION_FADE_IN_WINDOW = 200L
+ const val ANIMATION_DURATION = 500L
+ const val ANIMATION_DURATION_FADE_OUT_CONTENT = 183L
+ const val ANIMATION_DURATION_FADE_IN_WINDOW = 216L
+ const val ANIMATION_DELAY_FADE_IN_WINDOW = 166L
private const val ANIMATION_DURATION_NAV_FADE_IN = 266L
private const val ANIMATION_DURATION_NAV_FADE_OUT = 133L
private const val ANIMATION_DELAY_NAV_FADE_IN =
ANIMATION_DURATION - ANIMATION_DURATION_NAV_FADE_IN
private const val LAUNCH_TIMEOUT = 1000L
- // TODO(b/184121838): Use android.R.interpolator.fast_out_extra_slow_in instead.
- // TODO(b/184121838): Move com.android.systemui.Interpolators in an animation library we can
- // reuse here.
- private val ANIMATION_INTERPOLATOR = PathInterpolator(0.4f, 0f, 0.2f, 1f)
- private val LINEAR_INTERPOLATOR = LinearInterpolator()
- private val ALPHA_IN_INTERPOLATOR = PathInterpolator(0.4f, 0f, 1f, 1f)
- private val ALPHA_OUT_INTERPOLATOR = PathInterpolator(0f, 0f, 0.8f, 1f)
private val NAV_FADE_IN_INTERPOLATOR = PathInterpolator(0f, 0f, 0f, 1f)
private val NAV_FADE_OUT_INTERPOLATOR = PathInterpolator(0.2f, 0f, 1f, 1f)
@@ -61,6 +56,14 @@
}
}
+ /** The interpolator used for the width, height, Y position and corner radius. */
+ private val animationInterpolator = AnimationUtils.loadInterpolator(context,
+ R.interpolator.launch_animation_interpolator_y)
+
+ /** The interpolator used for the X position. */
+ private val animationInterpolatorX = AnimationUtils.loadInterpolator(context,
+ R.interpolator.launch_animation_interpolator_x)
+
/**
* Start an intent and animate the opening window. The intent will be started by running
* [intentStarter], which should use the provided [RemoteAnimationAdapter] and return the launch
@@ -112,6 +115,10 @@
startIntentWithAnimation(controller) { intentStarter.startPendingIntent(it) }
}
+ /** Create a new animation [Runner] controlled by [controller]. */
+ @VisibleForTesting
+ fun createRunner(controller: Controller): Runner = Runner(controller)
+
interface PendingIntentStarter {
/**
* Start a pending intent using the provided [animationAdapter] and return the launch
@@ -216,8 +223,13 @@
var backgroundAlpha: Float = 1f
) {
private val startTop = top
+ private val startBottom = bottom
private val startLeft = left
private val startRight = right
+ private val startWidth = width
+ private val startHeight = height
+ val startCenterX = centerX
+ val startCenterY = centerY
val width: Int
get() = right - left
@@ -228,15 +240,30 @@
open val topChange: Int
get() = top - startTop
+ open val bottomChange: Int
+ get() = bottom - startBottom
+
val leftChange: Int
get() = left - startLeft
val rightChange: Int
get() = right - startRight
+
+ val widthRatio: Float
+ get() = width.toFloat() / startWidth
+
+ val heightRatio: Float
+ get() = height.toFloat() / startHeight
+
+ val centerX: Float
+ get() = left + width / 2f
+
+ val centerY: Float
+ get() = top + height / 2f
}
@VisibleForTesting
- class Runner(private val controller: Controller) : IRemoteAnimationRunner.Stub() {
+ inner class Runner(private val controller: Controller) : IRemoteAnimationRunner.Stub() {
private val rootView = controller.getRootView()
@PublishedApi internal val context = rootView.context
private val transactionApplier = SyncRtSurfaceTransactionApplier(rootView)
@@ -316,6 +343,8 @@
val startBottom = state.bottom
val startLeft = state.left
val startRight = state.right
+ val startXCenter = (startLeft + startRight) / 2f
+ val startWidth = startRight - startLeft
val startTopCornerRadius = state.topCornerRadius
val startBottomCornerRadius = state.bottomCornerRadius
@@ -326,6 +355,8 @@
val endBottom = windowBounds.bottom
val endLeft = windowBounds.left
val endRight = windowBounds.right
+ val endXCenter = (endLeft + endRight) / 2f
+ val endWidth = endRight - endLeft
// TODO(b/184121838): Ensure that we are launching on the same screen.
val rootViewLocation = rootView.locationOnScreen
@@ -349,7 +380,7 @@
val animator = ValueAnimator.ofFloat(0f, 1f)
this.animator = animator
animator.duration = ANIMATION_DURATION
- animator.interpolator = LINEAR_INTERPOLATOR
+ animator.interpolator = Interpolators.LINEAR
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?, isReverse: Boolean) {
@@ -368,12 +399,15 @@
}
val linearProgress = animation.animatedFraction
- val progress = ANIMATION_INTERPOLATOR.getInterpolation(linearProgress)
+ val progress = animationInterpolator.getInterpolation(linearProgress)
+ val xProgress = animationInterpolatorX.getInterpolation(linearProgress)
+ val xCenter = MathUtils.lerp(startXCenter, endXCenter, xProgress)
+ val halfWidth = lerp(startWidth, endWidth, progress) / 2
state.top = lerp(startTop, endTop, progress).roundToInt()
state.bottom = lerp(startBottom, endBottom, progress).roundToInt()
- state.left = lerp(startLeft, endLeft, progress).roundToInt()
- state.right = lerp(startRight, endRight, progress).roundToInt()
+ state.left = (xCenter - halfWidth).roundToInt()
+ state.right = (xCenter + halfWidth).roundToInt()
state.topCornerRadius = MathUtils.lerp(startTopCornerRadius, endRadius, progress)
state.bottomCornerRadius =
@@ -382,12 +416,12 @@
val contentAlphaProgress = getProgress(linearProgress, 0,
ANIMATION_DURATION_FADE_OUT_CONTENT)
state.contentAlpha =
- 1 - ALPHA_OUT_INTERPOLATOR.getInterpolation(contentAlphaProgress)
+ 1 - Interpolators.ALPHA_OUT.getInterpolation(contentAlphaProgress)
val backgroundAlphaProgress = getProgress(linearProgress,
- ANIMATION_DURATION_FADE_OUT_CONTENT, ANIMATION_DURATION_FADE_IN_WINDOW)
+ ANIMATION_DELAY_FADE_IN_WINDOW, ANIMATION_DURATION_FADE_IN_WINDOW)
state.backgroundAlpha =
- 1 - ALPHA_IN_INTERPOLATOR.getInterpolation(backgroundAlphaProgress)
+ 1 - Interpolators.ALPHA_IN.getInterpolation(backgroundAlphaProgress)
applyStateToWindow(window, state)
navigationBar?.let { applyStateToNavigationBar(it, state, linearProgress) }
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/GhostedViewLaunchAnimatorController.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
similarity index 93%
rename from packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/GhostedViewLaunchAnimatorController.kt
rename to packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
index a5494ad..01ec447 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/animation/GhostedViewLaunchAnimatorController.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
@@ -1,7 +1,8 @@
-package com.android.systemui.plugins.animation
+package com.android.systemui.animation
import android.graphics.Canvas
import android.graphics.ColorFilter
+import android.graphics.Matrix
import android.graphics.PixelFormat
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
@@ -13,6 +14,7 @@
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
+import kotlin.math.min
/**
* A base implementation of [ActivityLaunchAnimator.Controller] which creates a [ghost][GhostView]
@@ -34,7 +36,9 @@
private val rootViewOverlay = rootView.overlay
/** The ghost view that is drawn and animated instead of the ghosted view. */
- private var ghostView: View? = null
+ private var ghostView: GhostView? = null
+ private val initialGhostViewMatrixValues = FloatArray(9) { 0f }
+ private val ghostViewMatrix = Matrix()
/**
* The expanding background view that will be added to [rootView] (below [ghostView]) and
@@ -125,6 +129,9 @@
ghostView = GhostView.addGhost(ghostedView, rootView).apply {
setLayerType(View.LAYER_TYPE_HARDWARE, null)
}
+
+ val matrix = ghostView?.animationMatrix ?: Matrix.IDENTITY_MATRIX
+ matrix.getValues(initialGhostViewMatrixValues)
}
override fun onLaunchAnimationProgress(
@@ -133,10 +140,17 @@
linearProgress: Float
) {
val ghostView = this.ghostView!!
- ghostView.translationX = (state.leftChange + state.rightChange) / 2.toFloat()
- ghostView.translationY = state.topChange.toFloat()
ghostView.alpha = state.contentAlpha
+ val scale = min(state.widthRatio, state.heightRatio)
+ ghostViewMatrix.setValues(initialGhostViewMatrixValues)
+ ghostViewMatrix.postScale(scale, scale, state.startCenterX, state.startCenterY)
+ ghostViewMatrix.postTranslate(
+ (state.leftChange + state.rightChange) / 2f,
+ (state.topChange + state.bottomChange) / 2f
+ )
+ ghostView.animationMatrix = ghostViewMatrix
+
val backgroundView = this.backgroundView!!
backgroundView.top = state.top
backgroundView.bottom = state.bottom
diff --git a/packages/SystemUI/src/com/android/systemui/Interpolators.java b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java
similarity index 86%
rename from packages/SystemUI/src/com/android/systemui/Interpolators.java
rename to packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java
index c23bcb8..58cef31 100644
--- a/packages/SystemUI/src/com/android/systemui/Interpolators.java
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java
@@ -11,10 +11,10 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
*/
-package com.android.systemui;
+package com.android.systemui.animation;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
@@ -24,8 +24,6 @@
import android.view.animation.LinearInterpolator;
import android.view.animation.PathInterpolator;
-import com.android.systemui.statusbar.notification.stack.HeadsUpAppearInterpolator;
-
/**
* Utility class to receive interpolators from
*/
@@ -48,12 +46,11 @@
public static final Interpolator ACCELERATE_DECELERATE = new AccelerateDecelerateInterpolator();
public static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f);
public static final Interpolator CUSTOM_40_40 = new PathInterpolator(0.4f, 0f, 0.6f, 1f);
- public static final Interpolator HEADS_UP_APPEAR = new HeadsUpAppearInterpolator();
public static final Interpolator ICON_OVERSHOT = new PathInterpolator(0.4f, 0f, 0.2f, 1.4f);
- public static final Interpolator ICON_OVERSHOT_LESS
- = new PathInterpolator(0.4f, 0f, 0.2f, 1.1f);
- public static final Interpolator PANEL_CLOSE_ACCELERATED
- = new PathInterpolator(0.3f, 0, 0.5f, 1);
+ public static final Interpolator ICON_OVERSHOT_LESS = new PathInterpolator(0.4f, 0f, 0.2f,
+ 1.1f);
+ public static final Interpolator PANEL_CLOSE_ACCELERATED = new PathInterpolator(0.3f, 0, 0.5f,
+ 1);
public static final Interpolator BOUNCE = new BounceInterpolator();
/**
* For state transitions on the control panel that lives in GlobalActions.
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index b3aba22..f415da8 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -34,6 +34,7 @@
static_libs: [
"PluginCoreLib",
"SystemUI-sensors",
+ "SystemUIAnimationLib",
],
}
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index f8a9a045..35423a9 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -16,7 +16,9 @@
package com.android.systemui.plugins;
+import android.app.smartspace.SmartspaceTarget;
import android.os.Parcelable;
+import android.view.ViewGroup;
import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -36,9 +38,25 @@
/** Unregister a listener. */
void unregisterListener(SmartspaceTargetListener listener);
+ /**
+ * Create a view to be shown within the parent. Do not add the view, as the parent
+ * will be responsible for correctly setting the LayoutParams
+ */
+ default SmartspaceView getView(ViewGroup parent) {
+ return null;
+ }
+
+ /** Updates Smartspace data and propagates it to any listeners. */
+ void onTargetsAvailable(List<SmartspaceTarget> targets);
+
/** Provides Smartspace data to registered listeners. */
interface SmartspaceTargetListener {
/** Each Parcelable is a SmartspaceTarget that represents a card. */
void onSmartspaceTargetsUpdated(List<? extends Parcelable> targets);
}
+
+ /** View to which this plugin can be registered, in order to get updates. */
+ interface SmartspaceView {
+ void registerDataProvider(BcSmartspaceDataPlugin plugin);
+ }
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
index 055fe37..00bea8d 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
@@ -19,7 +19,7 @@
import android.content.Intent;
import android.view.View;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.annotations.ProvidesInterface;
/**
diff --git a/packages/SystemUI/res-keyguard/font/clock.xml b/packages/SystemUI/res-keyguard/font/clock.xml
index 008b322..d0867e9 100644
--- a/packages/SystemUI/res-keyguard/font/clock.xml
+++ b/packages/SystemUI/res-keyguard/font/clock.xml
@@ -23,6 +23,5 @@
** Recommended: font with variable width to support AOD => LS animations
-->
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- TODO (b/171376810): switch this font with a variable width clock font for AOSP -->
- <font android:typeface="monospace" android:font="@*android:string/config_headlineFontFamily" />
+ <font android:typeface="monospace"/>
</font-family>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
index 6ecbe06..00c27bf 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -25,65 +25,30 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top">
<FrameLayout
- android:id="@+id/clock_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_alignParentTop="true">
- <TextClock
- android:id="@+id/default_clock_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:gravity="center_horizontal"
- android:paddingBottom="@dimen/title_clock_padding"
- android:letterSpacing="0.02"
- android:textColor="?attr/wallpaperTextColor"
- android:singleLine="true"
- style="@style/widget_big"
- android:format12Hour="@string/keyguard_widget_12_hours_format"
- android:format24Hour="@string/keyguard_widget_24_hours_format"
- android:elegantTextHeight="false"
- />
- <TextClock
- android:id="@+id/default_clock_view_bold"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal"
- android:textColor="?attr/wallpaperTextColor"
- android:singleLine="true"
- style="@style/widget_title_bold"
- android:format12Hour="@string/keyguard_widget_12_hours_format"
- android:format24Hour="@string/keyguard_widget_24_hours_format"
- android:elegantTextHeight="false"
- android:visibility="invisible"
- />
- </FrameLayout>
- <FrameLayout
- android:id="@+id/new_lockscreen_clock_view"
+ android:id="@+id/lockscreen_clock_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
- android:visibility="gone">
+ android:paddingStart="@dimen/clock_padding_start">
<com.android.keyguard.AnimatableClockView
android:id="@+id/animatable_clock_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
- android:textSize="86dp"
+ android:textSize="@dimen/clock_text_size"
android:fontFamily="@font/clock"
android:typeface="monospace"
android:elegantTextHeight="false"
android:singleLine="true"
+ chargeAnimationDelay="350"
dozeWeight="200"
lockScreenWeight="400"
/>
</FrameLayout>
<FrameLayout
- android:id="@+id/new_lockscreen_clock_view_large"
+ android:id="@+id/lockscreen_clock_view_large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/keyguard_status_area"
@@ -98,6 +63,7 @@
android:fontFamily="@font/clock"
android:typeface="monospace"
android:elegantTextHeight="false"
+ chargeAnimationDelay="200"
dozeWeight="200"
lockScreenWeight="400"
/>
@@ -106,7 +72,8 @@
android:id="@+id/keyguard_status_area"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_below="@id/clock_view" />
+ android:layout_alignParentStart="true"
+ android:layout_below="@id/lockscreen_clock_view" />
<com.android.systemui.statusbar.phone.NotificationIconContainer
android:id="@+id/left_aligned_notification_icon_container"
@@ -114,6 +81,6 @@
android:layout_height="@dimen/notification_shelf_height"
android:layout_marginTop="@dimen/widget_vertical_padding"
android:layout_below="@id/keyguard_status_area"
- android:visibility="gone"
+ android:paddingStart="@dimen/below_clock_padding_start"
/>
</com.android.keyguard.KeyguardClockSwitch>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index 9f3ca74..95eb5c1 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -25,6 +25,7 @@
android:layout_gravity="center_horizontal"
android:clipToPadding="false"
android:orientation="vertical"
+ android:paddingStart="@dimen/below_clock_padding_start"
android:layout_centerHorizontal="true">
<TextView
android:id="@+id/title"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index 10cd3cb..c5ba3d2 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -70,12 +70,5 @@
android:letterSpacing="0.05"
android:ellipsize="marquee"
android:singleLine="true" />
- <com.android.systemui.statusbar.phone.NotificationIconContainer
- android:id="@+id/clock_notification_icon_container"
- android:layout_width="match_parent"
- android:layout_height="@dimen/notification_shelf_height"
- android:layout_marginTop="@dimen/widget_vertical_padding"
- android:visibility="invisible"
- />
</LinearLayout>
</com.android.keyguard.KeyguardStatusView>
diff --git a/packages/SystemUI/res-keyguard/values/attrs.xml b/packages/SystemUI/res-keyguard/values/attrs.xml
index eb7a1f7..25be37a 100644
--- a/packages/SystemUI/res-keyguard/values/attrs.xml
+++ b/packages/SystemUI/res-keyguard/values/attrs.xml
@@ -45,5 +45,6 @@
<declare-styleable name="AnimatableClockView">
<attr name="dozeWeight" format="integer" />
<attr name="lockScreenWeight" format="integer" />
+ <attr name="chargeAnimationDelay" format="integer" />
</declare-styleable>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 07bd2e6..9b8035d 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -90,4 +90,8 @@
<dimen name="num_pad_key_width">72dp</dimen>
<dimen name="num_pad_row_margin_bottom">6dp</dimen>
<dimen name="num_pad_key_margin_end">12dp</dimen>
+
+ <!-- additional offset for clock switch area items -->
+ <dimen name="clock_padding_start">28dp</dimen>
+ <dimen name="below_clock_padding_start">32dp</dimen>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml
index 2ffc992..0fef9f1 100644
--- a/packages/SystemUI/res-keyguard/values/styles.xml
+++ b/packages/SystemUI/res-keyguard/values/styles.xml
@@ -17,7 +17,7 @@
*/
-->
-<resources>
+<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<!-- Keyguard PIN pad styles -->
<style name="Keyguard.TextView" parent="@android:style/Widget.DeviceDefault.TextView">
<item name="android:textSize">@dimen/kg_status_line_font_size</item>
@@ -32,7 +32,7 @@
<item name="android:stateListAnimator">@null</item>
</style>
<style name="NumPadKey" parent="Theme.SystemUI">
- <item name="android:colorControlNormal">?android:attr/colorBackground</item>
+ <item name="android:colorControlNormal">?androidprv:attr/colorSurface</item>
<item name="android:colorControlHighlight">?android:attr/colorAccent</item>
<item name="android:background">@drawable/num_pad_key_background</item>
</style>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_01_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_01_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_01_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_02_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_02_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_02_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_03_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_03_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_03_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_04_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_04_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_04_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_05_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_05_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_05_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_06_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_06_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_06_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_07_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_07_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_07_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_08_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_08_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_08_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_09_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_09_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_09_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_10_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_10_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_10_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_11_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_11_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_11_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_12_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_12_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_12_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_13_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_13_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_13_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_14_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_14_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_14_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_15_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_15_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_15_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_16_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_16_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_16_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_17_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_17_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_17_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging__dot_18_pivot_animation.xml b/packages/SystemUI/res/anim/wireless_charging__dot_18_pivot_animation.xml
deleted file mode 100644
index fd5561b..0000000
--- a/packages/SystemUI/res/anim/wireless_charging__dot_18_pivot_animation.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,-11.16667 0.0,-55.83333 0.0,-67.0"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_10_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_10_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_10_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_11_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_11_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_11_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_12_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_12_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_12_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_13_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_13_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_13_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_14_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_14_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_14_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_15_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_15_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_15_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_16_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_16_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_16_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_17_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_17_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_17_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_18_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_18_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_18_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_1_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_1_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_1_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_2_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_2_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_2_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_3_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_3_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_3_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_4_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_4_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_4_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_5_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_5_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_5_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_6_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_6_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_6_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_7_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_7_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_7_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_8_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_8_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_8_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_9_animation.xml b/packages/SystemUI/res/anim/wireless_charging_ellipse_path_9_animation.xml
deleted file mode 100644
index d20e741..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_ellipse_path_9_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="150"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
- android:valueTo="M 0.0,-3.5 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/wireless_charging_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/wireless_charging_null_1_animation.xml b/packages/SystemUI/res/anim/wireless_charging_null_1_animation.xml
deleted file mode 100644
index fffae80..0000000
--- a/packages/SystemUI/res/anim/wireless_charging_null_1_animation.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1166"
- android:propertyName="rotation"
- android:valueFrom="0.0"
- android:valueTo="20.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
-</set>
diff --git a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml b/packages/SystemUI/res/drawable/bg_smartspace_media_item.xml
similarity index 74%
copy from packages/SystemUI/res/drawable/privacy_dialog_bg.xml
copy to packages/SystemUI/res/drawable/bg_smartspace_media_item.xml
index 96136c4..6939084 100644
--- a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/bg_smartspace_media_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 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.
@@ -15,8 +15,7 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="?android:attr/colorBackground" />
- <corners android:radius="@dimen/ongoing_appops_dialog_bg_corner_radius" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+ <solid android:color="@android:color/white" />
+ <corners android:radius="@dimen/qs_media_album_radius" />
</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/brightness_mirror_background.xml b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
index 4b225b7..ae3d312 100644
--- a/packages/SystemUI/res/drawable/brightness_mirror_background.xml
+++ b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
@@ -15,6 +15,6 @@
~ limitations under the License
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="?android:attr/colorBackgroundFloating" />
+ <solid android:color="?attr/underSurfaceColor" />
<corners android:radius="8dp" />
</shape>
diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
index 73b02f4..88d8f78f 100644
--- a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
+++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
@@ -24,7 +24,7 @@
<shape>
<size android:height="@dimen/rounded_slider_track_width" />
<corners android:radius="@dimen/rounded_slider_track_corner_radius" />
- <solid android:color="?android:attr/textColorPrimary" />
+ <solid android:color="?attr/offStateColor" />
</shape>
</inset>
</item>
diff --git a/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml
index f8f455d..ceef9f9 100644
--- a/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml
+++ b/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml
@@ -16,12 +16,13 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
android:autoMirrored="true">
<item android:id="@+id/slider_foreground"
android:height="@dimen/rounded_slider_height">
<shape>
<size android:height="@dimen/rounded_slider_height" />
- <solid android:color="?android:attr/colorControlActivated" />
+ <solid android:color="?priv-android:attr/colorAccentPrimary" />
<corners android:radius="@dimen/rounded_slider_corner_radius"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/res/drawable/circle_wallet_primary_56dp.xml
similarity index 93%
rename from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
rename to packages/SystemUI/res/drawable/circle_wallet_primary_56dp.xml
index 41d88b4..3d4c233 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/packages/SystemUI/res/drawable/circle_wallet_primary_56dp.xml
@@ -16,8 +16,8 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
- android:height="50dp"
- android:width="50dp" />
+ android:height="56dp"
+ android:width="56dp" />
<solid android:color="@android:color/transparent" />
<stroke android:width="2dp" android:color="#AECBFA" />
</shape>
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/res/drawable/circle_wallet_secondary_56dp.xml
similarity index 86%
copy from packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
copy to packages/SystemUI/res/drawable/circle_wallet_secondary_56dp.xml
index 41d88b4..1634e2d 100644
--- a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
+++ b/packages/SystemUI/res/drawable/circle_wallet_secondary_56dp.xml
@@ -16,8 +16,8 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
- android:height="50dp"
- android:width="50dp" />
+ android:height="56dp"
+ android:width="56dp" />
<solid android:color="@android:color/transparent" />
- <stroke android:width="2dp" android:color="#AECBFA" />
+ <stroke android:width="2dp" android:color="@color/GM2_grey_300" />
</shape>
diff --git a/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml b/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml
new file mode 100644
index 0000000..2f8f11d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2021, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <group>
+ <clip-path
+ android:pathData="M2.15,1.54h20v21h-20z"/>
+ <path
+ android:pathData="M19,21.83H5.35a3.19,3.19 0,0 1,-3.2 -3.19v-7A3.19,3.19 0,0 1,5.35 8.5H19a3.19,3.19 0,0 1,3.19 3.19v7A3.19,3.19 0,0 1,19 21.83ZM5.35,10.44A1.25,1.25 0,0 0,4.1 11.69v7a1.25,1.25 0,0 0,1.25 1.24H19a1.25,1.25 0,0 0,1.25 -1.24v-7A1.25,1.25 0,0 0,19 10.44Z"
+ android:fillColor="#FF000000" />
+ <path
+ android:pathData="M4.7,10.16 L4.21,8.57 16,5a3.56,3.56 0,0 1,3.1 0.25c1,0.67 1.65,2 1.89,4l-1.66,0.2C19.12,8 18.72,7 18.15,6.62a2,2 0,0 0,-1.7 0Z"
+ android:fillColor="#FF000000" />
+ <path
+ android:pathData="M4.43,10.47l-1,-1.34 7.31,-5.44c3,-1.86 5.51,1 6.33,2L15.82,6.77c-2.1,-2.44 -3.23,-2.26 -4.14,-1.7Z"
+ android:fillColor="#FF000000" />
+ </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/notification_guts_bg.xml b/packages/SystemUI/res/drawable/notification_guts_bg.xml
index d626878..bd9394b 100644
--- a/packages/SystemUI/res/drawable/notification_guts_bg.xml
+++ b/packages/SystemUI/res/drawable/notification_guts_bg.xml
@@ -15,8 +15,9 @@
~ limitations under the License
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="?android:attr/colorBackground" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+ <solid android:color="?androidprv:attr/colorSurface" />
<!--The radius is 1dp smaller than the notification one, to avoid aliasing bugs on the corners -->
<corners android:radius="1dp" />
</shape>
diff --git a/packages/SystemUI/res/drawable/notification_material_bg.xml b/packages/SystemUI/res/drawable/notification_material_bg.xml
index 1e9be2f..085263a 100644
--- a/packages/SystemUI/res/drawable/notification_material_bg.xml
+++ b/packages/SystemUI/res/drawable/notification_material_bg.xml
@@ -16,10 +16,11 @@
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:color="@color/notification_ripple_untinted_color">
<item>
<shape>
- <solid android:color="?android:attr/colorBackground" />
+ <solid android:color="?androidprv:attr/colorSurface" />
</shape>
</item>
</ripple>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_background_primary.xml b/packages/SystemUI/res/drawable/qs_background_primary.xml
index 0a3afc5..30d026e 100644
--- a/packages/SystemUI/res/drawable/qs_background_primary.xml
+++ b/packages/SystemUI/res/drawable/qs_background_primary.xml
@@ -16,7 +16,7 @@
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
- <solid android:color="?android:attr/colorBackground"/>
+ <solid android:color="?attr/underSurfaceColor"/>
<corners android:radius="@dimen/notification_corner_radius" />
</shape>
</inset>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_customize_tile_decoration.xml b/packages/SystemUI/res/drawable/qs_customize_tile_decoration.xml
index f086cec..1124a92 100644
--- a/packages/SystemUI/res/drawable/qs_customize_tile_decoration.xml
+++ b/packages/SystemUI/res/drawable/qs_customize_tile_decoration.xml
@@ -14,4 +14,4 @@
limitations under the License.
-->
<color xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/qs_customize_decoration"/>
\ No newline at end of file
+ android:color="?android:attr/colorBackground"/>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml
index c2d0841..ea0aafd 100644
--- a/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml
+++ b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml
@@ -15,7 +15,7 @@
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
- <solid android:color="?android:attr/colorBackgroundFloating"/>
+ <solid android:color="?attr/underSurfaceColor"/>
<corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
</inset>
diff --git a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
index 4165830..ef950fe 100644
--- a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
+++ b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
@@ -15,6 +15,6 @@
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
- <solid android:color="?android:attr/colorBackgroundFloating"/>
+ <solid android:color="?attr/underSurfaceColor"/>
</shape>
</inset>
diff --git a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml b/packages/SystemUI/res/drawable/qs_dialog_bg.xml
similarity index 91%
rename from packages/SystemUI/res/drawable/privacy_dialog_bg.xml
rename to packages/SystemUI/res/drawable/qs_dialog_bg.xml
index 96136c4..b307781 100644
--- a/packages/SystemUI/res/drawable/privacy_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/qs_dialog_bg.xml
@@ -18,5 +18,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?android:attr/colorBackground" />
- <corners android:radius="@dimen/ongoing_appops_dialog_bg_corner_radius" />
+ <corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/wallet_button.xml b/packages/SystemUI/res/drawable/wallet_action_button_bg.xml
similarity index 100%
rename from packages/SystemUI/res/drawable/wallet_button.xml
rename to packages/SystemUI/res/drawable/wallet_action_button_bg.xml
diff --git a/packages/SystemUI/res/drawable/wallet_app_button_bg.xml b/packages/SystemUI/res/drawable/wallet_app_button_bg.xml
new file mode 100644
index 0000000..1136b9d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/wallet_app_button_bg.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">
+ <item>
+ <shape android:shape="rectangle">
+ <stroke android:width="1dp" android:color="@color/GM2_grey_300"/>
+ <solid android:color="@android:color/transparent"/>
+ <corners android:radius="24dp"/>
+ </shape>
+ </item>
+</selector>
diff --git a/packages/SystemUI/res/drawable/wallet_lockscreen_bg.xml b/packages/SystemUI/res/drawable/wallet_lockscreen_bg.xml
new file mode 100644
index 0000000..1535e72
--- /dev/null
+++ b/packages/SystemUI/res/drawable/wallet_lockscreen_bg.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2021, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<ripple
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:color="?android:attr/textColorPrimary">
+ <item>
+ <shape
+ android:shape="oval">
+ <solid android:color="?androidprv:attr/colorSurface"/>
+ <size
+ android:width="@dimen/keyguard_affordance_width"
+ android:height="@dimen/keyguard_affordance_height"/>
+ </shape>
+ </item>
+</ripple>
+
diff --git a/packages/SystemUI/res/drawable/wireless_charging.xml b/packages/SystemUI/res/drawable/wireless_charging.xml
deleted file mode 100644
index 0bf633a..0000000
--- a/packages/SystemUI/res/drawable/wireless_charging.xml
+++ /dev/null
@@ -1,300 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="wireless_charging"
- android:width="200dp"
- android:viewportWidth="200"
- android:height="200dp"
- android:viewportHeight="200" >
- <group
- android:name="null_1"
- android:translateX="100"
- android:translateY="100" >
- <group
- android:name="dot_01" >
- <group
- android:name="dot_01_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_1" >
- <path
- android:name="ellipse_path_1"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_02"
- android:rotation="20" >
- <group
- android:name="dot_02_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_2" >
- <path
- android:name="ellipse_path_2"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_03"
- android:rotation="40" >
- <group
- android:name="dot_03_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_3" >
- <path
- android:name="ellipse_path_3"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_04"
- android:rotation="60" >
- <group
- android:name="dot_04_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_4" >
- <path
- android:name="ellipse_path_4"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_05"
- android:rotation="80" >
- <group
- android:name="dot_05_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_5" >
- <path
- android:name="ellipse_path_5"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_06"
- android:rotation="100" >
- <group
- android:name="dot_06_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_6" >
- <path
- android:name="ellipse_path_6"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_07"
- android:rotation="120" >
- <group
- android:name="dot_07_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_7" >
- <path
- android:name="ellipse_path_7"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_08"
- android:rotation="140" >
- <group
- android:name="dot_08_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_8" >
- <path
- android:name="ellipse_path_8"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_09"
- android:rotation="160" >
- <group
- android:name="dot_09_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_9" >
- <path
- android:name="ellipse_path_9"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_10"
- android:rotation="180" >
- <group
- android:name="dot_10_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_10" >
- <path
- android:name="ellipse_path_10"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_11"
- android:rotation="200" >
- <group
- android:name="dot_11_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_11" >
- <path
- android:name="ellipse_path_11"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_12"
- android:rotation="220" >
- <group
- android:name="dot_12_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_12" >
- <path
- android:name="ellipse_path_12"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_13"
- android:rotation="240" >
- <group
- android:name="dot_13_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_13" >
- <path
- android:name="ellipse_path_13"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_14"
- android:rotation="260" >
- <group
- android:name="dot_14_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_14" >
- <path
- android:name="ellipse_path_14"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_15"
- android:rotation="280" >
- <group
- android:name="dot_15_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_15" >
- <path
- android:name="ellipse_path_15"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_16"
- android:rotation="300" >
- <group
- android:name="dot_16_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_16" >
- <path
- android:name="ellipse_path_16"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_17"
- android:rotation="320" >
- <group
- android:name="dot_17_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_17" >
- <path
- android:name="ellipse_path_17"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="dot_18"
- android:rotation="340" >
- <group
- android:name="dot_18_pivot"
- android:translateY="-25" >
- <group
- android:name="ellipse_18" >
- <path
- android:name="ellipse_path_18"
- android:fillColor="?attr/chargingAnimColor"
- android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/wireless_charging_animation.xml b/packages/SystemUI/res/drawable/wireless_charging_animation.xml
deleted file mode 100644
index 4cf13b1..0000000
--- a/packages/SystemUI/res/drawable/wireless_charging_animation.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/wireless_charging" >
- <target
- android:name="null_1"
- android:animation="@anim/wireless_charging_null_1_animation" />
- <target
- android:name="dot_01_pivot"
- android:animation="@anim/wireless_charging__dot_01_pivot_animation" />
- <target
- android:name="ellipse_path_1"
- android:animation="@anim/wireless_charging_ellipse_path_1_animation" />
- <target
- android:name="dot_02_pivot"
- android:animation="@anim/wireless_charging__dot_02_pivot_animation" />
- <target
- android:name="ellipse_path_2"
- android:animation="@anim/wireless_charging_ellipse_path_2_animation" />
- <target
- android:name="dot_03_pivot"
- android:animation="@anim/wireless_charging__dot_03_pivot_animation" />
- <target
- android:name="ellipse_path_3"
- android:animation="@anim/wireless_charging_ellipse_path_3_animation" />
- <target
- android:name="dot_04_pivot"
- android:animation="@anim/wireless_charging__dot_04_pivot_animation" />
- <target
- android:name="ellipse_path_4"
- android:animation="@anim/wireless_charging_ellipse_path_4_animation" />
- <target
- android:name="dot_05_pivot"
- android:animation="@anim/wireless_charging__dot_05_pivot_animation" />
- <target
- android:name="ellipse_path_5"
- android:animation="@anim/wireless_charging_ellipse_path_5_animation" />
- <target
- android:name="dot_06_pivot"
- android:animation="@anim/wireless_charging__dot_06_pivot_animation" />
- <target
- android:name="ellipse_path_6"
- android:animation="@anim/wireless_charging_ellipse_path_6_animation" />
- <target
- android:name="dot_07_pivot"
- android:animation="@anim/wireless_charging__dot_07_pivot_animation" />
- <target
- android:name="ellipse_path_7"
- android:animation="@anim/wireless_charging_ellipse_path_7_animation" />
- <target
- android:name="dot_08_pivot"
- android:animation="@anim/wireless_charging__dot_08_pivot_animation" />
- <target
- android:name="ellipse_path_8"
- android:animation="@anim/wireless_charging_ellipse_path_8_animation" />
- <target
- android:name="dot_09_pivot"
- android:animation="@anim/wireless_charging__dot_09_pivot_animation" />
- <target
- android:name="ellipse_path_9"
- android:animation="@anim/wireless_charging_ellipse_path_9_animation" />
- <target
- android:name="dot_10_pivot"
- android:animation="@anim/wireless_charging__dot_10_pivot_animation" />
- <target
- android:name="ellipse_path_10"
- android:animation="@anim/wireless_charging_ellipse_path_10_animation" />
- <target
- android:name="dot_11_pivot"
- android:animation="@anim/wireless_charging__dot_11_pivot_animation" />
- <target
- android:name="ellipse_path_11"
- android:animation="@anim/wireless_charging_ellipse_path_11_animation" />
- <target
- android:name="dot_12_pivot"
- android:animation="@anim/wireless_charging__dot_12_pivot_animation" />
- <target
- android:name="ellipse_path_12"
- android:animation="@anim/wireless_charging_ellipse_path_12_animation" />
- <target
- android:name="dot_13_pivot"
- android:animation="@anim/wireless_charging__dot_13_pivot_animation" />
- <target
- android:name="ellipse_path_13"
- android:animation="@anim/wireless_charging_ellipse_path_13_animation" />
- <target
- android:name="dot_14_pivot"
- android:animation="@anim/wireless_charging__dot_14_pivot_animation" />
- <target
- android:name="ellipse_path_14"
- android:animation="@anim/wireless_charging_ellipse_path_14_animation" />
- <target
- android:name="dot_15_pivot"
- android:animation="@anim/wireless_charging__dot_15_pivot_animation" />
- <target
- android:name="ellipse_path_15"
- android:animation="@anim/wireless_charging_ellipse_path_15_animation" />
- <target
- android:name="dot_16_pivot"
- android:animation="@anim/wireless_charging__dot_16_pivot_animation" />
- <target
- android:name="ellipse_path_16"
- android:animation="@anim/wireless_charging_ellipse_path_16_animation" />
- <target
- android:name="dot_17_pivot"
- android:animation="@anim/wireless_charging__dot_17_pivot_animation" />
- <target
- android:name="ellipse_path_17"
- android:animation="@anim/wireless_charging_ellipse_path_17_animation" />
- <target
- android:name="dot_18_pivot"
- android:animation="@anim/wireless_charging__dot_18_pivot_animation" />
- <target
- android:name="ellipse_path_18"
- android:animation="@anim/wireless_charging_ellipse_path_18_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/layout/brightness_mirror.xml b/packages/SystemUI/res/layout/brightness_mirror.xml
index 8b47ab9..b714767 100644
--- a/packages/SystemUI/res/layout/brightness_mirror.xml
+++ b/packages/SystemUI/res/layout/brightness_mirror.xml
@@ -16,6 +16,7 @@
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:id="@+id/brightness_mirror"
android:layout_width="@dimen/qs_panel_width"
android:layout_height="@dimen/brightness_mirror_height"
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
index cf9de5e..69d73c1 100644
--- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml
+++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
@@ -90,9 +90,11 @@
android:layout_width="@dimen/keyguard_affordance_width"
android:layout_gravity="bottom|end"
android:scaleType="center"
- android:tint="?attr/wallpaperTextColor"
- android:layout_marginStart="24dp"
- android:layout_marginBottom="48dp"
+ android:tint="?android:attr/textColorPrimary"
+ android:src="@drawable/ic_wallet_lockscreen"
+ android:background="@drawable/wallet_lockscreen_bg"
+ android:layout_marginEnd="@dimen/keyguard_affordance_horizontal_offset"
+ android:layout_marginBottom="@dimen/keyguard_affordance_vertical_offset"
android:visibility="gone" />
<FrameLayout
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index e775de2..fb783a7 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -71,6 +71,7 @@
android:layout_height="0px"
android:paddingTop="8dp"
android:paddingBottom="42dp"
+ android:visibility="gone"
app:layout_constrainedHeight="true"
app:layout_constrainedWidth="true"
app:layout_constraintTop_toTopOf="@id/preview"
diff --git a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
new file mode 100644
index 0000000..7e944162
--- /dev/null
+++ b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<!-- Layout for media recommendations inside QSPanel carousel -->
+<com.android.systemui.util.animation.TransitionLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/media_recommendations"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:forceHasOverlappingRendering="false"
+ android:background="@drawable/qs_media_background">
+
+ <ImageView
+ android:id="@+id/media_cover1"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ android:adjustViewBounds="true"
+ android:background="@drawable/bg_smartspace_media_item"
+ android:clipToOutline="true"
+ android:scaleType="centerCrop"/>
+
+ <ImageView
+ android:id="@+id/media_logo1"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size" />
+
+ <ImageView
+ android:id="@+id/media_cover2"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ android:adjustViewBounds="true"
+ android:background="@drawable/bg_smartspace_media_item"
+ android:clipToOutline="true"
+ android:scaleType="centerCrop"/>
+
+ <ImageView
+ android:id="@+id/media_logo2"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size" />
+
+ <ImageView
+ android:id="@+id/media_cover3"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ android:adjustViewBounds="true"
+ android:background="@drawable/bg_smartspace_media_item"
+ android:clipToOutline="true"
+ android:scaleType="centerCrop"/>
+
+ <ImageView
+ android:id="@+id/media_logo3"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size" />
+
+ <ImageView
+ android:id="@+id/media_cover4"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ android:adjustViewBounds="true"
+ android:background="@drawable/bg_smartspace_media_item"
+ android:clipToOutline="true"
+ android:scaleType="centerCrop"/>
+
+ <ImageView
+ android:id="@+id/media_logo4"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size" />
+
+</com.android.systemui.util.animation.TransitionLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_space_placeholder_layout.xml b/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
index 3ced1ff..b85d6b0 100644
--- a/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
+++ b/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
@@ -14,6 +14,7 @@
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
diff --git a/packages/SystemUI/res/layout/people_tile_large_empty.xml b/packages/SystemUI/res/layout/people_tile_large_empty.xml
index 1e00307..69e2770 100644
--- a/packages/SystemUI/res/layout/people_tile_large_empty.xml
+++ b/packages/SystemUI/res/layout/people_tile_large_empty.xml
@@ -14,6 +14,7 @@
~ limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/packages/SystemUI/res/layout/people_tile_large_with_content.xml b/packages/SystemUI/res/layout/people_tile_large_with_content.xml
index 9990244..af2c5de 100644
--- a/packages/SystemUI/res/layout/people_tile_large_with_content.xml
+++ b/packages/SystemUI/res/layout/people_tile_large_with_content.xml
@@ -14,6 +14,7 @@
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:id="@+id/item"
android:background="@drawable/people_space_tile_view_card"
android:layout_width="match_parent"
@@ -90,6 +91,7 @@
<ImageView
android:id="@+id/predefined_icon"
+ android:tint="?android:attr/colorAccent"
android:gravity="start|center_vertical"
android:paddingEnd="6dp"
android:layout_width="24dp"
diff --git a/packages/SystemUI/res/layout/people_tile_medium_empty.xml b/packages/SystemUI/res/layout/people_tile_medium_empty.xml
index c35787e..7d9cbb9 100644
--- a/packages/SystemUI/res/layout/people_tile_medium_empty.xml
+++ b/packages/SystemUI/res/layout/people_tile_medium_empty.xml
@@ -15,6 +15,7 @@
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
diff --git a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
index db1d46d..c9e4945 100644
--- a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
+++ b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
@@ -16,6 +16,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -129,6 +130,7 @@
/>
<ImageView
android:id="@+id/predefined_icon"
+ android:tint="?android:attr/colorAccent"
android:gravity="end|center_vertical"
android:paddingStart="6dp"
android:layout_width="24dp"
diff --git a/packages/SystemUI/res/layout/people_tile_small.xml b/packages/SystemUI/res/layout/people_tile_small.xml
index f0ab187..34aa8e4 100644
--- a/packages/SystemUI/res/layout/people_tile_small.xml
+++ b/packages/SystemUI/res/layout/people_tile_small.xml
@@ -14,6 +14,7 @@
~ limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -38,6 +39,7 @@
<ImageView
android:id="@+id/predefined_icon"
+ android:tint="?android:attr/colorAccent"
android:layout_gravity="center"
android:layout_width="18dp"
android:layout_height="22dp"
diff --git a/packages/SystemUI/res/layout/privacy_dialog.xml b/packages/SystemUI/res/layout/privacy_dialog.xml
index 4d77a0d..720ae8db 100644
--- a/packages/SystemUI/res/layout/privacy_dialog.xml
+++ b/packages/SystemUI/res/layout/privacy_dialog.xml
@@ -28,7 +28,7 @@
android:paddingRight="@dimen/ongoing_appops_dialog_side_padding"
android:paddingBottom="12dp"
android:paddingTop="8dp"
- android:background="@drawable/privacy_dialog_bg"
+ android:background="@drawable/qs_dialog_bg"
/>
<!-- 12dp padding bottom so there's 20dp total under the icon -->
<!-- 8dp padding top, as there's 4dp margin in each row -->
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/privacy_dialog_item.xml b/packages/SystemUI/res/layout/privacy_dialog_item.xml
index 91ffe22..0c8ed9f 100644
--- a/packages/SystemUI/res/layout/privacy_dialog_item.xml
+++ b/packages/SystemUI/res/layout/privacy_dialog_item.xml
@@ -51,6 +51,7 @@
/>
<ImageView
+ android:id="@+id/chevron"
android:layout_height="24dp"
android:layout_width="24dp"
android:layout_gravity="center_vertical"
diff --git a/packages/SystemUI/res/layout/wallet_fullscreen.xml b/packages/SystemUI/res/layout/wallet_fullscreen.xml
index dc67848..b47c2f2 100644
--- a/packages/SystemUI/res/layout/wallet_fullscreen.xml
+++ b/packages/SystemUI/res/layout/wallet_fullscreen.xml
@@ -23,7 +23,7 @@
android:id="@+id/card_carousel_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginTop="36dp"
+ android:layout_marginTop="48dp"
android:orientation="vertical">
<ImageView
android:id="@+id/icon"
@@ -31,7 +31,6 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="10dp"
- android:background="@drawable/circle_wallet_primary_50dp"
android:scaleType="center"
android:contentDescription="@null"/>
<TextView
@@ -50,22 +49,36 @@
android:clipToPadding="false"
android:layout_marginVertical="24dp"/>
+ <Button
+ android:id="@+id/wallet_action_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginVertical="16dp"
+ android:paddingVertical="@dimen/wallet_button_vertical_padding"
+ android:paddingHorizontal="@dimen/wallet_button_horizontal_padding"
+ android:background="@drawable/wallet_action_button_bg"
+ android:textColor="@color/wallet_white"
+ android:textAlignment="center"
+ android:visibility="gone"/>
+
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
- android:id="@+id/wallet_button"
- android:background="@drawable/wallet_button"
- android:textColor="@color/wallet_white"
- android:textAlignment="center"
+ android:id="@+id/wallet_app_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingHorizontal="24dp"
- android:paddingVertical="8dp"
- android:layout_marginVertical="24dp"
- android:layout_gravity="center_horizontal"/>
+ android:layout_gravity="center_horizontal"
+ android:paddingVertical="@dimen/wallet_button_vertical_padding"
+ android:paddingHorizontal="@dimen/wallet_button_horizontal_padding"
+ android:background="@drawable/wallet_app_button_bg"
+ android:text="@string/wallet_app_button_label"
+ android:textColor="@color/GM2_blue_600"
+ android:textAlignment="center"
+ android:layout_marginVertical="24dp"/>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/wireless_charging_layout.xml b/packages/SystemUI/res/layout/wireless_charging_layout.xml
index d82151d..1312b41 100644
--- a/packages/SystemUI/res/layout/wireless_charging_layout.xml
+++ b/packages/SystemUI/res/layout/wireless_charging_layout.xml
@@ -27,14 +27,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- <!-- Circle animation -->
- <ImageView
- android:id="@+id/wireless_charging_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@drawable/wireless_charging_animation"/>
-
<!-- Text inside circle -->
<LinearLayout
android:id="@+id/wireless_charging_text_layout"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 0e9b683..13367c9 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Maak toe"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Raak die vingerafdruksensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Vingerafdrukikoon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kan nie gesig herken nie. Gebruik eerder vingerafdruk."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Gebruik jou vingerafdruk om voort te gaan"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Kan nie vingerafdruk herken nie. Gebruik eerder skermslot."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Soek tans vir jou …"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Gesig-ikoon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Versoenbaarheid-zoem se knoppie."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
<string name="wallet_title" msgid="5369767670735827105">"Beursie"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Gereed"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Wys alles"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Ontsluit om te betaal"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Gereed"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Stel betaling op"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ontsluit om te gebruik"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Kon nie jou kaarte kry nie; probeer later weer"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Voeg teël by"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Gedegradeer na Stil"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Hoër gegradeer"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Laer gegradeer"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wys boaan die gespreksafdeling, verskyn as \'n swewende borrel, wys profielfoto op sluitskerm"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Word altyd boaan jou kennisgewings gewys, selfs wanneer Prioriteitmodus aan is"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Prioriteitgesprekke"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekskenmerke nie"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Hierdie groep kennisgewings kan nie hier opgestel word nie"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Gesprek is as prioriteit gestel"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioriteitgesprekke sal:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Boaan gespreksafdeling wys"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profielprent op slotskerm wys"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Verskyn as \'n swewende borrel bo-oor programme"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Prioriteitgesprekke"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Hierdie gesprekke word boaan jou lys gewys en kan jou altyd bereik wanneer Prioriteitmodus aan is"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profielfoto\'s word op die sluitskerm gewys"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Jy kan hierdie gesprekke maklik in borrels op jou Tuisskerm kry"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreek Moenie Steur Nie"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Het dit"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellings"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Wissel"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Toeganklikheidknoppie het die toeganklikheidgebaar vervang\n\n"<annotation id="link">"Bekyk instellings"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Skuif knoppie na kant om dit tydelik te versteek"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Beweeg na links bo"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Beweeg na regs bo"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Beweeg na links onder"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Beweeg na regs onder"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Beweeg na rand en versteek"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Beweeg weg van rand en wys"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Toestelkontroles"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg kontroles vir jou gekoppelde toestelle by"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Stel toestelkontroles op"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Maak gesprek oop"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Gespreklegstukke"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tik op \'n gesprek om dit by jou tuisskerm te voeg"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Kom kyk weer nadat jy \'n paar boodskappe gekry het"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriteitgesprekke"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Onlangse gesprekke"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Minder as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Meer as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
<string name="birthday_status" msgid="2596961629465396761">"Verjaarsdag"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Dit is <xliff:g id="NAME">%1$s</xliff:g> se verjaarsdag"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Verjaar binnekort"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Dit is binnekort <xliff:g id="NAME">%1$s</xliff:g> se verjaarsdag"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Herdenking"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Dit is <xliff:g id="NAME">%1$s</xliff:g> se herdenking"</string>
<string name="location_status" msgid="1294990572202541812">"Deel tans ligging"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> deel tans ligging"</string>
<string name="new_story_status" msgid="9012195158584846525">"Nuwe storie"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> het \'n nuwe storie gedeel"</string>
<string name="video_status" msgid="4548544654316843225">"Kyk tans"</string>
<string name="audio_status" msgid="4237055636967709208">"Luister tans"</string>
<string name="game_status" msgid="1340694320630973259">"Speel tans"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Vriende"</string>
<string name="empty_status" msgid="5938893404951307749">"Kom klets vanaand!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Inhoud sal binnekort verskyn"</string>
<string name="missed_call" msgid="4228016077700161689">"Gemiste oproep"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Sien onlangse boodskappe, gemiste oproepe en statusopdaterings"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> het \'n boodskap gestuur"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> het \'n prent gestuur"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kon nie jou batterymeter lees nie"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik vir meer inligting"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker nie"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 5d4853b..f378b4c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"አሰናብት"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"የጣት አሻራ ዳሳሹን ይንኩ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"የጣት አሻራ አዶ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"መልክን መለየት አልተቻለም። በምትኩ የጣት አሻራ ይጠቀሙ።"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ለመቀጠል የእርስዎን የጣት አሻራ ይጠቀሙ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"የጣት አሻራን መለየት አልተቻለም። በምትኩ የማያ ገጽ መቆለፊያ ይጠቀሙ።"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"እርስዎን በመፈለግ ላይ…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"የፊት አዶ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"የተኳኋኝአጉላ አዝራር።"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ኤተርኔት"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ማንቂያ"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"ዝግጁ"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"ሁሉንም አሳይ"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"ለመክፈል ይክፈቱ"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"ዝግጁ"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"ክፍያን ያዋቅሩ"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ለማየት ይክፈቱ"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"የእርስዎን ካርዶች ማግኘት ላይ ችግር ነበር፣ እባክዎ ቆይተው እንደገና ይሞክሩ"</string>
<string name="status_bar_work" msgid="5238641949837091056">"የስራ መገለጫ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"የአውሮፕላን ሁነታ"</string>
<string name="add_tile" msgid="6239678623873086686">"ሰቅ ያክሉ"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ሁኔታ:</b> ወደ ዝምታ ዝቅ ተደርጓል"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ሁኔታ:</b> ክፍተኛ ደረጃ ተሰጥቶታል"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ሁኔታ:</b> ዝቅተኛ ደረጃ ተሰጥቶታል"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"በውይይት ክፍል አናት ላይ ያሳያል፣ እንደ ተንሳፋፊ አረፋ ብቅ ይላል፣ በቆልፍ ማያ ገጽ ላይ የመገለጫ ሥዕልን ያሳያል"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"ቅድሚያ የሚሰጠው ሁነታ በሚበራበት ጊዜም ቢሆን ሁልጊዜ በማሳወቂያዎችዎ አናት ላይ ይታያል"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ቅንብሮች"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"ቅድሚያ የሚሰጣቸው ውይይቶች"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> የውይይት ባህሪያትን አይደግፍም"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ልወጣ ወደ ቅድሚያ ተቀናብሯል"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ቅድሚያ የሚሰጣቸው ልወጣዎች እነዚህን ያደርጋሉ፦"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"በውይይት ክፍል አናት ላይ አአሳይ"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"የመገለጫ ስዕልን በማያ ገጽ ቁልፍ ላይ አሳይ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"በመተግበሪያዎች ላይ እንደ ተንሳፋፊ አረፋ ሆኖ ይታያሉ"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"ቅድሚያ የሚሰጣቸው ውይይቶች"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"እነዚህ ውይይቶች በዝርዝሮችዎ አናት ላይ የሚታዩ ሲሆን ቅድሚያ የሚሰጠው ሁነታ ሲበራ ሁልጊዜ ሊደርሱዎት ይችላሉ"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"የመገለጫ ሥዕሎች በማያ ገጽ ቆልፉ ላይ ይታያሉ"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"እነዚህን ውይይቶች በመነሻ ማያ ገጽዎ ላይ በአረፋዎች ውስጥ በቀላሉ ማግኘት ይችላሉ"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"አትረብሽን አቋርጥ"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ገባኝ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ቅንብሮች"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ማብሪያ/ማጥፊያ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"የተደራሽነት አዝራር የተደራሽነት ምልክትን ተክቷል\n\n"<annotation id="link">" ቅንብሮችን አሳይ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ለጊዜው ለመደበቅ አዝራሩን ወደ ጠርዝ ያንቀሳቅሱ"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"ወደ ላይኛው ግራ አንቀሳቅስ"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"ወደ ላይኛው ቀኝ አንቀሳቅስ"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"የግርጌውን ግራ አንቀሳቅስ"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ታችኛውን ቀኝ አንቀሳቅስ"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ወደ ጠርዝ አንቀሳቅስ እና ደደብቅ"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ጠርዙን ወደ ውጭ አንቀሳቅስ እና አሳይ"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"የመሣሪያ መቆጣጠሪያዎች"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ለእርስዎ የተገናኙ መሣሪያዎች መቆጣጠሪያዎችን ያክሉ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"የመሣሪያ መቆጣጠሪያዎችን ያቀናብሩ"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"ውይይት ይክፈቱ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"የውይይት ምግብሮች"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"በመነሻ ማያ ገጽዎ ላይ ለማከል አንድ ውይይት መታ ያድርጉ"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"አንዳንድ መልዕክቶች ከደረሰዎት በኋላ እዚህ ተመልሰው ይፈትሹ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"የቅድሚያ ውይይቶች"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"የቅርብ ጊዜ ውይይቶች"</string>
+ <string name="okay" msgid="6490552955618608554">"እሺ"</string>
<string name="timestamp" msgid="6577851592534538533">"ከ<xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
<string name="birthday_status" msgid="2596961629465396761">"የልደት ቀን"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"የእሱ የ<xliff:g id="NAME">%1$s</xliff:g> የልደት ቀን"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"የልደት ቀን በቅርቡ"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"በቅርቡ የእሱ የ<xliff:g id="NAME">%1$s</xliff:g> የልደት ቀን ነው"</string>
<string name="anniversary_status" msgid="1790034157507590838">"ዓመታዊ በዓል"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"የእሱ የ<xliff:g id="NAME">%1$s</xliff:g> ዓመታዊ ክብረ በዓል"</string>
<string name="location_status" msgid="1294990572202541812">"አካባቢን በማጋራት ላይ"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> አካባቢን እያጋራ ነው"</string>
<string name="new_story_status" msgid="9012195158584846525">"አዲስ ዘገባ"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> አዲስ ታሪክ አጋርቷል"</string>
<string name="video_status" msgid="4548544654316843225">"በመመልከት ላይ"</string>
<string name="audio_status" msgid="4237055636967709208">"በማዳመጥ ላይ"</string>
<string name="game_status" msgid="1340694320630973259">"በመጫወት ላይ"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ጓደኞች"</string>
<string name="empty_status" msgid="5938893404951307749">"ዛሬ ማታ እንወያይ!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"ይዘቱ በቅርቡ ይታያል"</string>
<string name="missed_call" msgid="4228016077700161689">"ያመለጠ ጥሪ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"የቅርብ ጊዜ መልዕክቶችን፣ ያመለጡ ጥሪዎች እና፣ የሁኔታ ዝመናዎችን ይመልከቱ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ውይይት"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> መልዕክት ልኳል"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ምስል ልኳል"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"የባትሪ መለኪያዎን የማንበብ ችግር"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ለበለጠ መረጃ መታ ያድርጉ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ምንም ማንቂያ አልተቀናበረም"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 5c7cf3b..475a28b 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"إغلاق"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"المس زر استشعار بصمة الإصبع"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"رمز بصمة الإصبع"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"يتعذّر التعرّف على الوجه. استخدِم بصمة الإصبع بدلاً من ذلك."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"عليك استخدام بصمة الإصبع للمتابعة."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"يتعذّر التعرّف على بصمة الإصبع. عليك استخدام قفل الشاشة بدلاً من ذلك."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"جارٍ البحث عن وجهك…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"رمز الوجه"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"زر تكبير/تصغير للتوافق."</string>
@@ -676,7 +673,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"جاهزة"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"الملف الشخصي للعمل"</string>
@@ -747,9 +749,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>الحالة:</b> تم خفض الترتيب إلى الوضع صامت"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>الحالة:</b> تمت زيادة الترتيب"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>الحالة:</b> تم خفض الترتيب"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"تظهر في أعلى قسم المحادثات وتظهر كفقاعة عائمة وتعرض صورة الملف الشخصي على شاشة القفل"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> ميزات المحادثات."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"يتعذّر ضبط مجموعة الإشعارات هذه هنا."</string>
@@ -1031,10 +1035,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"تم ضبط المحادثة على أنها ذات أولوية"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"المحادثات ذات الأولوية:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"تظهر في أعلى قسم المحادثات"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"تظهر صورة الملف الشخصي على شاشة القفل"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"تظهر كفقاعة عائمة فوق التطبيقات"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"لا تتقيّد بميزة \"عدم الإزعاج\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"حسنًا"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"الإعدادات"</string>
@@ -1052,6 +1060,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"تبديل"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"تم استبدال \"زر أدوات تسهيل الاستخدام\" بإيماءة تسهيل الاستخدام.\n\n"<annotation id="link">"الاطّلاع على الإعدادات"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"يمكنك نقل الزر إلى الحافة لإخفائه مؤقتًا."</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"أدوات التحكم بالأجهزة"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"إضافة عناصر تحكّم لأجهزتك المتصلة"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"إعداد أدوات التحكم بالجهاز"</string>
@@ -1126,31 +1146,43 @@
<string name="basic_status" msgid="2315371112182658176">"محادثة مفتوحة"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"أدوات المحادثة"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"انقر على محادثة لإضافتها إلى \"الشاشة الرئيسية\"."</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"يمكنك الرجوع إلى هذه الأداة عندما تتلقّى بعض الرسائل."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"المحادثات ذات الأولوية"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"المحادثات الأخيرة"</string>
+ <string name="okay" msgid="6490552955618608554">"حسنًا"</string>
<string name="timestamp" msgid="6577851592534538533">"قبل <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"قبل أقل من <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"قبل أكثر <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"تاريخ الميلاد"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"تاريخ ميلاد قريب"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"الذكرى السنوية"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"تتم مشاركة الموقع الجغرافي"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"قصة جديدة"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"جارٍ المشاهدة"</string>
<string name="audio_status" msgid="4237055636967709208">"يتم الاستماع الآن"</string>
<string name="game_status" msgid="1340694320630973259">"جارٍ اللعب"</string>
<string name="empty_user_name" msgid="3389155775773578300">"الأصدقاء"</string>
<string name="empty_status" msgid="5938893404951307749">"لنجرِ محادثة الليلة."</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"مكالمة فائتة"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"عرض أحدث الرسائل والمكلمات الفائتة وآخر أخبار الحالة"</string>
<string name="people_tile_title" msgid="6589377493334871272">"محادثة"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"انقر للحصول على مزيد من المعلومات."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه."</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index d9a8c6a..138c227 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"অগ্ৰাহ্য কৰক"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখাৱয়ব চিনিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক।"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰি। তাৰ সলনি স্ক্ৰীন লক ব্যৱহাৰ কৰক।"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"মুখমণ্ডলৰ আইকন"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"উপযোগিতা অনুসৰি জুম কৰা বুটাম।"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"সাজু"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>স্থিতি:</b> নীৰৱলৈ হ্ৰাস কৰা হৈছে"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>স্থিতি:</b> স্থান ওপৰলৈ কৰা হৈছে"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>স্থিতি:</b> স্থান তললৈ কৰা হৈছে"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায়, ওপঙা বাবল হিচাপে দেখা পোৱা যায়, লক স্ক্ৰীনত প্ৰ’ফাইলৰ চিত্ৰ প্ৰদৰ্শন কৰে"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"বাৰ্তালাপসমূহ অগ্ৰাধিকাৰপ্ৰাপ্ত হিচাপে ছেট কৰা হৈছে"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"অগ্ৰাধিকাৰপ্ৰাপ্ত বাৰ্তালাপসমূহে এইসমূহ কৰিব:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱাওক"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্ৰীনত প্ৰ\'ফাইল-চিত্ৰ দেখুৱাওক"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"এপ্সমূহৰ ওপৰত ওপঙা বাবল হিচাপে দেখা পোৱা যাব"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"অসুবিধা নিদিব সুবিধাটোত ব্যাঘাত জন্মাওক"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুজি পালোঁ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ছেটিংসমূহ"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ছুইচ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"সাধ্য সুবিধাৰ বুটামটোৱে সাধ্য সুবিধাৰ নিৰ্দেশ সলনি কৰিছে\n\n"<annotation id="link">"ছেটিং চাওক"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"বুটামটোক সাময়িকভাৱে লুকুৱাবলৈ ইয়াক একেবাৰে কাষলৈ লৈ যাওক"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"আপোনাৰ সংযোজিত ডিভাইচসমূহৰ বাবে নিয়ন্ত্ৰণসমূহ যোগ কৰক"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ ছেট আপ কৰক"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"বাৰ্তালাপ খোলক"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"বাৰ্তালাপ ৱিজেট"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"আপোনাৰ গৃহ স্ক্ৰীনত কোনো বাৰ্তালাপ যোগ দিবলৈ সেইটোত টিপক"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"আপুনি কিবা বাৰ্তা পোৱাৰ পাছত ইয়াত পুনৰ চাওক"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"অগ্ৰাধিকাৰপ্ৰাপ্ত বাৰ্তালাপ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"শেহতীয়া বাৰ্তালাপ"</string>
+ <string name="okay" msgid="6490552955618608554">"ঠিক আছে"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> পূৰ্বে"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ কম সময়ৰ পূৰ্বে"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ বেছি সময়ৰ পূৰ্বে"</string>
<string name="birthday_status" msgid="2596961629465396761">"জন্মদিন"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"জন্মদিন সোনকালে আহি আছে"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"বৰ্ষপূৰ্তি"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"অৱস্থান শ্বেয়াৰ কৰি থকা হৈছে"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"নতুন কাহিনী"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"চাই আছোঁ"</string>
<string name="audio_status" msgid="4237055636967709208">"শুনি আছোঁ"</string>
<string name="game_status" msgid="1340694320630973259">"প্লে’ হৈ আছে"</string>
<string name="empty_user_name" msgid="3389155775773578300">"বন্ধুবৰ্গ"</string>
<string name="empty_status" msgid="5938893404951307749">"আজি ৰাতি চাট কৰোঁ আহক!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"মিছড্ কল"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"শেহতীয়া বাৰ্তা, মিছড্ কল আৰু স্থিতিৰ আপডে’ট চাওক"</string>
<string name="people_tile_title" msgid="6589377493334871272">"বাৰ্তালাপ"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"অধিক তথ্যৰ বাবে টিপক"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"কোনো এলাৰ্ম ছেট কৰা হোৱা নাই"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 75e8aa1..04e9ca0 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ötürün"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmaq izi sensoruna klikləyin"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Barmaq izi ikonası"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tanımaq olmur. Barmaq izini işlədin."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Davam etmək üçün barmaq izinizi istifadə edin"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Barmaq izini tanımaq olmur. Əvəzində ekran kilidindən istifadə edin."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Siz axtarılırsınız…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Üz işarəsi"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Uyğunluq zoom düyməsi."</string>
@@ -245,7 +242,7 @@
<string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Bildiriş uzaqlaşdırıldı."</string>
<string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bildiriş kölgəsi."</string>
<string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tez ayarlar."</string>
- <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekranı kilidləyin."</string>
+ <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilid ekranı."</string>
<string name="accessibility_desc_settings" msgid="6728577365389151969">"Ayarlar"</string>
<string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"İcmal"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekran kilidi"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Hazır"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"İş profili"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Səssiz rejimə keçirilib"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Yuxarı sıraya keçirilib"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Aşağı sıraya keçirilib"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Söhbət bölməsinin yuxarısında göstərilir, üzən qabarcıq kimi görünür, kilid ekranında profil şəkli göstərir"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbət funksiyalarını dəstəkləmir"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Söhbət prioritet olaraq ayarlanıb"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritet söhbətlər bunları edəcək:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Söhbət bölməsinin yuxarısında göstərilir"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilid ekranında profil şəkli göstərilir"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tətbiqlərin üzərində üzən qabarcıq kimi görünəcək"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Narahat Etməyin rejimində göstərilsin"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Dəyişdirici"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Əlçatımlılıq düyməsi əlçatımlılıq jestini əvəz etdi\n\n"<annotation id="link">"Ayarlara baxın"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Düyməni müvəqqəti gizlətmək üçün kənara çəkin"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz idarəetmələri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Qoşulmuş cihazlarınız üçün nizamlayıcılar əlavə edin"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz idarəetmələrini ayarlayın"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Açıq söhbət"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Söhbət vidcetləri"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Əsas ekranınıza əlavə etmək üçün söhbətə toxunun"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Mesaj gəldikdə yenidən buraya baxın"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritet söhbətlər"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Son söhbətlər"</string>
+ <string name="okay" msgid="6490552955618608554">"Oldu"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Maksimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Minimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
<string name="birthday_status" msgid="2596961629465396761">"Doğum günü"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Tezliklə doğum günü"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"İldönümü"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Məkan paylaşılır"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Yeni hekayə"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Baxır"</string>
<string name="audio_status" msgid="4237055636967709208">"Dinlənilir"</string>
<string name="game_status" msgid="1340694320630973259">"Oxudulur"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Dostlar"</string>
<string name="empty_status" msgid="5938893404951307749">"Bugün söhbət edək!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Buraxılmış zəng"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Son mesajlar, buraxılmış zənglər və status güncəlləmələrinə baxın"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Söhbət"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya ölçüsünü oxuyarkən problem yarandı"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ətraflı məlumat üçün toxunun"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Siqnal ayarlanmayıb"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 283d976..3feaa20 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Odbaci"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor za otisak prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona otiska prsta"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Lice nije prepoznato. Koristite otisak prsta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Nastavite pomoću otiska prsta"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Prepoznavanje otiska prsta nije uspelo. Koristite zaključavanje ekrana umesto toga."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Tražimo vas…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona lica"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Dugme Zum kompatibilnosti."</string>
@@ -667,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Poslovni profil"</string>
@@ -738,9 +740,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Degradirano u Nečujno"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Rangirano više"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Rangirano niže"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se u vrhu odeljka za konverzacije kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Podešavanja"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije konverzacije"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ova grupa obaveštenja ne može da se konfiguriše ovde"</string>
@@ -1016,10 +1020,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzacija je podešena na prioritetnu"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetne konverzacije:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"se prikazuju u vrhu odeljka za konverzacije"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"prikazuju sliku profila na zaključanom ekranu"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuju se plutajući oblačići preko aplikacija"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ometa podešavanje Ne uznemiravaj"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Važi"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Podešavanja"</string>
@@ -1037,6 +1045,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Pređi"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Dugme Pristupačnost je zamenilo pokret za pristupačnost\n\n"<annotation id="link">"Prikaži podešavanja"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Pomerite dugme do ivice da biste ga privremeno sakrili"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Podesite kontrole uređaja"</string>
@@ -1108,31 +1128,43 @@
<string name="basic_status" msgid="2315371112182658176">"Otvorite konverzaciju"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za konverzaciju"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite konverzaciju da biste je dodali na početni ekran"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vratite se ovde kada dobijete neku poruku"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritetne konverzacije"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nedavne konverzacije"</string>
+ <string name="okay" msgid="6490552955618608554">"Važi"</string>
<string name="timestamp" msgid="6577851592534538533">"Pre <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pre manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pre više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Rođendan"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Rođendan je uskoro"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Godišnjica"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Deli se lokacija"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nova priča"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Gleda se"</string>
<string name="audio_status" msgid="4237055636967709208">"Sluša se"</string>
<string name="game_status" msgid="1340694320630973259">"Igra se"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Prijatelji"</string>
<string name="empty_status" msgid="5938893404951307749">"Ćaskamo večeras!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Propušten poziv"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzacija"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem sa očitavanjem merača baterije"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm nije podešen"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 32b7578..51c67a1 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Адхіліць"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Дакраніцеся да сканера адбіткаў пальцаў"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Значок адбіткаў пальцаў"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Твар не распазнаны. Скарыстайце адбітак пальца."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Каб працягнуць, скарыстайце адбітак пальца"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Не ўдалося распазнаць адбітак пальца. Разблакіруйце экран іншым спосабам."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Ідзе пошук вашага твару…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Значок твару"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Кнопка сумяшчальнасці маштаба."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Гатова"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Працоўны профіль"</string>
@@ -741,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Стан:</b> Пераведзена ў рэжым \"Без гуку\""</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Стан:</b> Ацэнена як важнае"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Стан:</b> Ацэнена як няважнае"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў, як усплывальнае апавяшчэнне, паказвае фота профілю на экране блакіроўкі"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае функцыі размовы"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Тут канфігурыраваць гэту групу апавяшчэнняў забаронена"</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Размова пазначана як прыярытэтная"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Прыярытэтныя размовы:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Паказваюцца ўверсе раздзела размоў"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Паказваюць відарыс профілю на экране блакіроўкі"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Паказваюцца як рухомыя апавяшчэнні паверх праграм"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Паказваюцца ў рэжыме \"Не турбаваць\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Зразумела"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налады"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Пераключальнік"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Замест жэста спецыяльных магчымасцей будзе выкарыстоўвацца кнопка\n\n"<annotation id="link">"Праглядзець налады"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Каб часова схаваць кнопку, перамясціце яе на край"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Элементы кіравання прыладай"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Дадайце элементы кіравання для падключаных прылад"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Наладзіць элементы кіравання прыладай"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"Адкрытая размова"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Віджэты размовы"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Націсніце на размову, каб дадаць яе на галоўны экран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Вярніцеся сюды, калі з\'явяцца паведамленні"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Прыярытэтныя размовы"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Нядаўнія размовы"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Менш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Больш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
<string name="birthday_status" msgid="2596961629465396761">"Дзень нараджэння"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Хутка свята"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Гадавіна"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Абагульваецца месца"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Новая гісторыя"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Ідзе прагляд відэа"</string>
<string name="audio_status" msgid="4237055636967709208">"Гаварыце"</string>
<string name="game_status" msgid="1340694320630973259">"Ідзе гульня"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Сябры"</string>
<string name="empty_status" msgid="5938893404951307749">"Паразмаўляем у чаце!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Прапушчаны выклік"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Глядзець нядаўнія паведамленні, прапушчаныя выклікі і абнаўленні стану"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Размова"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Праблема з чытаннем індыкатара зараду акумулятара"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Націсніце, каб убачыць больш"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма будзільнікаў"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 31ae63f..bf8aaad 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Отхвърляне"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Докоснете сензора за отпечатъци"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Икона за отпечатък"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лицето не е разпознато. Използвайте отпечатък."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Използвайте отпечатъка си, за да продължите"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Отпечатъкът не може да бъде разпознат. Вместо това използвайте опция за заключване на екрана."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Търсим ви…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Икона на лице"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Бутон за промяна на мащаба с цел съвместимост."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Потребителски профил в Work"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Състояние:</b> Понижено до беззвучно"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Състояние:</b> Класирано по-високо"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Състояние:</b> Класирано по-ниско"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори, показва снимката на потр. профил на заключения екран"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа функциите за разговор"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Тази група от известия не може да бъде конфигурирана тук"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Разговорът е зададен като приоритетен"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приоритетните разговори ще:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"се показват върху секцията с разговори;"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"показват снимката на потребителския профил на заключения екран."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показва се като плаващо балонче върху приложенията"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекъсване на режима „Не безпокойте“"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Разбрах"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Превключване"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Жестът за достъпност бе заменен от бутон\n\n"<annotation id="link">"Преглед на настройките"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Преместете бутона до края, за да го скриете временно"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Контроли за устройството"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавяне на контроли за свързаните ви устройства"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройване на контролите за устройството"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Отворен разговор"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Приспособления за разговор"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Докоснете разговор, за да го добавите към началния си екран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Проверете отново тук, когато получите съобщения"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Разговори с приоритет"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Скорошни разговори"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Преди <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Преди по-малко от <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Преди повече от <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Рожден ден"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Предстоящ рожден ден"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Годишнина"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Местопол. се споделя"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Нова история"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Гледате"</string>
<string name="audio_status" msgid="4237055636967709208">"Слуша се"</string>
<string name="game_status" msgid="1340694320630973259">"Играете"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Приятели"</string>
<string name="empty_status" msgid="5938893404951307749">"Да разговаряме!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Пропуснато обаждане"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Над <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Преглеждайте скорошните съобщения, пропуснатите обаждания и актуална информация за състоянието"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Възникна проблем при четенето на данните за нивото на батерията"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Докоснете за още информация"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма зададен будилник"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 0e18e8f..a13381f 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"বাতিল করুন"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"আঙ্গুলের ছাপের আইকন"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখ শনাক্ত করতে পারছি না। পরিবর্তে আঙ্গুলের ছাপ ব্যবহার করুন।"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"চালিয়ে যেতে আঙ্গুলের ছাপ ব্যবহার করুন"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"আঙ্গুলের ছাপ শনাক্ত করতে পারছি না। পরিবর্তে স্ক্রিন লক ব্যবহার করুন।"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"আপনার জন্য খোঁজা হচ্ছে…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ফেস আইকন"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"সামঞ্জস্যের জুম বোতাম৷"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"তৈরি"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"কাজের প্রোফাইল"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>স্ট্যাটাস:</b> লেভেল কমিয়ে সাইলেন্ করা হয়েছে"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>স্ট্যাটাস:</b> র্যাঙ্ক বেড়ে গেছে"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>স্ট্যাটাস:</b> র্যাঙ্ক কমে গেছে"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"কথোপকথন বিভাগের উপরে ভাসমান বাবলের মতো দেখা যাবে, লক স্ক্রিনে প্রোফাইল ছবি দেখাবে"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এ কথোপকথন ফিচার কাজ করে না"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"কথোপকথনকে \'গুরুত্বপূর্ণ\' হিসেবে সেট করা হয়েছে"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"গুরুত্বপূর্ণ কথোপকথন:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"কথোপকথন বিভাগের একদম উপরে দেখুন"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্রিনে প্রোফাইল ছবি দেখান"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"অ্যাপের উপরে একটি ভাসমান বুদবুদ হিসেবে দেখা যাবে"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"বিরক্ত করবে না মোডে ব্যাঘাত ঘটাতে পারে"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুঝেছি"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"সেটিংস"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"বদল করুন"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"অ্যাক্সেসিবিলিটি জেসচার পরিবর্তন করে অ্যাক্সেসেবিলিটি বোতাম করা হয়েছে\n\n"<annotation id="link">"সেটিংস দেখুন"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"এটি অস্থায়ীভাবে লুকাতে বোতামটি কোণে সরান"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইস কন্ট্রোল"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"আপনার কানেক্ট করা ডিভাইসের জন্য কন্ট্রোল যোগ করুন"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ডিভাইস কন্ট্রোল সেট-আপ করুন"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"খোলা কথোপকথন"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"কথোপকথন উইজেট"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"কোনও কথোপথন আপনার হোম স্ক্রিনে যোগ করার জন্য এতে ট্যাপ করুন"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"কোনও মেসেজ পেলে আবার এখানে দেখুন"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"গুরুত্বপূর্ণ কথোপকথন"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"সাম্প্রতিক কথোপকথন"</string>
+ <string name="okay" msgid="6490552955618608554">"ঠিক আছে"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ঘণ্টা আগে"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> থেকে কিছু কম সময় আগে"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> সপ্তাহেরও আগে"</string>
<string name="birthday_status" msgid="2596961629465396761">"জন্মদিন"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"জন্মদিন শীঘ্রই আসছে"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"বার্ষিকী"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"লোকেশন শেয়ার করা হচ্ছে"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"নতুন খবর"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"দেখছি"</string>
<string name="audio_status" msgid="4237055636967709208">"অডিও শুনছি"</string>
<string name="game_status" msgid="1340694320630973259">"চালানো হচ্ছে"</string>
<string name="empty_user_name" msgid="3389155775773578300">"বন্ধু"</string>
<string name="empty_status" msgid="5938893404951307749">"আজ রাতে চ্যাট করা যাক!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"মিসড কল"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"সাম্প্রতিক মেসেজ, মিসড কল এবং স্ট্যাটাস সংক্রান্ত আপডেট দেখুন"</string>
<string name="people_tile_title" msgid="6589377493334871272">"কথোপকথন"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"আরও তথ্যের জন্য ট্যাপ করুন"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"কোনও অ্যালার্ম সেট করা নেই"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index c7820f4..4c5e917 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Odbaci"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor za otisak prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona za otisak prsta"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nije moguće prepoznati lice. Koristite otisak prsta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Nastavite pomoću otiska prsta"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Nije moguće prepoznati otisak prsta. Umjesto toga koristite zaključavanje ekrana."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Tražimo vas…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona lica"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string>
@@ -667,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil za posao"</string>
@@ -738,9 +740,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> je unazađen u Nečujno"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> je rangiran više"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> je rangiran niže"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se na vrhu odjeljka za razgovor, pojavljuje se kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetni"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije razgovora"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ovu grupu obavještenja nije moguće konfigurirati ovdje"</string>
@@ -1016,10 +1020,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Postavke da ažurirate navigiranje sistemom"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Razgovor je postavljen kao prioritetan"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetni razgovori će:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Biti prikazani na vrhu odjeljka za razgovor"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazivati sliku profila na zaključanom ekranu"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Izgleda kao plutajući oblačić iznad aplikacija"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida način rada Ne ometaj"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Razumijem"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string>
@@ -1037,6 +1045,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prekidač"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Dugme za pristupačnost je zamijenilo pokret za pristupačnost\n\n"<annotation id="link">"Prikaži postavke"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Premjestite dugme do ivice da ga privremeno sakrijete"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavite kontrole uređaja"</string>
@@ -1108,31 +1128,43 @@
<string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za razgovor"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da ga dodate na početni ekran"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vratite se ovdje kada dobijete neku poruku"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritetni razgovori"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nedavni razgovori"</string>
+ <string name="okay" msgid="6490552955618608554">"Uredu"</string>
<string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Rođendan"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Rođendan je uskoro"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Godišnjica"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Dijeljenje lokacije"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nova priča"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Gleda"</string>
<string name="audio_status" msgid="4237055636967709208">"Slušanje"</string>
<string name="game_status" msgid="1340694320630973259">"Reproduciranje"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Prijatelji"</string>
<string name="empty_status" msgid="5938893404951307749">"Chatajmo večeras!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Propušteni poziv"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pregledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Došlo je do problema prilikom očitavanja mjerača stanja baterije"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nije postavljen alarm"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 1546113..032986c 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ignora"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor d\'empremtes dactilars"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icona d\'empremta digital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No podem detectar la cara. Usa l\'empremta digital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Fes servir l\'empremta digital per continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"No es pot reconèixer l\'empremta digital. Utilitza el bloqueig de pantalla."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"S\'està cercant la teva cara…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icona facial"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botó de zoom de compatibilitat."</string>
@@ -545,10 +542,10 @@
<string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"Certificats de CA"</string>
<string name="disable_vpn" msgid="482685974985502922">"Desactiva la VPN"</string>
<string name="disconnect_vpn" msgid="26286850045344557">"Desconnecta la VPN"</string>
- <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Consulta les polítiques"</string>
+ <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Mostra les polítiques"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Mostra els controls"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"El dispositiu pertany a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nL\'administrador de TI pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu i la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador de TI."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"És possible que <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pugui canviar la configuració d\'aquest dispositiu, accedir a les dades que hi estiguin associades i gestionar les aplicacions.\n\nSi tens cap pregunta, contacta amb <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"És possible que <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pugui accedir a les dades associades a aquest dispositiu, gestionar-ne les aplicacions i canviar-ne la configuració.\n\nSi tens cap pregunta, contacta amb <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"El dispositiu pertany a la teva organització.\n\nL\'administrador de TI pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu i la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador de TI."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"La teva organització ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit a la xarxa segura se supervisi o es modifiqui."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"La teva organització ha instal·lat una autoritat de certificació al teu perfil de treball. És possible que el trànsit de xarxa segura se supervisi o es modifiqui."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"A punt"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de treball"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Estat</b>: s\'ha disminuït a Silenci"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Estat</b>: s\'ha classificat amb un nivell superior"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Estat</b>: s\'ha classificat amb un nivell inferior"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Es mostra com a bombolla flotant a la part superior de la secció de converses i la foto de perfil apareix a la pantalla de bloqueig"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet les funcions de converses"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Aquest grup de notificacions no es pot configurar aquí"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ves a Configuració per actualitzar el sistema de navegació"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"La conversa s\'ha definit com a prioritària"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Les converses prioritàries:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Es mostraran a la part superior de la secció de converses"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostraran la foto de perfil a la pantalla de bloqueig"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Es mostra com a bombolla flotant en primer pla"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromp el mode No molestis"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entesos"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuració"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Canvia"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"El gest d\'accessibilitat s\'ha substituït pel botó d\'accessibilitat\n\n"<annotation id="link">"Mostra la configuració"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mou el botó a l\'extrem per amagar-lo temporalment"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controls de dispositius"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Afegeix controls per als teus dispositius connectats"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura els controls de dispositius"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa oberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversa per afegir-la a la teva pantalla d\'inici"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Torna a consultar aquesta pàgina quan rebis algun missatge"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Converses prioritàries"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Converses recents"</string>
+ <string name="okay" msgid="6490552955618608554">"D\'acord"</string>
<string name="timestamp" msgid="6577851592534538533">"Fa <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Fa menys de: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Fa més de: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Aniversari"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Aniversari aviat"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aniversari"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Compartint la ubicació"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Història nova"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Mirant"</string>
<string name="audio_status" msgid="4237055636967709208">"Escoltant"</string>
<string name="game_status" msgid="1340694320630973259">"Jugant"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amics"</string>
<string name="empty_status" msgid="5938893404951307749">"Parlem aquesta nit!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Trucada perduda"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta els missatges recents, les trucades perdudes i les actualitzacions d\'estat"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Hi ha hagut un problema en llegir el mesurador de la bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca per obtenir més informació"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Cap alarma configurada"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 7263391..c22fffd 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Zavřít"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotkněte se snímače otisků prstů"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona otisku prstu"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obličej se nepodařilo rozpoznat. Použijte místo něj otisk prstu."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Pokračujte přiložením prstu"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Otisk prstu se nepodařilo rozpoznat. Použijte místo něj zámek obrazovky."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Hledáme vás…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona obličeje"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Tlačítko úpravy velikosti z důvodu kompatibility"</string>
@@ -456,7 +453,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC vyžaduje odemknutou obrazovku"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Toto zařízení patří vaší organizaci"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Toto zařízení poskytuje organizace <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Toto zařízení poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Telefon otevřete přejetím prstem od ikony"</string>
<string name="voice_hint" msgid="7476017460191291417">"Hlasovou asistenci otevřete přejetím prstem od ikony"</string>
<string name="camera_hint" msgid="4519495795000658637">"Fotoaparát otevřete přejetím prstem od ikony"</string>
@@ -506,7 +503,7 @@
<string name="battery_saver_notification_text" msgid="2617841636449016951">"Omezuje výkon a data na pozadí"</string>
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Vypnout spořič baterie"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bude mít přístup ke všem informacím, které jsou viditelné na obrazovce nebo které jsou přehrávány ze za řízení při nahrávání nebo odesílání. Týká se to i hesel, údajů o platbě, fotek, zpráv a přehrávaných zvuků."</string>
- <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Služba, která poskytuje tuto funkci, bude mít přístup ke všem informacím, které jsou viditelné na obrazovce nebo které jsou přehrávány ze zařízení při nahrávání nebo odesílání. Týká se to i hesel, údajů o platbě, fotek, zpráv a přehrávaných zvuků."</string>
+ <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Služba, která tuto funkci poskytuje, bude mít při nahrávání nebo odesílání přístup ke všem informacím, které jsou viditelné na obrazovce nebo které jsou přehrávány ze zařízení. Týká se to i hesel, údajů o platbě, fotek, zpráv a přehrávaných zvuků."</string>
<string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Začít nahrávat nebo odesílat?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Začít nahrávat nebo odesílat s aplikací <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Tuto zprávu příště nezobrazovat"</string>
@@ -527,7 +524,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Toto zařízení spravuje rodič"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Toto zařízení vlastní vaše organizace, která může sledovat síťový provoz"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, která může sledovat síťový provoz"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Toto zařízení poskytuje organizace <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Toto zařízení poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Toto zařízení patří vaší organizaci a je připojené k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je připojené k síti <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Toto zařízení patří vaší organizaci"</string>
@@ -542,7 +539,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovní profil je připojen k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Váš osobní profil je připojený k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Toto zařízení je připojené k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Toto zařízení poskytuje organizace <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Toto zařízení poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Správa zařízení"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Monitoring profilu"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Sledování sítě"</string>
@@ -554,7 +551,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Zobrazit zásady"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Zobrazit ovládací prvky"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVáš administrátor IT může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nDalší informace vám poskytne váš administrátor IT."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"Organizace <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> může přistupovat k datům spojeným s tímto zařízením, měnit jeho nastavení a spravovat aplikace.\n\nPokud máte nějaké otázky, obraťte se na organizaci <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> má přístup k datům spojeným s tímto zařízením, může měnit jeho nastavení a spravovat aplikace.\n\nPokud máte nějaké otázky, obraťte se na organizaci <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Toto zařízení patří vaší organizaci\n\nVáš administrátor IT může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nDalší informace vám poskytne váš administrátor IT."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Organizace do tohoto zařízení nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizace do vašeho pracovního profilu nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Připraveno"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Pracovní profil"</string>
@@ -741,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stav:</b> priorita snížena na Tiché"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Stav:</b> zařazeno výše"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stav:</b> zařazeno níže"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzací, má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tuto skupinu oznámení tady nelze nakonfigurovat"</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Přejděte do Nastavení a aktualizujte systémovou navigaci"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzace byla nastavena jako prioritní"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Chování prioritních konverzací:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovat v horní části sekce konverzací"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovat profilovou fotku na zámku obrazovky"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazuje se jako plovoucí bublina nad aplikacemi"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Přerušit režim Nerušit"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Rozumím"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavení"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Přepnout"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Tlačítko přístupnosti bylo nahrazeno gestem přístupnosti\n\n"<annotation id="link">"Zobrazit nastavení"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Přesunutím tlačítka k okraji ho dočasně skryjete"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládání zařízení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Přidejte ovládací prvky pro připojená zařízení"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavení ovládání zařízení"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"Otevřít konverzaci"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgety konverzací"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Klepnutím na konverzaci ji přidáte na plochu"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vraťte se sem, až dostanete nějaké zprávy"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritní konverzace"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Poslední konverzace"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Před <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Před méně než <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Před více než <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Narozeniny"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Brzy má narozeniny"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Výročí"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Sdílí polohu"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nový příběh"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Sledování"</string>
<string name="audio_status" msgid="4237055636967709208">"Poslouchám"</string>
<string name="game_status" msgid="1340694320630973259">"Hraje"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Přátelé"</string>
<string name="empty_status" msgid="5938893404951307749">"Pojďme chatovat."</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Zmeškaný hovor"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Zobrazit poslední zprávy, zmeškané hovory a aktualizace stavu"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzace"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problém s načtením měřiče baterie"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím zobrazíte další informace"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Budík nenastaven"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9348a1c..59dd774 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Arbejdsprofil"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Angivet som Lydløs"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Rangeret højere"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Placeret lavere"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen som en svævende boble og med profilbillede på låseskærmen"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Du kan ikke konfigurere denne gruppe notifikationer her"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Indstillinger for at opdatere systemnavigationen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Samtalen er angivet som prioriteret"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Følgende gælder for prioriterede samtaler:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Vises øverst i samtalesektionen"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Viser profilbillede på låseskærm"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vis som en boble oven på apps"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Afbryd Forstyr ikke"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Indstillinger"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Skift"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Knappen Hjælpefunktioner har erstattet bevægelsen for hjælpefunktioner\n\n"<annotation id="link">"Se indstillinger"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Flyt knappen til kanten for at skjule den midlertidigt"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj styring af dine tilsluttede enheder"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhedsstyring"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"For mindre end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"For mere end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="birthday_status" msgid="2596961629465396761">"Fødselsdag"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Fødselsdag snart"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Årsdag"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Deler placering"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Ny historie"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Ser"</string>
<string name="audio_status" msgid="4237055636967709208">"Lytter"</string>
<string name="game_status" msgid="1340694320630973259">"Spiller"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Venner"</string>
<string name="empty_status" msgid="5938893404951307749">"Lad os chatte i aften!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Ubesvaret opkald"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se dine seneste beskeder, mistede opkald og statusopdateringer"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Der er problemer med at aflæse dit batteriniveau"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryk for at få flere oplysninger"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm er indstillet"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index f163be8..7c590cf 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -47,7 +47,7 @@
<string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"Eingabemethoden festlegen"</string>
<string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"Physische Tastatur"</string>
<string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g> den Zugriff auf <xliff:g id="USB_DEVICE">%2$s</xliff:g> gewähren?"</string>
- <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"Der App \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" Zugriff auf das Gerät \"<xliff:g id="USB_DEVICE">%2$s</xliff:g>\" geben?\nDiese App hat noch nicht die Berechtigung zum Aufnehmen erhalten, könnte jedoch Audio über dieses USB-Gerät aufnehmen."</string>
+ <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"<xliff:g id="APPLICATION">%1$s</xliff:g> den Zugriff auf <xliff:g id="USB_DEVICE">%2$s</xliff:g> gewähren?\nDiese App hat noch nicht die Berechtigung zum Aufnehmen erhalten, könnte jedoch Audio über dieses USB-Gerät aufnehmen."</string>
<string name="usb_accessory_permission_prompt" msgid="717963550388312123">"<xliff:g id="APPLICATION">%1$s</xliff:g> den Zugriff auf <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> gewähren?"</string>
<string name="usb_device_confirm_prompt" msgid="4091711472439910809">"Für <xliff:g id="USB_DEVICE">%2$s</xliff:g> <xliff:g id="APPLICATION">%1$s</xliff:g> öffnen?"</string>
<string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"<xliff:g id="APPLICATION">%1$s</xliff:g> öffnen, um <xliff:g id="USB_DEVICE">%2$s</xliff:g> zu bedienen?\nDiese App hat noch keine Berechtigung zum Aufnehmen erhalten, könnte aber Audioaufnahmen über dieses USB-Gerät machen."</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Schließen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Berühre den Fingerabdrucksensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerabdruck-Symbol"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gesicht wurde nicht erkannt. Verwende stattdessen den Fingerabdruck."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Mithilfe deines Fingerabdrucks fortfahren"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Fingerabdruck wurde nicht erkannt. Verwende stattdessen die Displaysperre."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Wir suchen nach dir…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Gesichtssymbol"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Schaltfläche für Kompatibilitätszoom"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Bereit"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Arbeitsprofil"</string>
@@ -735,14 +737,16 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status</b>: auf „Lautlos“ herabgestuft"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status</b>: höher eingestuft"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status</b>: niedriger eingestuft"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wird oben im Bereich „Unterhaltungen“ als unverankerte Bubble angezeigt und erscheint mit einem Profilbild auf dem Sperrbildschirm"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine Funktionen für Unterhaltungen"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Weitergeleitete Benachrichtigung"</string>
- <string name="notification_channel_dialog_title" msgid="6856514143093200019">"Alle <xliff:g id="APP_NAME">%1$s</xliff:g>-Benachrichtigungen"</string>
+ <string name="notification_channel_dialog_title" msgid="6856514143093200019">"Alle Benachrichtigungen von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="see_more_title" msgid="7409317011708185729">"Mehr"</string>
<string name="appops_camera" msgid="5215967620896725715">"Diese App verwendet die Kamera."</string>
<string name="appops_microphone" msgid="8805468338613070149">"Diese App verwendet das Mikrofon."</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Unterhaltung als vorrangig eingestuft"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Vorrangige Unterhaltungen:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Werden oben im Bereich \"Unterhaltungen\" angezeigt"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zeigen Profilbild auf Sperrbildschirm an"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Erscheinen als unverankerte Bubble über anderen Apps"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Bitte nicht stören\" unterbrechen"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Einstellungen"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Schalter"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Die Schaltfläche „Bedienungshilfen“ ersetzt die Touch-Geste für Bedienungshilfen\n\n"<annotation id="link">"Einstellungen aufrufen"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Durch Ziehen an den Rand wird die Schaltfläche zeitweise ausgeblendet"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Gerätesteuerung"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Steuerelemente für verbundene Geräte hinzufügen"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Gerätesteuerung einrichten"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Offene Unterhaltung"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Unterhaltungs-Widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tippe auf eine Unterhaltung, um sie deinem Startbildschirm hinzuzufügen"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Wenn du Nachrichten empfängst, findest du sie hier"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Vorrangige Unterhaltungen"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Neueste Unterhaltungen"</string>
+ <string name="okay" msgid="6490552955618608554">"Ok"</string>
<string name="timestamp" msgid="6577851592534538533">"Vor <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Vor weniger als <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Vor über <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Geburtstag"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Bald Geburtstag"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Jahrestag"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Standort wird geteilt"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Neue Geschichte"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Schaut etwas"</string>
<string name="audio_status" msgid="4237055636967709208">"Hört etwas"</string>
<string name="game_status" msgid="1340694320630973259">"Spielt"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Freunde"</string>
<string name="empty_status" msgid="5938893404951307749">"Chat heute Abend!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Verpasster Anruf"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Letzte Nachrichten, verpasste Anrufe und Statusaktualisierungen ansehen"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Unterhaltung"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem beim Lesen des Akkustands"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Für weitere Informationen tippen"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Kein Wecker gestellt"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 4dad056..81cc35b 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -545,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Προβολή πολιτικών"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Προβολή στοιχείων ελέγχου"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Αυτή η συσκευή ανήκει στον οργανισμό <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nΟ διαχειριστής IT μπορεί να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές, τα δεδομένα που σχετίζονται με τη συσκευή καθώς και τις πληροφορίες τοποθεσίας της συσκευής σας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή IT."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"Ο οργανισμός <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> ενδέχεται να έχει πρόσβαση σε δεδομένα που σχετίζονται με αυτήν τη συσκευή, να διαχειρίζεται εφαρμογές και να αλλάξει τις ρυθμίσεις της.\n\nΕάν έχετε ερωτήσεις, επικονωνήστε με τον οργανισμό <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"Ο οργανισμός <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> ενδέχεται να έχει πρόσβαση σε δεδομένα που σχετίζονται με αυτήν τη συσκευή, να διαχειρίζεται εφαρμογές και να αλλάζει τις ρυθμίσεις της.\n\nΕάν έχετε ερωτήσεις, επικονωνήστε με τον οργανισμό <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Αυτή η συσκευή ανήκει στον οργανισμό σας.\n\nΟ διαχειριστής IT μπορεί να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές, τα δεδομένα που σχετίζονται με τη συσκευή καθώς και τις πληροφορίες τοποθεσίας της συσκευής σας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή IT."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών σε αυτήν τη συσκευή. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών στο προφίλ εργασίας σας. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται."</string>
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Έτοιμο"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Προφίλ εργασίας"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Κατάσταση:</b> Υποβιβάστηκε σε Αθόρυβη"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Κατάσταση:</b> Κατατάχθηκε υψηλότερα"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Κατάσταση:</b> Κατατάχθηκε χαμηλότερα"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται επάνω στις συζητήσεις, προβάλλεται ως κιν. συννεφάκι, εμφανίζει τη φωτ. προφίλ στην οθ. κλειδ."</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει τις λειτουργίες συζήτησης"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Ορίστηκε ως συζήτηση προτεραιότητας"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Οι συζητήσεις προτεραιότητας θα έχουν τα εξής χαρακτηριστικά:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Εμφάνιση στο επάνω μέρος της ενότητας συνομιλιών"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Εμφάνιση εικόνας προφίλ στην οθόνη κλειδώματος"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Κινούμενο συννεφάκι στο επάνω μέρος των εφαρμογών"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Διακοπή λειτουργίας Μην ενοχλείτε"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Το κατάλαβα"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ρυθμίσεις"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Εναλλαγή"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Το κουμπί προσβασιμότητας αντικατέστησε την κίνηση προσβασιμότητας\n\n"<annotation id="link">"Προβολή ρυθμίσεων"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Μετακινήστε το κουμπί στο άκρο για προσωρινή απόκρυψη"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Στοιχεία ελέγχου συσκευής"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Προσθήκη στοιχείων ελέγχου για τις συνδεδεμένες συσκευές σας."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Ρύθμιση στοιχείων ελέγχου συσκευής"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Λιγότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Περισσότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string>
<string name="birthday_status" msgid="2596961629465396761">"Γενέθλια"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Προσεχώς γενέθλια"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Επέτειος"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Κοινοποίηση τοποθ."</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Νέα είδηση"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Παρακολούθηση"</string>
<string name="audio_status" msgid="4237055636967709208">"Ακρόαση"</string>
<string name="game_status" msgid="1340694320630973259">"Παίζει τώρα"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Φίλοι"</string>
<string name="empty_status" msgid="5938893404951307749">"Συζήτηση απόψε!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Αναπάντητη κλήση"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Δείτε πρόσφατα μηνύματα, αναπάντητες κλήσεις και ενημερώσεις κατάστασης"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Συνομιλία"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Πατήστε για περισσότερες πληροφορίες."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Δεν ορίστηκε ξυπνητ."</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 7ee1383..19d0ca3 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Show all"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Unlock to pay"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Ready"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Set up payment"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Unlock to use"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"There was a problem getting your cards. Please try again later."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> demoted to silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> ranked higher"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> ranked lower"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Always shown at the top of your notifications, even when priority mode is on"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Priority conversations"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Priority conversations"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"These conversations are shown at the top of your list and can always reach you when priority mode is on"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profile pictures are shown on the lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"You can easily find these conversations in bubbles on your Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Accessibility button replaced the accessibility gesture\n\n"<annotation id="link">"View settings"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Move button to the edge to hide it temporarily"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Move top left"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Move top right"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Move bottom left"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Move bottom right"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Move to edge and hide"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Move out edge and show"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Birthday"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Birthday soon"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday soon"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anniversary"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s anniversary"</string>
<string name="location_status" msgid="1294990572202541812">"Sharing location"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> is sharing location"</string>
<string name="new_story_status" msgid="9012195158584846525">"New story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> shared a new story"</string>
<string name="video_status" msgid="4548544654316843225">"Watching"</string>
<string name="audio_status" msgid="4237055636967709208">"Listening"</string>
<string name="game_status" msgid="1340694320630973259">"Playing"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Friends"</string>
<string name="empty_status" msgid="5938893404951307749">"Let’s chat tonight!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Content will show up soon"</string>
<string name="missed_call" msgid="4228016077700161689">"Missed call"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> sent a message"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 0dfe75b..607f6c7 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Show all"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Unlock to pay"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Ready"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Set up payment"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Unlock to use"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"There was a problem getting your cards. Please try again later."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> demoted to silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> ranked higher"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> ranked lower"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Always shown at the top of your notifications, even when priority mode is on"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Priority conversations"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Priority conversations"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"These conversations are shown at the top of your list and can always reach you when priority mode is on"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profile pictures are shown on the lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"You can easily find these conversations in bubbles on your Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Accessibility button replaced the accessibility gesture\n\n"<annotation id="link">"View settings"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Move button to the edge to hide it temporarily"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Move top left"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Move top right"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Move bottom left"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Move bottom right"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Move to edge and hide"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Move out edge and show"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Birthday"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Birthday soon"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday soon"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anniversary"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s anniversary"</string>
<string name="location_status" msgid="1294990572202541812">"Sharing location"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> is sharing location"</string>
<string name="new_story_status" msgid="9012195158584846525">"New story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> shared a new story"</string>
<string name="video_status" msgid="4548544654316843225">"Watching"</string>
<string name="audio_status" msgid="4237055636967709208">"Listening"</string>
<string name="game_status" msgid="1340694320630973259">"Playing"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Friends"</string>
<string name="empty_status" msgid="5938893404951307749">"Let’s chat tonight!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Content will show up soon"</string>
<string name="missed_call" msgid="4228016077700161689">"Missed call"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> sent a message"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 7ee1383..19d0ca3 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Show all"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Unlock to pay"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Ready"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Set up payment"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Unlock to use"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"There was a problem getting your cards. Please try again later."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> demoted to silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> ranked higher"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> ranked lower"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Always shown at the top of your notifications, even when priority mode is on"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Priority conversations"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Priority conversations"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"These conversations are shown at the top of your list and can always reach you when priority mode is on"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profile pictures are shown on the lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"You can easily find these conversations in bubbles on your Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Accessibility button replaced the accessibility gesture\n\n"<annotation id="link">"View settings"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Move button to the edge to hide it temporarily"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Move top left"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Move top right"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Move bottom left"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Move bottom right"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Move to edge and hide"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Move out edge and show"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Birthday"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Birthday soon"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday soon"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anniversary"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s anniversary"</string>
<string name="location_status" msgid="1294990572202541812">"Sharing location"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> is sharing location"</string>
<string name="new_story_status" msgid="9012195158584846525">"New story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> shared a new story"</string>
<string name="video_status" msgid="4548544654316843225">"Watching"</string>
<string name="audio_status" msgid="4237055636967709208">"Listening"</string>
<string name="game_status" msgid="1340694320630973259">"Playing"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Friends"</string>
<string name="empty_status" msgid="5938893404951307749">"Let’s chat tonight!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Content will show up soon"</string>
<string name="missed_call" msgid="4228016077700161689">"Missed call"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> sent a message"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 7ee1383..19d0ca3 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Show all"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Unlock to pay"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Ready"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Set up payment"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Unlock to use"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"There was a problem getting your cards. Please try again later."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> demoted to silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> ranked higher"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> ranked lower"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Always shown at the top of your notifications, even when priority mode is on"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Priority conversations"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Priority conversations"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"These conversations are shown at the top of your list and can always reach you when priority mode is on"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profile pictures are shown on the lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"You can easily find these conversations in bubbles on your Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Accessibility button replaced the accessibility gesture\n\n"<annotation id="link">"View settings"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Move button to the edge to hide it temporarily"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Move top left"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Move top right"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Move bottom left"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Move bottom right"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Move to edge and hide"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Move out edge and show"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Birthday"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Birthday soon"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s birthday soon"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anniversary"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"It\'s <xliff:g id="NAME">%1$s</xliff:g>\'s anniversary"</string>
<string name="location_status" msgid="1294990572202541812">"Sharing location"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> is sharing location"</string>
<string name="new_story_status" msgid="9012195158584846525">"New story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> shared a new story"</string>
<string name="video_status" msgid="4548544654316843225">"Watching"</string>
<string name="audio_status" msgid="4237055636967709208">"Listening"</string>
<string name="game_status" msgid="1340694320630973259">"Playing"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Friends"</string>
<string name="empty_status" msgid="5938893404951307749">"Let’s chat tonight!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Content will show up soon"</string>
<string name="missed_call" msgid="4228016077700161689">"Missed call"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> sent a message"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 588b2cc..03c5eb1 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Show all"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Unlock to pay"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Ready"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Set up payment"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Unlock to use"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"There was a problem getting your cards, please try again later"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Demoted to Silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Ranked Higher"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Ranked Lower"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Always shown at the top of your notifications, even when Priority mode is on"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Priority conversations"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Priority conversations"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"These conversations are shown at the top of your list and can always reach you when Priority mode is on"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profile pictures are shown on the lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"You can easily find these conversations in bubbles on your Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Got it"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Accessibility button replaced the accessibility gesture\n\n"<annotation id="link">"View settings"</annotation>""</string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Move button to the edge to hide it temporarily"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Move top left"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Move top right"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Move bottom left"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Move bottom right"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Move to edge and hide"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Move out edge and show"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Birthday"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Its <xliff:g id="NAME">%1$s</xliff:g>s birthday"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Birthday soon"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Its <xliff:g id="NAME">%1$s</xliff:g>s birthday soon"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anniversary"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Its <xliff:g id="NAME">%1$s</xliff:g>s anniversary"</string>
<string name="location_status" msgid="1294990572202541812">"Sharing location"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> is sharing location"</string>
<string name="new_story_status" msgid="9012195158584846525">"New story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> shared a new story"</string>
<string name="video_status" msgid="4548544654316843225">"Watching"</string>
<string name="audio_status" msgid="4237055636967709208">"Listening"</string>
<string name="game_status" msgid="1340694320630973259">"Playing"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Friends"</string>
<string name="empty_status" msgid="5938893404951307749">"Let’s chat tonight!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Content will show up soon"</string>
<string name="missed_call" msgid="4228016077700161689">"Missed call"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls, and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> sent a message"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 290b3b3..3e9f4da 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabajo"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Estado:</b> Descendió de nivel a Silenciada"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Estado:</b> Se clasificó en una posición superior"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Estado:</b> Se clasificó en una posición inferior"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo."</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"No se puede configurar aquí este grupo de notificaciones"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Configuración para actualizar la navegación del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Se estableció la conversación como prioritaria"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Las conversaciones prioritarias harán lo siguiente:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostrarse en la parte superior de conversaciones"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrarán una foto de perfil en pantalla de bloqueo"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecerán como burbujas flotantes encima de apps"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Suspender No interrumpir"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuración"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Botón"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"El botón de accesibilidad reemplaza el gesto de accesibilidad\n\n"<annotation id="link">"Ver configuración"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mueve el botón hacia el borde para ocultarlo temporalmente"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Agrega controles para los dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles de dispositivos"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Cumpleaños"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Cumpleaños pronto"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aniversario"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Comparte ubicación"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nueva historia"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Mirando"</string>
<string name="audio_status" msgid="4237055636967709208">"Escuchando"</string>
<string name="game_status" msgid="1340694320630973259">"Jugando"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Charlemos esta noche"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Llamada perdida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> o más"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta mensajes recientes, llamadas perdidas y actualizaciones de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema al leer el medidor de batería"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Presiona para obtener más información"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No se estableció alarma"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 9d96e18..0eae44b 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Cerrar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icono de huella digital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce la cara. Usa la huella digital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Usa tu huella digital para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"No se reconoce la huella digital. Usa el bloqueo de pantalla."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Buscando tu cara…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icono de cara"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botón de zoom de compatibilidad"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabajo"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Estado:</b> cambio a Silencio"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Estado:</b> posición más alta"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Estado:</b> posición más baja"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra arriba en la sección de conversaciones, como burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"No se pueden usar funciones de conversación con <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Este grupo de notificaciones no se puede configurar aquí"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversación marcada como prioritaria"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Las conversaciones prioritarias:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Se muestran en la parte superior de la sección de conversaciones"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran la imagen de perfil en la pantalla de bloqueo"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbuja sobre las aplicaciones"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrumpen el modo No molestar"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ajustes"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Cambiar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"El botón Accesibilidad ha reemplazado al gesto de accesibilidad\n\nVer configuración"<annotation id="link"></annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mueve el botón hacia el borde para ocultarlo temporalmente"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles para tus dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversación"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversación para añadirla a la pantalla de inicio"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vuelve cuando recibas algún mensaje"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversaciones prioritarias"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversaciones recientes"</string>
+ <string name="okay" msgid="6490552955618608554">"Vale"</string>
<string name="timestamp" msgid="6577851592534538533">"Hace <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Fecha de nacimiento"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Cumpleaños en breve"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aniversario"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Compartiendo ubicación"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nueva historia"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Viendo"</string>
<string name="audio_status" msgid="4237055636967709208">"Escuchando"</string>
<string name="game_status" msgid="1340694320630973259">"Reproduciendo"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Charlemos esta noche"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Llamada perdida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta los mensajes recientes, las llamadas perdidas y los cambios de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"No se ha podido leer el indicador de batería"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca la pantalla para consultar más información"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ninguna alarma puesta"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 9471baa..3a92dfa 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Sulge"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Puudutage sõrmejäljeandurit"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Sõrmejälje ikoon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nägu ei õnnestu tuvastada. Kasutage sõrmejälge."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Jätkamiseks kasutage sõrmejälge"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Sõrmejälge ei õnnestu tuvastada. Kasutage selle asemel ekraanilukku."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Otsitakse teid …"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Näoikoon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Sobivussuumi nupp."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Valmis"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Tööprofiil"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Olek:</b> määrati prioriteet Vaikne"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Olek:</b> määrati kõrgem prioriteet"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Olek:</b> määrati madalam prioriteet"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Kuvatakse vestluste jaotise ülaosas hõljuva mullina ja lukustuskuval kuvatakse profiilipilt"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestlusfunktsioone"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Seda märguannete rühma ei saa siin seadistada"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Vestlus määrati prioriteetseks"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioriteetsed vestlused teevad järgmist."</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kuvatakse vestluste jaotise kohal"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Lukustuskuval kuvatakse profiilipilt"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kuvatakse rakenduste kohal hõljuva mullina"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Funktsioon Mitte segada katkestatakse"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selge"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Seaded"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Vaheta"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Juurdepääsetavuse nupp asendas juurdepääsuliigutuse\n\n"<annotation id="link">"Vaadake seadeid"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Teisaldage nupp serva, et see ajutiselt peita"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadmete juhtimisvidinate seadistamine"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Avage vestlus"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vestlusvidinad"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Puudutage vestlust, et lisada see oma avakuvale"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Tulge tagasi, kui olete mõne sõnumi saanud"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriteetsed vestlused"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Hiljutised vestlused"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Vähem kui <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Üle <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
<string name="birthday_status" msgid="2596961629465396761">"Sünnipäev"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Peagi on sünnipäev"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aastapäev"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Asukoha jagamine"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Uus lugu"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Vaatamas"</string>
<string name="audio_status" msgid="4237055636967709208">"Kuulamine"</string>
<string name="game_status" msgid="1340694320630973259">"Mängimas"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Sõbrad"</string>
<string name="empty_status" msgid="5938893404951307749">"Vestleme täna õhtul!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Vastamata kõne"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Vaadake hiljutisi sõnumeid, vastamata kõnesid ja olekuvärskendusi"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Vestlus"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem akumõõdiku lugemisel"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Puudutage lisateabe saamiseks"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Äratust pole"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index a078511..1d69d31 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Baztertu"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sakatu hatz-marken sentsorea"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Hatz-markaren ikonoa"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ez da hauteman aurpegia. Erabili hatz-marka."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Aurrera egiteko, erabili hatz-marka"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Ez da hauteman hatz-marka. Erabili pantailaren blokeoa."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Zure bila…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Aurpegiaren ikonoa"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Zoom-bateragarritasunaren botoia."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Prest"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profila"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"Soinurik gabeko modura aldatu da <b>egoera:</b>"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"Mailaz igo da <b>egoera:</b>"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"Mailaz jaitsi da <b>egoera:</b>"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Burbuila gisa agertzen da elkarrizketen atalaren goialdean, eta profileko argazkia bistaratzen du pantaila blokeatuta dagoenean"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez ditu onartzen elkarrizketetarako eginbideak"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Jakinarazpen talde hau ezin da konfiguratu hemen"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Lehentasunezko gisa ezarritako elkarrizketa"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Hau gertatuko da lehentasunezko elkarrizketekin:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Elkarrizketen atalaren goialdean erakutsiko dira."</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profileko argazkia pantaila blokeatuan erakutsiko da."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Burbuila gainerakor gisa agertuko da aplikazioen gainean"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Eten ez molestatzeko modua"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ados"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ezarpenak"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Botoia"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Erabilerraztasuna botoiak erabilerraztasun-keinua ordezkatu du\n\n"<annotation id="link">"Ikusi ezarpenak"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Eraman botoia ertzera aldi baterako ezkutatzeko"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Gailuak kontrolatzeko widgetak"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Gehitu konektatutako gailuak kontrolatzeko widgetak"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguratu gailuak kontrolatzeko widgetak"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Elkarrizketa irekia"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Elkarrizketa-widgetak"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Sakatu elkarrizketa bat hasierako pantailan gehitzeko"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Itzuli geroago, zenbait mezu jasotakoan"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Lehentasunezko elkarrizketak"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Azken elkarrizketak"</string>
+ <string name="okay" msgid="6490552955618608554">"Ados"</string>
<string name="timestamp" msgid="6577851592534538533">"Duela <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gutxiago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gehiago"</string>
<string name="birthday_status" msgid="2596961629465396761">"Urtebetetzea"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Badator urtebetetzea"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Urteurrena"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Kokapena partekatzen"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Istorio berria"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Ikusten"</string>
<string name="audio_status" msgid="4237055636967709208">"Entzuten"</string>
<string name="game_status" msgid="1340694320630973259">"Erreproduzitzen"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Lagunak"</string>
<string name="empty_status" msgid="5938893404951307749">"Txatea dezagun gaur gauean!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Dei galdua"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Ikusi azken mezuak, dei galduak eta egoerari buruzko informazio eguneratua"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Elkarrizketa"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat gertatu da bateria-neurgailua irakurtzean"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 21592bc..543d83b 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"رد کردن"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"حسگر اثر انگشت را لمس کنید"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"نماد اثر انگشت"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چهره شناسایی نشد. درعوض از اثر انگشت استفاده کنید."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"برای ادامه، از اثر انگشتتان استفاده کنید"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"اثر انگشت شناسایی نشد. درعوض از قفل صفحه استفاده کنید."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"درحال جستجوی شما…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"نماد چهره"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"دکمه بزرگنمایی سازگار."</string>
@@ -598,16 +595,16 @@
<string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیرفعال کردن"</string>
<string name="accessibility_output_chooser" msgid="7807898688967194183">"تغییر دستگاه خروجی"</string>
<string name="screen_pinning_title" msgid="9058007390337841305">"برنامه پین شده است"</string>
- <string name="screen_pinning_description" msgid="8699395373875667743">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «نمای کلی» را لمس کنید و نگهدارید."</string>
- <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید."</string>
- <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"به این ترتیب تا زمانی پین آن را برندارید قابلمشاهده است. برای برداشتن پین، از پایین صفحه تند بهطرف بالا بکشید و نگه دارید."</string>
- <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «نمای کلی» را لمس کنید و نگهدارید."</string>
- <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «صفحه اصلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description" msgid="8699395373875667743">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن سنجاق، «برگشت» و «نمای کلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"تا برداشتن سنجاق، در نما نگهداشته میشود. برای برداشتن سنجاق، «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"به این ترتیب تا زمانی پین آن را برندارید قابلمشاهده است. برای برداشتن سنجاق، از پایین صفحه تند بهطرف بالا بکشید و نگه دارید."</string>
+ <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن سنجاق، «نمای کلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"تا برداشتن سنجاق، در نما نگهداشته میشود. برای برداشتن سنجاق، «صفحه اصلی» را لمس کنید و نگهدارید."</string>
<string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ممکن است دادههای شخصی (مانند مخاطبین و محتوای ایمیل) در دسترس باشد."</string>
<string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"برنامه پینشده ممکن است برنامههای دیگر را باز کند."</string>
- <string name="screen_pinning_toast" msgid="8177286912533744328">"برای برداشتن پین این برنامه، دکمههای «برگشت» و «نمای کلی» را لمس کنید و نگهدارید"</string>
- <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"برای برداشتن پین این برنامه، دکمههای «برگشت» و «صفحه اصلی» را لمس کنید و نگه دارید"</string>
- <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"برای برداشتن پین این برنامه، صفحه را تند بالا بکشید و نگه دارید"</string>
+ <string name="screen_pinning_toast" msgid="8177286912533744328">"برای برداشتن سنجاق این برنامه، دکمههای «برگشت» و «نمای کلی» را لمس کنید و نگهدارید"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"برای برداشتن سنجاق این برنامه، دکمههای «برگشت» و «صفحه اصلی» را لمس کنید و نگه دارید"</string>
+ <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"برای برداشتن سنجاق این برنامه، صفحه را تند بالا بکشید و نگه دارید"</string>
<string name="screen_pinning_positive" msgid="3285785989665266984">"متوجه شدم"</string>
<string name="screen_pinning_negative" msgid="6882816864569211666">"نه متشکرم"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"برنامه پین شد"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"اترنت"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"زنگ"</string>
<string name="wallet_title" msgid="5369767670735827105">"کیفپول"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"آماده"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"نمایش همه"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"برای پرداخت قفل را باز کنید"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"آماده"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"راهاندازی پرداخت"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"برای استفاده، قفل را باز کنید"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"هنگام دریافت کارتها مشکلی پیش آمد، لطفاً بعداً دوباره امتحان کنید"</string>
<string name="status_bar_work" msgid="5238641949837091056">"نمایه کاری"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"حالت هواپیما"</string>
<string name="add_tile" msgid="6239678623873086686">"افزودن کاشی"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>وضعیت:</b> به «بیصدا» تنزل یافت"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>وضعیت:</b> در ردهبندی بالاتری قرار گرفت"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>وضعیت:</b> در ردهبندی پایینتری قرار گرفت"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"در بالای بخش مکالمه بهصورت حبابک شناور نشان داده میشود و عکس نمایه را در صفحه قفل نمایش میدهد"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"همیشه در بالای اعلانها نشان داده میشود، حتی وقتی «حالت اولویتدار» روشن است"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"مکالمههای اولویتدار"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> از ویژگیهای مکالمه پشتیبانی نمیکند"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"نمیتوانید این گروه اعلانها را در اینجا پیکربندی کنید"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"مکالمه روی اولویت تنظیم شده است"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"مکالمههای اولویتدار:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"نمایش در بالای بخش مکالمه"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"عکس نمایه را در صفحه قفل نمایش میدهد"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"بهشکل حبابک شناور روی برنامهها ظاهر میشود"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"مکالمههای اولویتدار"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"این مکالمهها در بالای فهرستتان نشان داده میشوند و وقتی «حالت اولویتدار» روشن است همیشه به دست شما میرسند"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"عکسهای نمایه در صفحه قفل نشان داده میشوند"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"بهراحتی میتوانید این مکالمهها را بهصورت حبابک در صفحه اصلی خود پیدا کنید"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"وقفه در «مزاحم نشوید»"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"متوجهام"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"تنظیمات"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"کلید"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"دکمه دسترسپذیری جایگزین اشاره دسترسپذیری شد\n\n"<annotation id="link">"مشاهده تنظیمات"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"برای پنهان کردن موقتی دکمه، آن را به لبه ببرید"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"انتقال به بالا سمت راست"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"انتقال به بالا سمت چپ"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"انتقال به پایین سمت راست"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"انتقال به پایین سمت چپ"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"انتقال به لبه و پنهان کردن"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"انتقال به خارج از لبه و نمایش"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"کنترلهای دستگاه"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"افزودن کنترلها برای دستگاههای متصل"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"تنظیم کنترلهای دستگاه"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"باز کردن مکالمه"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ابزارکهای مکالمه"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"روی مکالمهای ضربه بزنید تا به «صفحه اصلی» اضافه شود"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"بهمحض اینکه چند پیام دریافت کردید، به اینجا سربزنید"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"مکالمههای اولویتدار"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"گفتگوهای اخیر"</string>
+ <string name="okay" msgid="6490552955618608554">"تأیید"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> پیش"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"کمتر از <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
<string name="over_timestamp" msgid="4765793502859358634">"بیشاز <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
<string name="birthday_status" msgid="2596961629465396761">"تاریخ تولد"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"امروز تولد <xliff:g id="NAME">%1$s</xliff:g> است"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"تاریخ تولد نزدیک است"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"بهزودی تولد <xliff:g id="NAME">%1$s</xliff:g> فرا میرسد"</string>
<string name="anniversary_status" msgid="1790034157507590838">"سالگرد"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"امروز سالگرد <xliff:g id="NAME">%1$s</xliff:g> است"</string>
<string name="location_status" msgid="1294990572202541812">"درحال همرسانی مکان"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> درحال همرسانی مکان است"</string>
<string name="new_story_status" msgid="9012195158584846525">"داستان جدید"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> داستان جدیدی را همرسانی کرد"</string>
<string name="video_status" msgid="4548544654316843225">"درحال تماشا"</string>
<string name="audio_status" msgid="4237055636967709208">"درحال گوش کردن"</string>
<string name="game_status" msgid="1340694320630973259">"درحال پخش"</string>
<string name="empty_user_name" msgid="3389155775773578300">"دوستان"</string>
<string name="empty_status" msgid="5938893404951307749">"بیایید امشب گپ بزنیم!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"محتوا بهزودی نشان داده میشود"</string>
<string name="missed_call" msgid="4228016077700161689">"تماس بیپاسخ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"بیشاز <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"دیدن بهروزرسانیهای وضعیت، تماسهای بیپاسخ، و پیامهای اخیر"</string>
<string name="people_tile_title" msgid="6589377493334871272">"مکالمه"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> پیامی ارسال کرد"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> تصویری ارسال کرد"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"مشکلی در خواندن میزان باتری وجود دارد"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"برای اطلاعات بیشتر ضربه بزنید"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"هشداری تنظیم نشده است"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 36a17bf..c8de17b 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -112,7 +112,7 @@
<string name="screenrecord_stop_label" msgid="72699670052087989">"Lopeta"</string>
<string name="screenrecord_pause_label" msgid="6004054907104549857">"Keskeytä"</string>
<string name="screenrecord_resume_label" msgid="4972223043729555575">"Jatka"</string>
- <string name="screenrecord_cancel_label" msgid="7850926573274483294">"Peruuta"</string>
+ <string name="screenrecord_cancel_label" msgid="7850926573274483294">"Peru"</string>
<string name="screenrecord_share_label" msgid="5025590804030086930">"Jaa"</string>
<string name="screenrecord_cancel_success" msgid="1775448688137393901">"Näytön tallennus peruutettu"</string>
<string name="screenrecord_save_title" msgid="1886652605520893850">"Näyttötallenne tallennettu"</string>
@@ -143,10 +143,10 @@
<string name="phone_label" msgid="5715229948920451352">"avaa puhelin"</string>
<string name="voice_assist_label" msgid="3725967093735929020">"Avaa ääniapuri"</string>
<string name="camera_label" msgid="8253821920931143699">"avaa kamera"</string>
- <string name="cancel" msgid="1089011503403416730">"Peruuta"</string>
+ <string name="cancel" msgid="1089011503403416730">"Peru"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Vahvista"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Yritä uudelleen"</string>
- <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Peruuta todennus napauttamalla"</string>
+ <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Peru todennus napauttamalla"</string>
<string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"Yritä uudelleen"</string>
<string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"Kasvojasi katsotaan"</string>
<string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"Kasvot tunnistettu"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ohita"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Kosketa sormenjälkitunnistinta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Sormenjälkikuvake"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kasvoja ei voi tunnistaa. Käytä sormenjälkeä."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Jatka sormenjäljen avulla"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Sormenjälkeä ei voi tunnistaa. Käytä sen sijaan näytön lukitusta."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Etsitään kasvoja…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Kasvokuvake"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Yhteensopivuuszoomaus-painike."</string>
@@ -452,7 +449,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Avaa lukitus, jotta voit käyttää NFC:tä"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Organisaatiosi omistaa tämän laitteen"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> omistaa tämän laitteen"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tarjoaa tämän laitteen"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Tämän laitteen tarjoaa <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Avaa puhelu pyyhkäisemällä."</string>
<string name="voice_hint" msgid="7476017460191291417">"Avaa ääniapuri pyyhkäisemällä kuvakkeesta."</string>
<string name="camera_hint" msgid="4519495795000658637">"Avaa kamera pyyhkäisemällä."</string>
@@ -521,7 +518,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Vanhempasi ylläpitää tätä laitetta"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organisaatiosi omistaa laitteen ja voi valvoa verkkoliikennettä"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa laitteen ja voi valvoa verkkoliikennettä"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tarjoaa tämän laitteen"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Tämän laitteen tarjoaa <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Organisaatiosi omistaa laitteen, joka on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa laitteen, joka on yhdistetty tähän: <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Organisaatiosi omistaa tämän laitteen"</string>
@@ -536,7 +533,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Työprofiilisi on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Henkilökohtainen profiilisi on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Laite on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tarjoaa tämän laitteen"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Tämän laitteen tarjoaa <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Laitehallinta"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Profiilin valvonta"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Verkon valvonta"</string>
@@ -548,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Näytä säännöt"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Katso asetukset"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa tämän laitteen.\n\nJärjestelmänvalvoja voi valvoa ja muuttaa asetuksia, yrityskäyttöä, sovelluksia sekä laitteeseen yhdistettyjä tietoja ja sen sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> voi saada pääsyn tähän laitteeseen liittyvään dataan, ylläpitää sovelluksia ja muuttaa laitteen asetuksia.\n\nJos sinulla on kysyttävää, ota yhteyttä: <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> voi saada pääsyn tähän laitteeseen liittyvään dataan, ylläpitää sovelluksia ja muuttaa laitteen asetuksia.\n\nJos sinulla on kysyttävää, ota yhteyttä laitteen tarjoajaan: <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Organisaatiosi omistaa tämän laitteen.\n\nJärjestelmänvalvoja voi valvoa ja muuttaa asetuksia, yrityskäyttöä, sovelluksia sekä laitteeseen yhdistettyjä tietoja ja sen sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Organisaatiosi asensi laitteeseen varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisaatiosi lisäsi työprofiiliin varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Valmis"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Työprofiili"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Tila:</b> hiljennetty"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Tila:</b> valittu tärkeämmäksi"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Tila:</b> valittu vähemmän tärkeäksi"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Näkyy keskusteluosion yläosassa kelluvana kuplana, profiilikuva näkyy lukitusnäytöllä"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskusteluominaisuuksia"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tätä ilmoitusryhmää ei voi määrittää tässä"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Vaihda järjestelmän navigointitapaa asetuksista"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Tärkeäksi merkitty keskustelu"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Tärkeät keskustelut"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Näkyy keskustelukohdan yläosassa"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profiilikuva näkyy lukitusnäytöllä"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Näkyy kelluvana kuplana sovellusten päällä"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Keskeyttää Älä häiritse ‑tilan"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selvä"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Asetukset"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Vaihda"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Esteettömyyspainike on korvannut esteettömyyseleen\n\n"<annotation id="link">"Katso asetukset"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Piilota painike tilapäisesti siirtämällä se reunaan"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Laitteiden hallinta"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisää ohjaimia yhdistettyjä laitteita varten"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Laitteiden hallinnan käyttöönotto"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Avaa keskustelu"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Keskusteluwidgetit"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Lisää keskustelu aloitusnäytölle napauttamalla sitä"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Palaa taas tänne, kun olet saanut viestejä"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Tärkeät keskustelut"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Uusimmat keskustelut"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Alle <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Yli <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
<string name="birthday_status" msgid="2596961629465396761">"Syntymäpäivä"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Syntymäpäivä pian"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Vuosipäivä"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Sijaintia jaetaan"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Uusi juttu"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Katsotaan"</string>
<string name="audio_status" msgid="4237055636967709208">"Kuunnellaan"</string>
<string name="game_status" msgid="1340694320630973259">"Toistetaan"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Kaverit"</string>
<string name="empty_status" msgid="5938893404951307749">"Jutellaan illalla!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Vastaamaton puhelu"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Yli <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Katso viimeaikaiset viestit, vastaamattomat puhelut ja tilapäivitykset"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Keskustelu"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ongelma akkumittarin lukemisessa"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Saat lisätietoja napauttamalla"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ei herätyksiä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d483a8f..df9b7b8 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Fermer"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touchez le capteur d\'empreintes digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icône d\'empreinte digitale"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez plutôt l\'empreinte digitale."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utilisez votre empreinte digitale pour continuer"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Empreinte digitale non reconnue. Utilisez plutôt le verrouillage de l\'écran."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Recherche de votre visage…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icône de visage"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Bouton \"Zoom de compatibilité\""</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Prêt"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil professionnel"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>État :</b> abaissé à la catégorie Silencieux"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>État :</b> élevé d\'un niveau"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>État :</b> abaissé d\'un niveau"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations sous forme de bulle flottante et affiche la photo du profil sur l\'écran de verrouillage"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les fonctionnalités de conversation"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ce groupe de notifications ne peut pas être configuré ici"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez au menu Paramètres pour mettre à jour la navigation système"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Veille"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"La conversation a été définie comme prioritaire"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Pour les conversations prioritaires :"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"afficher dans le haut de la section des conversations"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"afficher la photo de profil sur l\'écran verrouillé"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Sous forme de bulle flottante, par-dessus les applis"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre le mode Ne pas déranger"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Commutateur"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Le bouton d\'accessibilité a remplacé le geste d\'accessibilité\n\n"<annotation id="link">"Voir les paramètres"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Déplacez le bouton vers le bord pour le masquer temporairement"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Ouvrir la conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Touchez une conversation pour l\'ajouter à votre écran d\'accueil"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Revenez ici quand vous aurez reçu des messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversations prioritaires"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversations récentes"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Anniversaire"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Anniversaire proche"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Anniversaire"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Partage de position"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nouvel article"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"En train de regarder…"</string>
<string name="audio_status" msgid="4237055636967709208">"En train d\'écouter…"</string>
<string name="game_status" msgid="1340694320630973259">"En train de jouer…"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amis"</string>
<string name="empty_status" msgid="5938893404951307749">"Clavardons ce soir!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Appel manqué"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Afficher les messages récents, les appels manqués et les mises à jour d\'état"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu lors de la lecture du niveau de charge de la pile"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Touchez pour en savoir plus"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Aucune alarme définie"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 6054fb8..6efdbd0 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Fermer"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Appuyez sur le lecteur d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icône d\'empreinte digitale"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez votre empreinte."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utilisez votre empreinte pour continuer"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Empreinte non reconnue. Utilisez le verrouillage de l\'écran."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Recherche de votre visage…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icône représentant un visage"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Bouton \"Zoom de compatibilité\""</string>
@@ -500,7 +497,7 @@
<string name="battery_saver_notification_text" msgid="2617841636449016951">"Limite les performances et les données en arrière-plan."</string>
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Désactiver l\'économiseur de batterie"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toutes les informations visibles sur votre écran ou lues depuis votre appareil pendant un enregistrement ou une diffusion de contenu. Il peut s\'agir de mots de passe, données de paiement, photos, messages ou encore contenus audio lus."</string>
- <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Le service qui fournit cette fonction aura accès à toutes les informations visibles sur votre écran ou lues depuis votre appareil lors d\'un enregistrement ou d\'une diffusion de contenu. Cela comprend, entre autres, vos mots de passe, vos données de paiement, vos photos, vos messages ou encore les contenus audio que vous lisez."</string>
+ <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Le service qui fournit cette fonction aura accès à toutes les infos visibles sur votre écran ou lues depuis votre appareil lors d\'un enregistrement ou de la diffusion d\'un contenu. Cela comprend, entre autres, vos mots de passe, les détails de vos paiements, vos photos, vos messages ou les contenus audio que vous écoutez."</string>
<string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Démarrer l\'enregistrement ou la diffusion ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Démarrer l\'enregistrement ou la diffusion avec <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Ne plus afficher"</string>
@@ -508,7 +505,7 @@
<string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string>
<string name="manage_notifications_history_text" msgid="57055985396576230">"Historique"</string>
<string name="notification_section_header_incoming" msgid="850925217908095197">"Nouvelles notifications"</string>
- <string name="notification_section_header_gentle" msgid="6804099527336337197">"Silencieuses"</string>
+ <string name="notification_section_header_gentle" msgid="6804099527336337197">"En mode silencieux"</string>
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Prêt"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil professionnel"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>État :</b> Abaissée à la catégorie \"Silencieux\""</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>État :</b> Élevée d\'un niveau"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>État ::</b> Abaissée d\'un niveau"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations, apparaît sous forme de bulle flottante, affiche la photo de profil sur l\'écran de verrouillage"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les fonctionnalités de conversation"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Vous ne pouvez pas configurer ce groupe de notifications ici"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez aux paramètres pour mettre à jour la navigation système"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation définie comme prioritaire"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Les conversations prioritaires :"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Apparaîtront en haut de la liste des conversations"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afficheront la photo de profil sur l\'écran de verrouillage"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Apparaîtront sous forme de bulle au-dessus des applications"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre Ne pas déranger"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Changer"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Le bouton Accessibilité a remplacé le geste d\'accessibilité\n\n"<annotation id="link">"Afficher les paramètres"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Déplacer le bouton vers le bord pour le masquer temporairement"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajouter des commandes pour vos appareils connectés"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Conversation ouverte"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Appuyez sur une conversation pour l\'ajouter à votre écran d\'accueil"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Revenez quand vous aurez reçu des messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversations prioritaires"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversations récentes"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Anniversaire"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Anniversaire à venir"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Fête"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Partage sa position"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nouvelle story"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Regarde une vidéo"</string>
<string name="audio_status" msgid="4237055636967709208">"Écoute"</string>
<string name="game_status" msgid="1340694320630973259">"Joue"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amis"</string>
<string name="empty_status" msgid="5938893404951307749">"Chattez ce soir !"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Appel manqué"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ de <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Voir les messages récents, les appels manqués et les notifications d\'état"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Appuyer pour en savoir plus"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Pas d\'alarme définie"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 020e4b0..eeacc9f 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ignorar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca o sensor de impresión dixital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icona de impresión dixital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Non se recoñeceu a cara. Usa a impresión dixital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utiliza a túa impresión dixital para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Non se puido recoñecer a impresión dixital. Mellor usa o bloqueo de pantalla."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Buscándote…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icona de cara"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botón de zoom de compatibilidade"</string>
@@ -605,9 +602,9 @@
<string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"A pantalla manterase visible ata que deixes de fixala. Para facelo, mantén premido Inicio."</string>
<string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Pódese acceder aos datos persoais (por exemplo, os contactos e o contido dos correos electrónicos)."</string>
<string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"As aplicacións fixadas poden abrir outras aplicacións."</string>
- <string name="screen_pinning_toast" msgid="8177286912533744328">"Para soltar esta aplicación, mantén premidos os botóns Atrás e Visión xeral"</string>
- <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para soltar esta aplicación, mantén premidos os botóns Atrás e Inicio"</string>
- <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para soltar esta aplicación, pasa o dedo cara arriba e mantena premida"</string>
+ <string name="screen_pinning_toast" msgid="8177286912533744328">"Para deixar de fixar esta aplicación, mantén premidos os botóns Atrás e Visión xeral"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para deixar de fixar esta aplicación, mantén premidos os botóns Atrás e Inicio"</string>
+ <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para deixar de fixar esta aplicación, pasa o dedo cara arriba e mantena premida"</string>
<string name="screen_pinning_positive" msgid="3285785989665266984">"De acordo"</string>
<string name="screen_pinning_negative" msgid="6882816864569211666">"Non, grazas"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"Fixouse a aplicación"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de traballo"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Estado:</b> o nivel diminuíuse a Silencioso"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Estado:</b> clasificouse nun nivel superior"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Estado:</b> clasificouse nun nivel inferior"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstranse na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Aquí non se pode configurar este grupo de notificacións"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Para actualizar a navegación do sistema, vai a Configuración"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa definiuse como prioritaria"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritarias farán o seguinte:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostraranse na parte superior da sección de conversas"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrarán a imaxe do perfil na pantalla de bloqueo"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Mostrar como burbulla flotante sobre outras apps"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper modo Non molestar"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuración"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Cambiar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"O botón de accesibilidade substituíu o xesto de accesibilidade\n\n"<annotation id="link">"Ver configuración"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Para ocultar temporalmente o botón, móveo ata o bordo"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engade controis para os dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar o control de dispositivos"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca unha conversa para engadila á pantalla de inicio"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Volve aquí despois de recibir mensaxes"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversas prioritarias"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversas recentes"</string>
+ <string name="okay" msgid="6490552955618608554">"De acordo"</string>
<string name="timestamp" msgid="6577851592534538533">"Hai <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Hai menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hai máis de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Aniversario"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Aniversario a caer"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aniversario"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Compartindo localiz."</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nova historia"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Vendo vídeo"</string>
<string name="audio_status" msgid="4237055636967709208">"Escoitando"</string>
<string name="game_status" msgid="1340694320630973259">"Xogando"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Chateamos á noite?"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Chamada perdida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ de <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta as mensaxes recentes, as chamadas perdidas e as actualizacións dos estados"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Produciuse un problema ao ler o medidor da batería"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca para obter máis información"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Sen alarmas postas"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index fd3c0ee..57bbb08 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"છોડી દો"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ફિંગરપ્રિન્ટનું આઇકન"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ચહેરો ઓળખી શકતા નથી. તેને બદલે ફિંગરપ્રિન્ટ વાપરો."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"આગળ વધવા માટે તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ફિંગરપ્રિન્ટ ઓળખી શકતા નથી. તેને બદલે સ્ક્રીન લૉકનો ઉપયોગ કરો."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"તમારા માટે શોધી રહ્યાં છે..."</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ચહેરા આઇકન"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"સુસંગતતા ઝૂમ બટન."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"તૈયાર છે"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ઑફિસની પ્રોફાઇલ"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>સ્ટેટસ:</b> સાઇલન્ટ પર અવનત કરવામાં આવ્યું"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>સ્ટેટસ:</b> ઉપલી રેંક આપવામાં આવી"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>સ્ટેટસ:</b> નીચલી રેંક આપવામાં આવી"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"એને વાતચીત વિભાગની ટોચ પર બતાવે છે, તરતા બબલ તરીકે દેખાય છે, લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટા તરીકે બતાવે છે"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીતની સુવિધાઓને સપોર્ટ આપતી નથી"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"વાતચીતને પ્રાધાન્યતા ધરાવતી તરીકે સેટ કરી"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"પ્રાધાન્યતા ધરાવતી વાતચીતો:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"વાતચીત વિભાગની ટોચ પર બતાવો"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટો બતાવો"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ઍપની ટોચ પર તરતા બબલ તરીકે દેખાય છે"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ખલેલ પાડશો નહીં સેટિંગમાં હસ્તક્ષેપ કરી શકે છે"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"સમજાઈ ગયું"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"સેટિંગ"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"સ્વિચ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ઍક્સેસિબિલિટી સંકેતને ઍક્સેસિબિલિટી બટન વડે બદલવામાં આવ્યા છે\n\n"<annotation id="link">"સેટિંગ જુઓ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"તેને હંગામી રૂપે ખસેડવા માટે બટનને કિનારી પર ખસેડો"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ડિવાઇસનાં નિયંત્રણો"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"તમારા કનેક્ટ કરેલા ડિવાઇસ માટે નિયંત્રણો ઉમેરો"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ડિવાઇસનાં નિયંત્રણો સેટઅપ કરો"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"વાતચીતના વિજેટ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"તમારી હોમ સ્ક્રીનમાં વાતચીત ઉમેરવા માટે તેના પર ટૅપ કરો"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"એકવાર તમને અમુક સંદેશા મળે પછી ફરીથી અહીં ચેક કરો"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"પ્રાધાન્યતા ધરાવતી વાતચીતો"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"તાજેતરની વાતચીતો"</string>
+ <string name="okay" msgid="6490552955618608554">"ઓકે"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> પહેલાં"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>થી ઓછા સમય પહેલાં"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> કરતાં વધુ સમય પહેલાં"</string>
<string name="birthday_status" msgid="2596961629465396761">"જન્મદિવસ"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"જલ્દી જ જન્મદિવસ છે"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"વર્ષગાંઠ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"સ્થાન શેર કરીએ છીએ"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"નવી સ્ટોરી"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"જોઈ રહ્યાં છે"</string>
<string name="audio_status" msgid="4237055636967709208">"સાંભળી રહ્યાં છીએ"</string>
<string name="game_status" msgid="1340694320630973259">"રમી રહ્યાં છે"</string>
<string name="empty_user_name" msgid="3389155775773578300">"મિત્રો"</string>
<string name="empty_status" msgid="5938893404951307749">"આજે રાતે ચૅટ કરીએ!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"ચૂકી ગયેલો કૉલ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"તાજેતરના મેસેજ, ચૂકી ગયેલા કૉલ અને સ્ટેટસ અપડેટ જુઓ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"વાતચીત"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"વધુ માહિતી માટે ટૅપ કરો"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"કોઈ અલાર્મ સેટ નથી"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 4e796fe..de5741c 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -89,7 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"बदलाव करें"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट में बदलाव करें"</string>
- <string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा जानकारी कैप्चर करें"</string>
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा कॉन्टेंट कैप्चर करें"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"स्क्रीनशॉट को ऊपर से काटने की सीमा"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"खारिज करें"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फ़िंगरप्रिंट सेंसर को छुएं"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"फ़िंगरप्रिंट आइकॉन"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरे की पहचान नहीं हुई. फ़िंगरप्रिंट इस्तेमाल करें."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"जारी रखने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"फ़िंगरप्रिंट पहचाना नहीं जा सका. इसके बजाय, स्क्रीन लॉक इस्तेमाल करके देखें."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"आपको पहचान रहा है…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"चेहरे का आइकॉन"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"संगतता ज़ूम बटन."</string>
@@ -505,7 +502,7 @@
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> का इस्तेमाल करके रिकॉर्ड और कास्ट करना शुरू करें?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सभी को हटाएं"</string>
- <string name="manage_notifications_text" msgid="6885645344647733116">"प्रबंधित करें"</string>
+ <string name="manage_notifications_text" msgid="6885645344647733116">"मैनेज करें"</string>
<string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string>
<string name="notification_section_header_incoming" msgid="850925217908095197">"नई सूचनाएं"</string>
<string name="notification_section_header_gentle" msgid="6804099527336337197">"बिना आवाज़ किए मिलने वाली सूचनाएं"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ईथरनेट"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
<string name="wallet_title" msgid="5369767670735827105">"वॉलेट"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"तैयार"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"सभी दिखाएं"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"पेमेंट करने के लिए, डिवाइस अनलॉक करें"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"तैयार है"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"पेमेंट करने का तरीका सेट अप करें"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"इस्तेमाल करने के लिए, डिवाइस अनलॉक करें"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"आपके कार्ड की जानकारी पाने में कोई समस्या हुई है. कृपया बाद में कोशिश करें"</string>
<string name="status_bar_work" msgid="5238641949837091056">"वर्क प्रोफ़ाइल"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"हवाई जहाज़ मोड"</string>
<string name="add_tile" msgid="6239678623873086686">"टाइल जोड़ें"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>स्थिति:</b> लेवल घटाकर, साइलेंट पर सेट किया गया"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>स्थिति:</b> रैंकिंग में ऊपर किया गया"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>स्थिति:</b> रैंकिंग में नीचे किया गया"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे चैट, बातचीत सेक्शन में सबसे ऊपर फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"प्राथमिकता मोड चालू होने के बावजूद, यह आपकी सूचनाओं में हमेशा सबसे ऊपर दिखता है"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"अहम बातचीत"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर बातचीत की सुविधाएं काम नहीं करतीं"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"बातचीत को \'अहम बातचीत\' के तौर पर सेट किया गया है"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"अहम बातचीत यहां दिखेगी:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"बातचीत सेक्शन में सबसे ऊपर दिखाएं"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखाएं"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"खास बातचीत फ़्लोटिंग बबल की तरह ऐप्लिकेशन के ऊपर दिखेंगी"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"अहम बातचीत"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"ये बातचीत आपकी सूची में सबसे ऊपर दिखती हैं और प्राथमिकता मोड चालू होने पर, हमेशा आप तक पहुंच सकती हैं"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"प्रोफ़ाइल फ़ोटो, लॉक स्क्रीन पर दिखती हैं"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"आप इन बातचीत को अपनी होम स्क्रीन पर मौजूद बबल्स में, आसानी से देख सकते हैं"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'परेशान न करें\' मोड में रुकावट"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ठीक है"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिंग"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"स्विच"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"सुलभता वाले हाथ के जेस्चर (हाव-भाव) को सुलभता बटन से बदल दिया गया है\n\n"<annotation id="link">"सेटिंग देखें"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"बटन को कुछ समय छिपाने के लिए, उसे किनारे पर ले जाएं"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"सबसे ऊपर बाईं ओर ले जाएं"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"सबसे ऊपर दाईं ओर ले जाएं"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"सबसे नीचे बाईं ओर ले जाएं"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"सबसे नीचे दाईं ओर ले जाएं"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"एज पर ले जाएं और छिपाएं"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"एज से निकालें और दिखाएं"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस कंट्रोल"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"डिवाइस कंट्रोल सेट अप करें"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"ऐसी बातचीत जिसमें इंटरैक्शन डेटा मौजूद नहीं है"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"बातचीत विजेट"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"किसी बातचीत को होम स्क्रीन पर जोड़ने के लिए, उस बातचीत पर टैप करें"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"नए मैसेज पाने के लिए, यहां नज़र रखें"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"अहम बातचीत"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"हाल ही में की गई बातचीत"</string>
+ <string name="okay" msgid="6490552955618608554">"ठीक है"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पहले"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> से थोड़ा पहले"</string>
<string name="over_timestamp" msgid="4765793502859358634">"करीब <xliff:g id="DURATION">%1$s</xliff:g> से ज़्यादा"</string>
<string name="birthday_status" msgid="2596961629465396761">"जन्मदिन"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"आज <xliff:g id="NAME">%1$s</xliff:g> का जन्मदिन है"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"जन्मदिन आने वाला है"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"<xliff:g id="NAME">%1$s</xliff:g> का जन्मदिन जल्द आ रहा है"</string>
<string name="anniversary_status" msgid="1790034157507590838">"सालगिरह"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"<xliff:g id="NAME">%1$s</xliff:g> की सालगिरह है"</string>
<string name="location_status" msgid="1294990572202541812">"जगह की जानकारी शेयर की जा रही है"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> जगह की जानकारी शेयर कर रहे/रही हैं"</string>
<string name="new_story_status" msgid="9012195158584846525">"नई स्टोरी"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> ने एक नई स्टोरी शेयर की है"</string>
<string name="video_status" msgid="4548544654316843225">"देख रहे हैं"</string>
<string name="audio_status" msgid="4237055636967709208">"सुना जा रहा है"</string>
<string name="game_status" msgid="1340694320630973259">"खेला जा रहा है"</string>
<string name="empty_user_name" msgid="3389155775773578300">"दोस्त"</string>
<string name="empty_status" msgid="5938893404951307749">"आज रात चैट करते हैं!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"कॉन्टेंट जल्द ही दिखेगा"</string>
<string name="missed_call" msgid="4228016077700161689">"मिस्ड कॉल"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"हाल के मैसेज, मिस्ड कॉल, और स्टेटस अपडेट देखें"</string>
<string name="people_tile_title" msgid="6589377493334871272">"बातचीत"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ने एक मैसेज भेजा है"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ने एक इमेज भेजी है"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ज़्यादा जानकारी के लिए टैप करें"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"कोई अलार्म सेट नहीं है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 39bef2b..cc04dc0 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Odbaci"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor otiska prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona otiska prsta"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Prepoznavanje lica nije uspjelo. Upotrijebite otisak prsta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Nastavite pomoću otiska prsta"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Prepoznavanje otiska prsta nije uspjelo. Umjesto toga upotrebljavajte zaključavanje zaslona."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Tražimo vas…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona lica"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Gumb za kompatibilnost zumiranja."</string>
@@ -454,7 +451,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Otključajte da biste upotrijebili NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ovaj uređaj pripada vašoj organizaciji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Ovaj uređaj pruža organizacija <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Ovaj uređaj pruža <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Prijeđite prstom od ikone za telefon"</string>
<string name="voice_hint" msgid="7476017460191291417">"Prijeđite prstom od ikone za glasovnu pomoć"</string>
<string name="camera_hint" msgid="4519495795000658637">"Prijeđite prstom od ikone za fotoaparat"</string>
@@ -539,7 +536,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vaš poslovni profil povezan je s mrežom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Vaš osobni profil povezan je s mrežom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Ovaj uređaj povezan je s mrežom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Ovaj uređaj pruža organizacija <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Ovaj uređaj pruža <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Upravljanje uređajem"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Nadzor profila"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Nadzor mreže"</string>
@@ -550,8 +547,8 @@
<string name="disconnect_vpn" msgid="26286850045344557">"Prekini vezu s VPN-om"</string>
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Prikaži pravila"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Prikaz kontrola"</string>
- <string name="monitoring_description_named_management" msgid="505833016545056036">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVaš IT administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se IT administratoru."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> možda može pristupiti podacima povezanim s ovim uređajem, upravljati aplikacijama i promijeniti postavke uređaja.\n\nAko imate pitanja, obratite se organizaciji <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_description_named_management" msgid="505833016545056036">"Vlasnik ovog uređaja je <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVaš IT administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se IT administratoru."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> možda može pristupiti podacima povezanim s ovim uređajem, upravljati aplikacijama i promijeniti postavke uređaja.\n\nAko imate pitanja, obratite se tvrtki <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Ovaj uređaj pripada vašoj organizaciji.\n\nVaš IT administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se IT administratoru."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Vaša je organizacija instalirala izdavač certifikata na ovom uređaju. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Vaša je organizacija instalirala izdavač certifikata na vašem radnom profilu. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string>
@@ -667,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Poslovni profil"</string>
@@ -738,9 +740,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> prebačena u bešumnu"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> više rangirana"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> niže rangirana"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se pri vrhu odjeljka razgovora kao pomični oblačić i prikazuje profilnu sliku na zaključanom zaslonu"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava značajke razgovora"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ta se grupa obavijesti ne može konfigurirati ovdje"</string>
@@ -1016,10 +1020,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Navigaciju sustavom možete ažurirati u Postavkama"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Razgovor postavljen na prioritetan"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetni razgovori:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuju se pri vrhu odjeljka razgovora"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuju profilnu sliku na zaključanom zaslonu"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuje se kao lebdeći oblačić iznad aplikacija"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida Ne uznemiravaj"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Shvaćam"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string>
@@ -1037,6 +1045,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prebacivanje"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Gumb za Pristupačnost zamijenio je pokret pristupačnosti\n\n"<annotation id="link">"Prikaz postavki"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Pomaknite gumb do ruba da biste ga privremeno sakrili"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodavanje kontrola za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavljanje kontrola uređaja"</string>
@@ -1108,31 +1128,43 @@
<string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgeti razgovora"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da biste ga dodali na početni zaslon"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Ponovno provjerite ovdje kad dobijete poruke"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritetni razgovori"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nedavni razgovori"</string>
+ <string name="okay" msgid="6490552955618608554">"U redu"</string>
<string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Rođendan"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Rođendan uskoro"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Godišnjica"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Dijeljenje lokacije"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Novi članak"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Gledanje"</string>
<string name="audio_status" msgid="4237055636967709208">"Slušanje"</string>
<string name="game_status" msgid="1340694320630973259">"Igranje"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Prijatelji"</string>
<string name="empty_status" msgid="5938893404951307749">"Može chat večeras?"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Propušteni poziv"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem s očitavanjem mjerača baterije"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nema nijednog alarma"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 229ddca..132134a5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Elvetés"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Érintse meg az ujjlenyomat-érzékelőt"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ujjlenyomat ikonja"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Az arc nem felismerhető. Használjon ujjlenyomatot."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"A folytatáshoz használja ujjlenyomatát"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Az ujjlenyomat nem ismerhető fel. Használja inkább a képernyőzárat."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Keresem az Ön arcát…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Arcikon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Kompatibilitási zoom gomb."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Kész"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Munkahelyi profil"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Állapot:</b> némára állítva"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Állapot:</b> előrébb sorolva"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Állapot:</b> hátrébb sorolva"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"A beszélgetések szakaszának tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem támogatja a beszélgetési funkciókat"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Az értesítések jelen csoportját itt nem lehet beállítani"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Fontosnak beállított beszélgetés"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"A fontos beszélgetések:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"A beszélgetések szakaszának tetején jelennek meg"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Megjelenítik a profilképet a lezárási képernyőn"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Buborékként jelennek meg az alkalmazások felett"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Megszakítják a Ne zavarjanak módot"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Értem"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Beállítások"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Váltás"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"A kisegítő kézmozdulat helyébe a Kisegítő lehetőségek gomb lépett\n\n"<annotation id="link">"Beállítások megtekintése"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"A gombot a szélre áthelyezve ideiglenesen elrejtheti"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Eszközvezérlők"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Vezérlők hozzáadása a csatlakoztatott eszközökhöz"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Eszközvezérlők beállítása"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Beszélgetés megnyitása"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Beszélgetési modulok"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Koppintson a kívánt beszélgetésre a kezdőképernyőre való felvételhez"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Térjen vissza ide, miután kapott néhány üzenetet"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Fontos beszélgetések"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Legutóbbi beszélgetések"</string>
+ <string name="okay" msgid="6490552955618608554">"Rendben"</string>
<string name="timestamp" msgid="6577851592534538533">"Ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kevesebb, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Több, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Születésnap"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Közelgő születésnap"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Évforduló"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Hely megosztása"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Új történet"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Lejátszás"</string>
<string name="audio_status" msgid="4237055636967709208">"Figyelés"</string>
<string name="game_status" msgid="1340694320630973259">"Játékban"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Ismerősök"</string>
<string name="empty_status" msgid="5938893404951307749">"Beszélgessünk egyet!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Nem fogadott hívás"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Megtekintheti a legutóbbi üzeneteket, a nem fogadott hívásokat és az állapotfrissítéseket."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Beszélgetés"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probléma merült fel az akkumulátor-töltésmérő olvasásakor"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Koppintással további információkat érhet el."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nincs ébresztés"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 59eefc1..04a3267 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4811759950673118541">"Համակարգային UI"</string>
+ <string name="app_label" msgid="4811759950673118541">"Համակարգի ինտերֆեյս"</string>
<string name="status_bar_clear_all_button" msgid="2491321682873657397">"Մաքրել"</string>
<string name="status_bar_no_notifications_title" msgid="7812479124981107507">"Ծանուցումներ չկան"</string>
<string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"Ընթացիկ"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Փակել"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Հպեք մատնահետքի սկաներին"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Մատնահետքի պատկերակ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Դեմքը չի հաջողվում ճանաչել։ Օգտագործեք մատնահետքը։"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Շարունակելու համար անհրաժեշտ է ձեր մատնահետքը"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Մատնահետքը չի հաջողվում ճանաչել։ Օգտագործեք էկրանի կողպումը։"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Դեմքի ճանաչում…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Դեմքի պատկերակ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Համատեղելիության խոշորացման կոճակը:"</string>
@@ -542,7 +539,7 @@
<string name="monitoring_title" msgid="4063890083735924568">"Ցանցի մշտադիտարկում"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
<string name="monitoring_subtitle_network_logging" msgid="2444199331891219596">"Ցանցի իրադարձությունների գրանցում"</string>
- <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"ՎԿ հավաստագրեր"</string>
+ <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"CA հավաստագրեր"</string>
<string name="disable_vpn" msgid="482685974985502922">"Անջատել VPN-ը"</string>
<string name="disconnect_vpn" msgid="26286850045344557">"Անջատել VPN-ը"</string>
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Դիտել քաղաքականությունները"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Պատրաստ է"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Android for Work-ի պրոֆիլ"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Կարգավիճակը․</b> իջեցվել է և դարձել անձայն"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Կարգավիճակը․</b> կարևորության մակարդակը բարձրացվել է"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Կարգավիճակը․</b> կարևորության մակարդակն իջեցվել է"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ցուցադրվում է զրույցների ցանկի վերևում, հայտնվում է լողացող ամպիկի տեսքով, ցուցադրում է պրոֆիլի նկարը կողպէկրանին"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը զրույցի գործառույթներ չի աջակցում"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Զրույցը նշված է որպես կարևոր"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Կարևոր զրույցները՝"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Ցուցադրել զրույցների ցանկի վերևում"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ցուցադրել պրոֆիլի նկարը կողպէկրանին"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Հայտնվում են որպես լողացող ամպիկ հավելվածների վրայից"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ընդհատել «Չանհանգստացնել» ռեժիմը"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Եղավ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Կարգավորումներ"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Փոխել"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Հատուկ գործառույթների ժեստը փոխարինվել է կոճակով\n\n"<annotation id="link">"Բացել կարգավորումները"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Կոճակը ժամանակավորապես թաքցնելու համար այն տեղափոխեք էկրանի եզր"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Սարքերի կառավարման տարրեր"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ավելացրեք կառավարման տարրեր ձեր միացված սարքերի համար"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Սարքերի կառավարման տարրերի կարգավորում"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Բաց զրույց"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Զրույցի վիջեթներ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Հպեք զրույցին՝ այն հիմնական էկրանին ավելացնելու համար"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Վերադարձեք այստեղ, երբ որևէ հաղորդագրություն ստանաք"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Կարևոր զրույցներ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Վերջին հաղորդագրությունները"</string>
+ <string name="okay" msgid="6490552955618608554">"Եղավ"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Առավելագույնը <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ավելի քան <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
<string name="birthday_status" msgid="2596961629465396761">"Ծննդյան օր"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Շուտով ծննդյանս օրն է"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Տարեդարձ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Տեղադրության ցուցադրում"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Նոր հոդված"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Տեսանյութ եմ դիտում"</string>
<string name="audio_status" msgid="4237055636967709208">"Բան եմ լսում"</string>
<string name="game_status" msgid="1340694320630973259">"Խաղ եմ խաղում"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Ընկերներ"</string>
<string name="empty_status" msgid="5938893404951307749">"Արի այսօր զրուցենք"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Բաց թողնված զանգ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Տեսեք վերջին հաղորդագրությունները, բաց թողնված զանգերը և կարգավիճակի մասին թարմացումները"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Զրույց"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Հպեք՝ ավելին իմանալու համար"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Զարթուցիչ դրված չէ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 33df4ef..2f2385c 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Tutup"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sentuh sensor sidik jari"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikon sidik jari"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak dapat mengenali wajah. Gunakan sidik jari."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Gunakan sidik jari untuk melanjutkan"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Tidak dapat mengenali sidik jari. Gunakan kunci layar."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Mencari wajah Anda…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikon wajah"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Tombol perbesar/perkecil kompatibilitas."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Siap"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil kerja"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Didemosikan menjadi Senyap"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Diberi Peringkat Lebih Tinggi"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Diberi Peringkat Lebih Rendah"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Muncul di atas bagian percakapan, ditampilkan sebagai balon yang mengambang, menampilkan gambar profil di layar kunci"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setelan"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung fitur percakapan"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Grup notifikasi ini tidak dapat dikonfigurasi di sini"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Buka Setelan untuk mengupdate navigasi sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Percakapan ditetapkan jadi prioritas"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Percakapan prioritas akan:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Muncul di atas bagian percakapan"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Menampilkan gambar profil di layar kunci"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Muncul sebagai balon mengambang di atas aplikasi"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Mengganggu fitur Jangan Ganggu"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Oke"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setelan"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Alihkan"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Tombol aksesibilitas menggantikan gestur aksesibilitas\n\n"<annotation id="link">"Tampilkan setelan"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Pindahkan tombol ke tepi agar tersembunyi untuk sementara"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrol perangkat"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambahkan kontrol untuk perangkat terhubung"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Siapkan kontrol perangkat"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Membuka percakapan"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widget Percakapan"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ketuk percakapan untuk menambahkannya ke Layar utama"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Periksa kembali setelah Anda mendapatkan pesan"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Percakapan prioritas"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Percakapan terbaru"</string>
+ <string name="okay" msgid="6490552955618608554">"Oke"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kurang dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Lebih dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="birthday_status" msgid="2596961629465396761">"Ulang Tahun"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Ulang tahun segera"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Hari Peringatan"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Berbagi lokasi"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Story baru"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Menonton"</string>
<string name="audio_status" msgid="4237055636967709208">"Mendengarkan"</string>
<string name="game_status" msgid="1340694320630973259">"Bermain"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Teman"</string>
<string name="empty_status" msgid="5938893404951307749">"Ayo chat malam ini."</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Panggilan tak terjawab"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Melihat pesan terbaru, panggilan tak terjawab, dan pembaruan status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Percakapan"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Terjadi masalah saat membaca indikator baterai"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketuk untuk informasi selengkapnya"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm tidak disetel"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 8498676..6d412ec 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Tilbúið"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Vinnusnið"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Staða:</b> var gerð þögul"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Staða:</b> fékk hærri stöðu"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Staða:</b> fékk lægri stöðu"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Birtist efst í samtalshluta, birtist sem fljótandi blaðra, birtir prófílmynd á lásskjánum"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki samtalseiginleika"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ekki er hægt að stilla þessar tilkynningar hér"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Samtal sett í forgang"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Forgangssamtöl munu:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Birtast efst í samtalshluta"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Sýna prófílmynd á lásskjá"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Birta sem fljótandi blöðru yfir forritum"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Stöðva „Ónáðið ekki“"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ég skil"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Stillingar"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Rofi"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Aðgengishnappur kom í stað aðgengisbendingar\n\n"<annotation id="link">"Skoða stillingar"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Færðu hnappinn að brúninni til að fela hann tímabundið"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Tækjastjórnun"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bæta við stýringum fyrir tengd tæki"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Setja upp tækjastjórnun"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Fyrir minna en <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Fyrir meira en <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Afmæli"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Afmæli á næstunni"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Brúðkaupsafmæli"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Deilir staðsetningu"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Ný frétt"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Að horfa"</string>
<string name="audio_status" msgid="4237055636967709208">"Hlustar"</string>
<string name="game_status" msgid="1340694320630973259">"Spilar"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Vinir"</string>
<string name="empty_status" msgid="5938893404951307749">"Spjöllum í kvöld!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Ósvarað símtal"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Sjá nýleg skilboð, ósvöruð símtöl og stöðuuppfærslur"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtal"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Vandamál við að lesa stöðu rafhlöðu"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ýttu til að fá frekari upplýsingar"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Enginn vekjari"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 306ce1f..e46ce8d 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -545,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Visualizza le norme"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Visualizza controlli"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Questo dispositivo appartiene a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nIl tuo amministratore IT può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta il tuo amministratore IT."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> potrebbe riuscire ad accedere ai dati associati a questo dispositivo, a gestire app e a modificare le impostazioni del dispositivo.\n\nPer eventuali domande, contatta <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> è in grado di accedere ai dati associati a questo dispositivo, di gestire le app e di modificare le impostazioni del dispositivo.\n\nPer eventuali domande, contatta <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Questo dispositivo appartiene alla tua organizzazione.\n\nIl tuo amministratore IT può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta il tuo amministratore IT."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"La tua organizzazione ha installato un\'autorità di certificazione sul dispositivo. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"La tua organizzazione ha installato un\'autorità di certificazione nel tuo profilo di lavoro. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string>
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profilo di lavoro"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stato:</b> retrocessa a Silenziosa"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Stato:</b> posizionata più in alto"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stato:</b> posizionata più in basso"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Appare in cima alla sezione delle conversazioni e sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Qui non è possibile configurare questo gruppo di notifiche"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Usa le Impostazioni per aggiornare la navigazione del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversazione impostata come prioritaria"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Le conversazioni prioritarie:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Appaiono in cima alla sezione delle conversazioni"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrano l\'immagine del profilo sulla schermata di blocco"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vengono mostrate come bolle mobili sopra le app"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompono la modalità Non disturbare"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Impostazioni"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Opzione"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Il pulsante Accessibilità ha sostituito il gesto di accessibilità\n\n"<annotation id="link">"Visualizza le impostazioni"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Sposta il pulsante fino al bordo per nasconderlo temporaneamente"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controllo dei dispositivi"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Aggiungi controlli per i dispositivi connessi"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura il controllo dei dispositivi"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Meno di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Più di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string>
<string name="birthday_status" msgid="2596961629465396761">"Compleanno"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Compleanno imminente"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Anniversario"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Condivis. posizione"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nuova notizia"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Visione in corso"</string>
<string name="audio_status" msgid="4237055636967709208">"Ascolto in corso"</string>
<string name="game_status" msgid="1340694320630973259">"Gioco in corso"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amici"</string>
<string name="empty_status" msgid="5938893404951307749">"Chattiamo stasera."</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Chiamata persa"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Visualizza messaggi recenti, chiamate senza risposta e aggiornamenti dello stato"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversazione"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema durante la lettura dell\'indicatore di livello della batteria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tocca per ulteriori informazioni"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nessuna sveglia"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 8f00b73..4ba43e1 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"סגירה"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"יש לגעת בחיישן טביעות האצבע"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"סמל טביעת אצבע"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"לא ניתן לזהות את הפנים. יש להשתמש בטביעת אצבע במקום."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"יש להשתמש בטביעת האצבע כדי להמשיך"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"לא ניתן לזהות את טביעת האצבע. יש להשתמש בנעילת המסך במקום."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"מתבצע חיפוש…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"סמל הפנים"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"לחצן מרחק מתצוגה של תאימות."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"מוכן"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"פרופיל עבודה"</string>
@@ -741,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>הסטטוס:</b> הורד בדרגה ל\'שקט\'"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>הסטטוס:</b> דורג גבוה יותר"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>הסטטוס:</b> דורג נמוך יותר"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"מוצגת בחלק העליון של קטע התראות השיחה, מופיעה בבועה צפה, תוצג תמונת פרופיל במסך הנעילה"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בתכונות השיחה"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"לא ניתן להגדיר כאן את קבוצת ההתראות הזו"</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"השיחה הוגדרה כבעלת עדיפות גבוהה"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"שיחות בעדיפות גבוהה:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"מופיעות בחלק העליון של קטע השיחות"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"מציגות תמונת פרופיל במסך הנעילה"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"מופיעות כבועה צפה מעל האפליקציות שלך"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"גוברות על ההגדרה \'נא לא להפריע\'"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"הבנתי"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"הגדרות"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"מעבר"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"לחצן הנגישות החליף את תנועת הנגישות\n\n"<annotation id="link">"להצגת ההגדרות"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"כדי להסתיר זמנית את הלחצן, יש להזיז אותו לקצה"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"פקדי מכשירים"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"יש להוסיף פקדים למכשירים המחוברים"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"הגדרה של פקדי מכשירים"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"פתיחת שיחה"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ווידג\'טים של שיחות"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"יש להקיש על שיחה כדי להוסיף אותה למסך הבית"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"אפשר לחזור לכאן ולהתעדכן לאחר קבלת מספר הודעות"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"שיחות בעדיפות גבוהה"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"שיחות אחרונות"</string>
+ <string name="okay" msgid="6490552955618608554">"בסדר"</string>
<string name="timestamp" msgid="6577851592534538533">"לפני <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"לפני פחות מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"לפני יותר מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"יום הולדת"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"יום הולדת יחול בקרוב"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"יום השנה"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"המיקום משותף"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"סטורי חדש"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"צפייה"</string>
<string name="audio_status" msgid="4237055636967709208">"מתבצעת האזנה"</string>
<string name="game_status" msgid="1340694320630973259">"במשחק פעיל"</string>
<string name="empty_user_name" msgid="3389155775773578300">"חברים"</string>
<string name="empty_status" msgid="5938893404951307749">"אפשר לצ\'וטט הערב!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"שיחה שלא נענתה"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ההודעות האחרונות, שיחות שלא נענו ועדכוני סטטוס"</string>
<string name="people_tile_title" msgid="6589377493334871272">"שיחה"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"בעיה בקריאת מדדי הסוללה"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"יש להקיש כדי להציג מידע נוסף"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"לא הוגדרה התראה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index bbd7543..d646f05 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -175,7 +175,7 @@
<string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"間違えた回数が上限を超えました。このユーザーが削除されます。"</string>
<string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"間違えた回数が上限を超えました。この仕事用プロファイルと関連データが削除されます。"</string>
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"閉じる"</string>
- <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"指紋認証センサーをタップ"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"指紋認証センサーをタッチ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"指紋アイコン"</string>
<string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"顔を認識できません。指紋認証を使用してください。"</string>
<string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"続行するには指紋認証を使用してください"</string>
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"準備完了"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"仕事用プロファイル"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ステータス:</b> ランクがサイレントに下がりました"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ステータス:</b> ランクが上がりました"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ステータス:</b> ランクが下がりました"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"会話セクションの一番上にバブルとして表示され、プロフィール写真がロック画面に表示されます"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> は会話機能に対応していません"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"このグループの通知はここでは設定できません"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"システム ナビゲーションを更新するには [設定] に移動してください"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"優先度を高く設定された会話"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先度の高い会話は、次のように表示されます。"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"会話セクションの一番上にバブルで表示"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ロック画面にプロフィール写真を表示"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"他のアプリに重ねてフローティング バブルとして表示"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"サイレント モードが ON でも表示"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"スイッチ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ユーザー補助ジェスチャーに代わって、ユーザー補助機能ボタンが導入されました\n\n"<annotation id="link">"設定を表示"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ボタンを一時的に非表示にするには端に移動させてください"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"デバイス コントロール"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"接続済みデバイスのコントロールを追加します"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"デバイス コントロールの設定"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>前まで"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>以上前"</string>
<string name="birthday_status" msgid="2596961629465396761">"誕生日"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"もうすぐ誕生日"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"記念日"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"現在地を共有中"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"新しいストーリー"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"視聴中"</string>
<string name="audio_status" msgid="4237055636967709208">"再生中"</string>
<string name="game_status" msgid="1340694320630973259">"プレイ中"</string>
<string name="empty_user_name" msgid="3389155775773578300">"友だち"</string>
<string name="empty_status" msgid="5938893404951307749">"今夜、チャットしよう"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"不在着信"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> 件以上"</string>
<string name="people_tile_description" msgid="8154966188085545556">"最近のメッセージ、不在着信、最新のステータスが表示されます"</string>
<string name="people_tile_title" msgid="6589377493334871272">"会話"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"電池残量の読み込み中に問題が発生しました"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"タップすると詳細が表示されます"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"アラーム未設定"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index bd65529..6461837 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"დახურვა"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"შეეხეთ თითის ანაბეჭდის სენსორს"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"თითის ანაბეჭდის ხატულა"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"სახის ამოცნობა ვერ ხერხდება. სანაცვლოდ თითის ანაბეჭდი გამოიყენეთ."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"თითის ანაბეჭდის ამოცნობა ვერ ხერხდება. სანაცვლოდ, გამოიყენეთ ეკრანის დაბლოკვა."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"მიმდინარეობს თქვენი ძიება…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"სახის ხატულა"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"თავსებადი მასშტაბირების ღილაკი."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ეთერნეტი"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"მაღვიძარა"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"მზადაა"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"ყველას ჩვენება"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"გადასახდელად განბლოკვა"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"მზადაა"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"გადახდის დაყენება"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"გამოსაყენებლად განბლოკვა"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"თქვენი ბარათების მიღებისას პრობლემა წარმოიშვა. ცადეთ ხელახლა მოგვიანებით"</string>
<string name="status_bar_work" msgid="5238641949837091056">"სამსახურის პროფილი"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"თვითმფრინავის რეჟიმი"</string>
<string name="add_tile" msgid="6239678623873086686">"მოზაიკის დამატება"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>სტატუსი:</b> „უხმო“ სტატუსზე გადასული"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>სტატუსი:</b> უფრო პრიორიტეტული"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>სტატუსი:</b> ნაკლებად პრიორიტეტული"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების ზედა ნაწილში ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"ყოველთვის განთავსებულია შეტყობინების ზემოთ, მაშინაც კი, როცა პრიორიტეტულობის რეჟიმი ჩართულია"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"პრიორიტეტული მიმოწერა"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"მიმოწერა დაყენებულია პრიორიტეტად"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"პრიორიტეტული მიმოწერები:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"მიმოწერის სექციის ზემოთ ჩვენება"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ჩაკეტილ ეკრანზე პროფილის სურათის ჩვენება"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"გამოჩნდება მოლივლივე ბუშტის სახით აპების ზემოდან"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"პრიორიტეტული მიმოწერა"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"ეს მიმოწერა თქვენი სიის ზემოთ არის განთავსებული და ყოველთვის აქტიურდება, როცა პრიორიტეტულობის რეჟიმი ჩართულია"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"პროფილის სურათები ჩაკეტილ ეკრანზე ჩნდება"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"ამ მიმოწერის პოვნა შეგიძლიათ მთავარ ეკრანზე, ბუშტებში"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"„არ შემაწუხოთ“ რეჟიმის შეწყვეტა"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"გასაგებია"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"პარამეტრები"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"გადართვა"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"მარტივი წვდომის ღილაკმა ჩაანაცვლა მარტივი წვდომის ჟესტი\n\n"<annotation id="link">"პარამეტრების ნახვა"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"გადაიტანეთ ღილაკი კიდეში, რათა დროებით დამალოთ ის"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"ზევით და მარცხნივ გადატანა"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"ზევით და მარჯვნივ გადატანა"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"ქვევით და მარცხნივ გადატანა"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ქვემოთ და მარჯვნივ გადატანა"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"კიდეში გადატანა და დამალვა"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"კიდეში გადატანა და გამოჩენა"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"მოწყობილ. მართვის საშუალებები"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"მართვის საშუალებების დამატება თქვენს დაკავშირებულ მოწყობილობებზე"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"მოწყობილობის მართვის საშუალებების დაყენება"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"მიმოწერის გახსნა"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"საუბრის ვიჯეტები"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"შეეხეთ საუბარს მის თქვენს მთავარ ეკრანზე დასამატებლად"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"შეამოწმეთ ეს სივრცე, როცა რაღაც რაოდენობის შეტყობინებებს მიიღებთ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"პრიორიტეტული საუბრები"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ბოლო მიმოწერები"</string>
+ <string name="okay" msgid="6490552955618608554">"კარგი"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>-ს წინ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე ნაკლები ხნის წინ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე მეტი ხნის წინ"</string>
<string name="birthday_status" msgid="2596961629465396761">"დაბადების დღე"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"<xliff:g id="NAME">%1$s</xliff:g> დღეს იუბილარია"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"მალე დაბადების დღეა"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"<xliff:g id="NAME">%1$s</xliff:g> მალე იუბილარი იქნება"</string>
<string name="anniversary_status" msgid="1790034157507590838">"იუბილე"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"იუბილარია <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"მდებარეობა ზიარდება"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> აზიარებს მდებარეობას"</string>
<string name="new_story_status" msgid="9012195158584846525">"ახალი ამბავი"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g>-მ(ა) გააზიარა ახალი ამბავი"</string>
<string name="video_status" msgid="4548544654316843225">"უყურებს"</string>
<string name="audio_status" msgid="4237055636967709208">"მიმდინარეობს მოსმენა"</string>
<string name="game_status" msgid="1340694320630973259">"იკვრება"</string>
<string name="empty_user_name" msgid="3389155775773578300">"მეგობრები"</string>
<string name="empty_status" msgid="5938893404951307749">"მოდით, ვისაუბროთ ამაღამ!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"კონტენტი მალე გამოჩნდება"</string>
<string name="missed_call" msgid="4228016077700161689">"გამოტოვებული ზარი"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ბოლოდროინდელი შეტყობინებების, გამოტოვებული ზარების და სტატუსის განახლებების ნახვა"</string>
<string name="people_tile_title" msgid="6589377493334871272">"მიმოწერა"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g>-მ(ა) შეტყობინება გამოგზავნა"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>-მ(ა) სურათი გამოგზავნა"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"შეეხეთ მეტი ინფორმაციისთვის"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"მაღვიძარა არ არის"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index bbb2161..37f6545 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="4811759950673118541">"Жүйе интерфейсі"</string>
- <string name="status_bar_clear_all_button" msgid="2491321682873657397">"Тазалау"</string>
+ <string name="status_bar_clear_all_button" msgid="2491321682873657397">"Өшіру"</string>
<string name="status_bar_no_notifications_title" msgid="7812479124981107507">"Хабарлар жоқ"</string>
<string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"Ағымдағы"</string>
<string name="status_bar_latest_events_title" msgid="202755896454005436">"Хабарлар"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Жабу"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Саусақ ізін оқу сканерін түртіңіз"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Саусақ ізі белгішесі"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Бет танылмады. Орнына саусақ ізін пайдаланыңыз."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Жалғастыру үшін саусақ ізін пайдаланыңыз."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Саусақ ізі танылмады. Орнына экран құлпын пайдаланыңыз."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Бет ізделуде…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Бет белгішесі"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Үйлесімділік ұлғайту түймесі."</string>
@@ -350,7 +347,7 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="1194988975270484482">"Портрет"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="2000295772687238645">"Пейзаж"</string>
<string name="quick_settings_ime_label" msgid="3351174938144332051">"Енгізу әдісі"</string>
- <string name="quick_settings_location_label" msgid="2621868789013389163">"Орналасу"</string>
+ <string name="quick_settings_location_label" msgid="2621868789013389163">"Локация"</string>
<string name="quick_settings_location_off_label" msgid="7923929131443915919">"Орын өшірулі"</string>
<string name="quick_settings_camera_label" msgid="1367149596242401934">"Камераны бөгеу"</string>
<string name="quick_settings_mic_label" msgid="8245831073612564953">"Микрофон дыбысын өшіру"</string>
@@ -439,7 +436,7 @@
<string name="description_target_search" msgid="3875069993128855865">"Іздеу"</string>
<string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string>
<string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string>
- <string name="zen_priority_introduction" msgid="3159291973383796646">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндарды ести алатын боласыз."</string>
+ <string name="zen_priority_introduction" msgid="3159291973383796646">"Оятқыш, еске салғыш, іс-шара мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойын сияқты медиафайлдарды қоссаңыз, оларды естисіз."</string>
<string name="zen_alarms_introduction" msgid="3987266042682300470">"Дабылдардан басқа ешқандай дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндарды ести алатын боласыз."</string>
<string name="zen_priority_customize_button" msgid="4119213187257195047">"Реттеу"</string>
<string name="zen_silence_introduction_voice" msgid="853573681302712348">"Дабыл, музыка, бейнелер мен ойындарды қоса алғанда, барлық дыбыстар мен дірілдер бөгелетін болады. Қоңырау шала беруіңізге болады."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Дайын"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Жұмыс профилі"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Күйі:</b> \"Үнсіз\" санатына төмендетілген"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Күйі:</b> маңыздылық деңгейі көтерілген"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Күйі:</b> маңыздылық деңгейі төмендетілген"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Әңгімелер бөлімінің жоғарғы жағында тұрады, қалқыма хабар түрінде шығады, құлыптаулы экранда профиль суретін көрсетеді"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Маңызды"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> әңгімелесу функцияларын қолдамайды."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Мұндай хабарландырулар бұл жерде конфигурацияланбайды."</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Әңгіме маңызды деп белгіленді"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Маңызды әңгімелер:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Әңгімелер бөлімінің жоғарғы жағында көрсетіледі."</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профиль суреті құлыптаулы экранда көрсетіледі."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Қолданбалар терезесінің бергі жағынан қалқыма хабарлар түрінде көрсетіледі."</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Мазаламау режимінде көрсетіледі."</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түсінікті"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Параметрлер"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Ауысу"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"\"Арнайы мүмкіндіктер\" түймесінің орнына арнайы мүмкіндіктер қимылы болады.\n\n"<annotation id="link">"Параметрлерді көру"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Түймені уақытша жасыру үшін оны шетке қарай жылжытыңыз."</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Құрылғыны басқару элементтері"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Жалғанған құрылғылар үшін басқару виджеттерін қосу"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Құрылғыны басқару элементтерін реттеу"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Ашық әңгіме"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Әңгіме виджеттері"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Негізгі экранға қосқыңыз келетін әңгімені түртіңіз."</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Хабарлар алғаннан кейін осында оралыңыз."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Маңызды чаттар"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Соңғы чаттар"</string>
+ <string name="okay" msgid="6490552955618608554">"Жарайды"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Максимум <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Кемінде <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
<string name="birthday_status" msgid="2596961629465396761">"Туған күн"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Жақында туған күн"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Мерейтой"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Геодеректер жіберілуде"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Жаңа сюжет"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Көрілуде"</string>
<string name="audio_status" msgid="4237055636967709208">"Тыңдалуда"</string>
<string name="game_status" msgid="1340694320630973259">"Ойнатылуда"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Достар"</string>
<string name="empty_status" msgid="5938893404951307749">"Кешке чатта сөйлесейік!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Өткізіп алған қоңырау"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Соңғы хабарларды, өткізіп алған қоңыраулар мен жаңартылған күйлерді көруге болады."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Әңгіме"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батарея зарядының дерегі алынбай жатыр"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Толығырақ ақпарат алу үшін түртіңіз."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ешқандай оятқыш орнатылмаған."</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index a5e66b2..a0fb09a 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ច្រានចោល"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"រូបស្នាមម្រាមដៃ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"មិនអាចសម្គាល់មុខបានទេ។ សូមប្រើស្នាមម្រាមដៃជំនួសវិញ។"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ប្រើស្នាមម្រាមដៃរបស់អ្នក ដើម្បីបន្ត"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"មិនអាចសម្គាល់ស្នាមម្រាមដៃបានទេ។ សូមប្រើសោអេក្រង់ជំនួសវិញ។"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"កំពុងស្វែងរកអ្នក…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"រូបផ្ទៃមុខ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ប៊ូតុងពង្រីកត្រូវគ្នា។"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"រួចរាល់"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ប្រវត្តិរូបការងារ"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ស្ថានភាព៖</b> បានបញ្ចុះទៅស្ងាត់"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ស្ថានភាព៖</b> បានចាត់ថ្នាក់ខ្ពស់ជាងមុន"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ស្ថានភាព៖</b> បានចាត់ថ្នាក់ទាបជាងមុន"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"បង្ហាញនៅខាងលើផ្នែកសន្ទនា បង្ហាញជាពពុះអណ្ដែត បង្ហាញរូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ការកំណត់"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនអាចប្រើមុខងារសន្ទនាបានទេ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"មិនអាចកំណត់រចនាសម្ព័ន្ធក្រុមការជូនដំណឹងនេះនៅទីនេះបានទេ"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ចូលទៅកាន់ការកំណត់ ដើម្បីធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"បានកំណត់ការសន្ទនាជាអាទិភាព"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ការសន្ទនាជាអាទិភាពនឹង៖"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"បង្ហាញនៅខាងលើផ្នែកសន្ទនា"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"បង្ហាញរូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"បង្ហាញជាពពុះអណ្ដែតនៅផ្នែកខាងលើនៃកម្មវិធី"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ផ្អាកមុខងារកុំរំខាន"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"យល់ហើយ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ការកំណត់"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ប៊ូតុងបិទបើក"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ប៊ូតុងភាពងាយស្រួលបានជំនួសចលនាភាពងាយស្រួល\n\n"<annotation id="link">"មើលការកំណត់"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ផ្លាស់ទីប៊ូតុងទៅគែម ដើម្បីលាក់វាជាបណ្ដោះអាសន្ន"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូលផ្ទាំងគ្រប់គ្រងសម្រាប់ឧបករណ៍ដែលអ្នកបានភ្ជាប់"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"បើកការសន្ទនា"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ធាតុក្រាហ្វិកនៃការសន្ទនា"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ចុចការសន្ទនា ដើម្បីបញ្ចូលវាទៅក្នុងអេក្រង់ដើមរបស់អ្នក"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"ត្រឡប់មកមើលនៅទីនេះវិញ នៅពេលអ្នកទទួលបានសារមួយចំនួន"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ការសន្ទនាអាទិភាព"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ការសន្ទនាថ្មីៗ"</string>
+ <string name="okay" msgid="6490552955618608554">"យល់ព្រម"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"តិចជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
<string name="birthday_status" msgid="2596961629465396761">"ថ្ងៃកំណើត"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ថ្ងៃកំណើតឆាប់ៗនេះ"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"គម្រប់ខួប"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"កំពុងចែករំលែកទីតាំង"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"រឿងថ្មី"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"កំពុងមើល"</string>
<string name="audio_status" msgid="4237055636967709208">"កំពុងស្តាប់"</string>
<string name="game_status" msgid="1340694320630973259">"កំពុងលេង"</string>
<string name="empty_user_name" msgid="3389155775773578300">"មិត្តភ័ក្ដិ"</string>
<string name="empty_status" msgid="5938893404951307749">"តោះជជែកគ្នាយប់នេះ!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"ខកខានទទួល"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"មើលព័ត៌មានថ្មីៗអំពីស្ថានភាព ការខកខានទទួល និងសារថ្មីៗ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ការសន្ទនា"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"មានបញ្ហាក្នុងការអានឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"មិនបានកំណត់ម៉ោងរោទ៍ទេ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 0e44a0c..0c10103 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ ಬದಲಿಗೆ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸಿ."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸಿ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಗುರುತಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬದಲಾಗಿ ಪರದೆಲಾಕ್ ಬಳಸಿ."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ಮುಖದ ಐಕಾನ್"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"ಸಿದ್ಧವಾಗಿದೆ"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ಸ್ಥಿತಿ:</b> ಸೈಲೆಂಟ್ಗೆ ಕೆಳದರ್ಜೆಗೆ ಇಳಿದಿದೆ"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ಸ್ಥಿತಿ:</b> ಉನ್ನತ ಸ್ಥಾನವನ್ನು ಹೊಂದಿದೆ"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ಸ್ಥಿತಿ:</b> ಕಡಿಮೆ ಸ್ಥಾನವನ್ನು ಹೊಂದಿದೆ"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್ ಆಗಿ ಗೋಚರಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಲಾಕ್ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುತ್ತದೆ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"ಸಂವಾದ ಫೀಚರ್ಗಳನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ಸಂವಾದವನ್ನು ಆದ್ಯತೆಯಾಗಿ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ಆದ್ಯತೆಯ ಸಂವಾದಗಳು:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೋರಿಸಿ"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ತೋರಿಸಿ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ಆ್ಯಪ್ಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್ನಂತೆ ಗೋಚರಿಸಲಿ"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ಅಡಚಣೆ ಮಾಡಬೇಡ ಅನ್ನು ಅಡ್ಡಿಪಡಿಸಿ"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ಅರ್ಥವಾಯಿತು"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ಸ್ವಿಚ್"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಅಕ್ಸೆಸಿಬಿಲಿಟಿ ಗೆಸ್ಚರ್ ಅನ್ನು ಬದಲಾಯಿಸಿದೆ\n\n"<annotation id="link">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಮರೆಮಾಡಲು ಅಂಚಿಗೆ ಬಟನ್ ಸರಿಸಿ"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ಸಾಧನ ನಿಯಂತ್ರಣಗಳು"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ನಿಮ್ಮ ಸಂಪರ್ಕಿತ ಸಾಧನಗಳಿಗೆ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಿ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ಸಾಧನ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"ಸಂಭಾಷಣೆಯನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ಸಂಭಾಷಣೆ ವಿಜೆಟ್ಗಳು"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ಸಂಭಾಷಣೆಯನ್ನು ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಸೇರಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"ನೀವು ಕೆಲವು ಸಂದೇಶಗಳನ್ನು ಪಡೆದ ನಂತರ ಇಲ್ಲಿ ಮತ್ತೆ ಪರಿಶೀಲಿಸಿ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ಆದ್ಯತೆಯ ಸಂಭಾಷಣೆಗಳು"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ಇತ್ತೀಚಿನ ಸಂಭಾಷಣೆಗಳು"</string>
+ <string name="okay" msgid="6490552955618608554">"ಸರಿ"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ಸಮಯದ ಹಿಂದೆ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಕಡಿಮೆ ಅವಧಿಯ ಹಿಂದೆ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಹೆಚ್ಚಿನ ಅವಧಿಯ ಹಿಂದೆ"</string>
<string name="birthday_status" msgid="2596961629465396761">"ಜನ್ಮದಿನ"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ಶೀಘ್ರದಲ್ಲಿ ಜನ್ಮದಿನವಿದೆ"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"ವಾರ್ಷಿಕೋತ್ಸವ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"ಸ್ಥಳ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"ಹೊಸ ಸುದ್ದಿ"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"ವೀಕ್ಷಿಸುತ್ತಿರುವವರು"</string>
<string name="audio_status" msgid="4237055636967709208">"ಆಲಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="game_status" msgid="1340694320630973259">"ಪ್ಲೇ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ಸ್ನೇಹಿತರು"</string>
<string name="empty_status" msgid="5938893404951307749">"ಈ ರಾತ್ರಿ ಚಾಟ್ ಮಾಡೋಣ!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"ಮಿಸ್ಡ್ ಕಾಲ್"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್ಡೇಟ್ಗಳು"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ಸಂಭಾಷಣೆ"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 005449d..5e71548 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"닫기"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"지문 센서를 터치하세요."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"지문 아이콘"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"얼굴을 인식할 수 없습니다. 대신 지문을 사용하세요."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"계속하려면 지문을 사용하세요."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"지문을 인식할 수 없습니다. 화면 잠금을 대신 사용하세요."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"찾는 중..."</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"얼굴 아이콘"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"호환성 확대/축소 버튼입니다."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"준비됨"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"직장 프로필"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>상태:</b> 무음으로 낮춤"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>상태:</b> 순위 높임"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>상태:</b> 순위 낮춤"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 잠금 화면에 프로필 사진이 표시됨"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 대화 기능을 지원하지 않습니다."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"이 알림 그룹은 여기에서 설정할 수 없습니다."</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"대화가 우선순위 대화로 설정됨"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"우선순위 대화는 다음과 같이 표시됩니다."</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"대화 섹션의 상단에 표시"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"잠금 화면에서 프로필 사진 표시"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"앱 상단에서 플로팅 대화창으로 표시"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"방해 금지 모드 무시"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"확인"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"설정"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"전환"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"접근성 동작이 접근성 버튼으로 대체되었습니다\n\n"<annotation id="link">"설정 보기"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"버튼을 가장자리로 옮겨서 일시적으로 숨기세요"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가하세요."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 컨트롤 설정"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"대화 열기"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"대화 위젯"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"대화를 탭하여 홈 화면에 추가하세요."</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"메시지를 받으면 여기서 다시 확인해 주세요."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"우선순위 대화"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"최근 대화"</string>
+ <string name="okay" msgid="6490552955618608554">"확인"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> 전"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> 이내"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> 이상 경과"</string>
<string name="birthday_status" msgid="2596961629465396761">"생일"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"다가오는 생일"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"기념일"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"위치 공유 중"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"새 스토리"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"시청 중"</string>
<string name="audio_status" msgid="4237055636967709208">"듣는 중"</string>
<string name="game_status" msgid="1340694320630973259">"플레이 중"</string>
<string name="empty_user_name" msgid="3389155775773578300">"친구"</string>
<string name="empty_status" msgid="5938893404951307749">"오늘 밤에 채팅"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"부재중 전화"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"최근 메시지, 부재중 전화, 상태 업데이트 보기"</string>
<string name="people_tile_title" msgid="6589377493334871272">"대화"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"배터리 수준을 읽는 중에 문제가 발생함"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"탭하여 자세한 정보를 확인하세요."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"설정된 알람 없음"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 13ed32b..6aacfa0 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -68,7 +68,7 @@
<string name="wifi_debugging_always" msgid="2968383799517975155">"Бул тармакта ар дайым уруксат берилсин"</string>
<string name="wifi_debugging_allow" msgid="4573224609684957886">"Уруксат берүү"</string>
<string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоого уруксат берилген жок"</string>
- <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"Учурда бул түзмөккө кирген колдонуучу мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо функциясын күйгүзө албайт. Бул функцияны колдонуу үчүн, негизги колдонуучунун аккаунтуна которулуңуз."</string>
+ <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"Учурда бул түзмөккө кирген колдонуучу мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо функциясын күйгүзө албайт. Бул функцияны колдонуу үчүн негизги колдонуучунун аккаунтуна которулуңуз."</string>
<string name="usb_contaminant_title" msgid="894052515034594113">"USB порту өчүрүлдү"</string>
<string name="usb_contaminant_message" msgid="7730476585174719805">"Түзмөгүңүздүн ичине суюктук же булганч нерселер кирип кетпеши үчүн USB порту өчүрүлдү. Азырынча ал аркылуу башка түзмөктөргө туташууга болбойт.\n\nUSB портун кайра колдонуу мүмкүн болгондо, билдирме аласыз."</string>
<string name="usb_port_enabled" msgid="531823867664717018">"Кубаттагычтарды жана аксессуарларды аныктоо үчүн USB оюкчасы иштетилди"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Жабуу"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Манжа изинин сенсорун басыңыз"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Манжа изинин сүрөтчөсү"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Жүз таанылбай жатат. Манжа изин колдонуңуз."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Улантуу үчүн манжаңыздын изин колдонуңуз"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Манжа изи таанылбай жатат. Эрканды кулпулоо функциясын колдонуңуз."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Жүзүңүз изделүүдө…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Жүздүн сүрөтчөсү"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Масштабды сыйыштыруу баскычы."</string>
@@ -303,7 +300,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1490779000057752281">"4G дайындары тындырылды"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобилдик Интернет кызматы тындырылды"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Дайындар тындырылды"</string>
- <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"Трафик сиз койгон чекке жетти. Эми мобилдик Интернетти колдоно албайсыз.\n\nЭгер улантсаңыз, дайын-даректерди өткөрүү үчүн акы алынышы мүмкүн."</string>
+ <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"Трафик сиз койгон чекке жетти. Эми мобилдик Интернетти колдоно албайсыз.\n\nЭгер улантсаңыз, маалыматтарды өткөрүү үчүн акы алынышы мүмкүн."</string>
<string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"Улантуу"</string>
<string name="gps_notification_searching_text" msgid="231304732649348313">"GPS издөө"</string>
<string name="gps_notification_found_text" msgid="3145873880174658526">"GPS боюнча аныкталган жайгашуу"</string>
@@ -497,7 +494,7 @@
<string name="user_remove_user_message" msgid="6702834122128031833">"Бул колдонуучунун бардык колдонмолору жана дайындары өчүрүлөт."</string>
<string name="user_remove_user_remove" msgid="8387386066949061256">"Алып салуу"</string>
<string name="battery_saver_notification_title" msgid="8419266546034372562">"Батареяны үнөмдөгүч режими күйүк"</string>
- <string name="battery_saver_notification_text" msgid="2617841636449016951">"Иштин майнаптуулугун начарлатып, фондук дайын-даректерди чектейт"</string>
+ <string name="battery_saver_notification_text" msgid="2617841636449016951">"Иштин майнаптуулугун начарлатып, фондук маалыматтарды чектейт"</string>
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Батареяны үнөмдөгүчтү өчүрүү"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Жаздырып же тышкы экранга чыгарып жатканда, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу экраныңыздагы бардык маалыматты же түзмөктө ойнолуп жаткан бардык нерселерди (сырсөздөрдү, төлөмдүн чоо-жайын, сүрөттөрдү, билдирүүлөрдү жана угуп жаткан аудиофайлдарды) көрө алат."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Жаздырып же тышкы экранга чыгарып жатканда, бул колдонмо экраныңыздагы бардык маалыматты же түзмөктө ойнолуп жаткан бардык нерселерди (сырсөздөрдү, төлөмдүн чоо-жайын, сүрөттөрдү, билдирүүлөрдү жана угуп жаткан аудиофайлдарды) көрө алат."</string>
@@ -547,9 +544,9 @@
<string name="disconnect_vpn" msgid="26286850045344557">"VPN\'ди ажыратуу"</string>
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Саясаттарды карап көрүү"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Башкаруу элементтерин көрүү"</string>
- <string name="monitoring_description_named_management" msgid="505833016545056036">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык.\n\nIT администраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайын-даректерди жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nТолугураак маалымат алуу үчүн, IT администраторуңузга кайрылыңыз."</string>
+ <string name="monitoring_description_named_management" msgid="505833016545056036">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык.\n\nIT администраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nТолугураак маалымат алуу үчүн, IT администраторуңузга кайрылыңыз."</string>
<string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> бул түзмөк менен байланышкан маалыматты көрүп, колдонмолорду башкарып, анын жөндөөлөрүн өзгөртө алат.\n\nЭгер суроолоруңуз болсо, <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> уюмуна кайрылыңыз."</string>
- <string name="monitoring_description_management" msgid="4308879039175729014">"Бул түзмөк уюмуңузга таандык.\n\nIT администраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайын-даректерди жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nТолугураак маалымат алуу үчүн, IT администраторуңузга кайрылыңыз."</string>
+ <string name="monitoring_description_management" msgid="4308879039175729014">"Бул түзмөк уюмуңузга таандык.\n\nIT администраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nТолугураак маалымат алуу үчүн, IT администраторуңузга кайрылыңыз."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Ишканаңыз бул түзмөккө тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Ишканаңыз жумуш профилиңизге тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
<string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Бул түзмөктө тастыктоочу борбор орнотулган. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
@@ -561,7 +558,7 @@
<string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"Жеке профилиңиз электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турат."</string>
<string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"Түзмөгүңүз <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> тарабынан башкарылат."</string>
<string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"Түзмөгүңүздү башкаруу үчүн <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюму <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> колдонмосун колдонот."</string>
- <string name="monitoring_description_do_body" msgid="7700878065625769970">"Администраторуңуз жөндөөлөрдү, корпоративдик кирүү мүмкүнчүлүгүн, колдонмолорду, уруксаттарды жана ушул түзмөкө байланыштуу дайын-даректерди, ошондой эле түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат."</string>
+ <string name="monitoring_description_do_body" msgid="7700878065625769970">"Администраторуңуз жөндөөлөрдү, корпоративдик кирүү мүмкүнчүлүгүн, колдонмолорду, уруксаттарды жана ушул түзмөкө байланыштуу маалыматтарды, ошондой эле түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
<string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Кеңири маалымат"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турасыз."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Даяр"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Жумуш профили"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Абалы:</b> Үнсүз абалга төмөндөдү"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Абалы:</b> Жогорулады"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Абалы:</b> Төмөндөдү"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнсө, профиль сүрөтү кулпуланган экранда көрүнөт"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> жазышуу функцияларын колдоого албайт"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"</string>
@@ -793,7 +797,7 @@
<string name="battery_panel_title" msgid="5931157246673665963">"Батареяны керектөө"</string>
<string name="battery_detail_charging_summary" msgid="8821202155297559706">"Батареяны үнөмдөгүч түзмөк кубатталып жатканда иштебейт"</string>
<string name="battery_detail_switch_title" msgid="6940976502957380405">"Батареяны үнөмдөгүч"</string>
- <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Иштин майнаптуулугун начарлатып, фондук дайын-даректерди чектейт"</string>
+ <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Иштин майнаптуулугун начарлатып, фондук маалыматтарды чектейт"</string>
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> баскычы"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Башкы бет"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Артка"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Жазышуу маанилүү болуп коюлду"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Маанилүү жазышуулардын төмөнкүдөй артыкчылыктары бар:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Жазышуулар тизмесинин үстүндө көрүнөт"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профилдин сүрөтү кулпуланган экранда көрүнөт"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Калкым чыкма билдирме катары көрсөтүү"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Тынчымды алба\" режими үзгүлтүккө учурайт"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түшүндүм"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Жөндөөлөр"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Которулуу"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Атайын мүмкүнчүлүктөр баскычы атайын мүмкүнчүлүктөр жаңсоосун алмаштырды\n\n"<annotation id="link">"Жөндөөлөрдү көрүү"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Убактылуу жашыруу үчүн баскычты четине жылдырыңыз"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Түзмөктү башкаруу элементтери"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Байланышкан түзмөктөрүңүздү башкаруу элементтерин кошосуз"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Түзмөктү башкаруу элементтерин жөндөө"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Маекти ачуу"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Маек виджеттери"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Маекти Башкы экранга кошуу үчүн таптап коюңуз"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Билдирүүлөрдү алгандан кийин бул жерди кайрадан текшериңиз"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Маанилүү жазышуулар"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Акыркы жазышуулар"</string>
+ <string name="okay" msgid="6490552955618608554">"Макул"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> мурда"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> жетпеген убакыт мурда"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ашуун мурда"</string>
<string name="birthday_status" msgid="2596961629465396761">"Туулган күн"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Алдыдагы туулган күн"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Маараке"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Кайда жүргөнүмдү көрсөтүү"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Жаңы окуя"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Көрүүдө"</string>
<string name="audio_status" msgid="4237055636967709208">"Угуп жатат"</string>
<string name="game_status" msgid="1340694320630973259">"Ойнотулууда"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Достор"</string>
<string name="empty_status" msgid="5938893404951307749">"Келиңиз, баарлашалы!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Жооп берилбеген чалуу"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Акыркы билдирүүлөрдү, жооп берилбеген чалууларды жана статус жаңыртууларын көрүү"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Сүйлөшүү"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батареяңыздын кубаты аныкталбай жатат"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Кеңири маалымат алуу үчүн таптап коюңуз"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ойготкуч коюлган жок"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 3cd7d34..fb4ecad 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ປິດໄວ້"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມື"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ໄອຄອນລາຍນິ້ວມື"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ບໍ່ສາມາດຈຳແນກໜ້າໄດ້. ກະລຸນາໃຊ້ລາຍນິ້ວມືແທນ."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ກະລຸນາໃຊ້ລາຍນິ້ວມືຂອງທ່ານເພື່ອສືບຕໍ່"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ບໍ່ສາມາດຈຳແນກລາຍນິ້ວມືໄດ້. ກະລຸນາໃຊ້ການລອກໜ້າຈໍແທນ."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ກຳລັງຊອກຫາທ່ານ…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ໄອຄອນໃບໜ້າ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມກັນໄດ້."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ອີເທເນັດ"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ໂມງປຸກ"</string>
<string name="wallet_title" msgid="5369767670735827105">"ກະເປົາ"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"ພ້ອມແລ້ວ"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"ສະແດງທັງໝົດ"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"ປົດລັອກເພື່ອຈ່າຍ"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"ພ້ອມແລ້ວ"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"ຕັ້ງຄ່າການຈ່າຍເງິນ"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ປົດລັອກເພື່ອໃຊ້"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"ເກີດບັນຫາໃນການໂຫຼດບັດຂອງທ່ານ, ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ"</string>
<string name="status_bar_work" msgid="5238641949837091056">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ໂໝດເຮືອບິນ"</string>
<string name="add_tile" msgid="6239678623873086686">"ເພີ່ມລາຍຕາກະໂລ່"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ສະຖານະ:</b> ຫຼຸດລະດັບເປັນປິດສຽງແລ້ວ"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ສະຖານະ:</b> ມີອັນດັບສູງຂຶ້ນແລ້ວ"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ສະຖານະ:</b> ມີອັນດັບຕ່ຳລົງແລ້ວ"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ, ປາກົດເປັນ bubble ແບບລອຍ, ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນທ່ານສະເໝີ, ເຖິງແມ່ນວ່າຈະເປີດໃຊ້ໂໝດຄວາມສຳຄັນຢູ່ກໍຕາມ"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ຕັ້ງຄ່າ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"ການສົນທະນາສຳຄັນ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ຮອງຮັບຄຸນສົມບັດການສົນທະນາ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ຕັ້ງການສົນທະນາເປັນສຳຄັນແລ້ວ"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ການສົນທະນາສຳຄັນຈະ:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ປາກົດເປັນ bubble ລອຍຢູ່ເໜືອແອັບ"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"ການສົນທະນາສຳຄັນ"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"ການສົນທະນາເຫຼົ່ານີ້ຈະສະແດງຢູ່ເທິງສຸດຂອງລາຍຊື່ທ່ານ ແລະ ສາມາດຕິດຕໍ່ຫາທ່ານໄດ້ຕະຫຼອດເມື່ອເປີດໃຊ້ໂໝດຄວາມສຳຄັນ"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"ຮູບໂປຣໄຟລ໌ແມ່ນສະແດງຢູ່ໜ້າຈໍລັອກ"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"ທ່ານສາມາດຊອກຫາການສົນທະນາເຫຼົ່ານີ້ໄດ້ຢ່າງງ່າຍດາຍໃນຟອງຢູ່ໂຮມສະກຣີນຂອງທ່ານ"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ລົບກວນໂໝດຫ້າມລົບກວນ"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ການຕັ້ງຄ່າ"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ສະຫຼັບ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ປຸ່ມການຊ່ວຍເຂົ້າເຖິງຖືກແທນທີ່ທ່າທາງຊ່ວຍເຂົ້າເຖິງແລ້ວ\n\n"<annotation id="link">"ເບິ່ງການຕັ້ງຄ່າ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ຍ້າຍປຸ່ມໄປໃສ່ຂອບເພື່ອເຊື່ອງມັນຊົ່ວຄາວ"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"ຍ້າຍຊ້າຍເທິງ"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"ຍ້າຍຂວາເທິງ"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"ຍ້າຍຊ້າຍລຸ່ມ"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ຍ້າຍຂວາລຸ່ມ"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ຍ້າຍອອກຂອບ ແລະ ເຊື່ອງ"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ຍ້າຍອອກຂອບ ແລະ ສະແດງ"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ການຄວບຄຸມອຸປະກອນ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ເພີ່ມການຄວບຄຸມສຳລັບອຸປະກອນທີ່ເຊື່ອມຕໍ່ແລ້ວຂອງທ່ານ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ຕັ້ງຄ່າການຄວບຄຸມອຸປະກອນ"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"ເປີດການສົນທະນາ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ວິດເຈັດການສົນທະນາ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ແຕະໃສ່ການສົນທະນາໃດໜຶ່ງເພື່ອເພີ່ມມັນໃສ່ໂຮມສະກຣີນຂອງທ່ານ"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"ກັບມາກວດເບິ່ງຢູ່ບ່ອນນີ້ຄືນໃໝ່ຫຼັງຈາກທີ່ທ່ານໄດ້ຮັບຂໍ້ຄວາມ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ການສົນທະນາສຳຄັນ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ການສົນທະນາຫຼ້າສຸດ"</string>
+ <string name="okay" msgid="6490552955618608554">"ຕົກລົງ"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ບໍ່ຮອດ <xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ເກີນ <xliff:g id="DURATION">%1$s</xliff:g> ມາແລ້ວ"</string>
<string name="birthday_status" msgid="2596961629465396761">"ວັນເກີດ"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"ວັນເກີດຂອງ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ວັນເກີດໃນໄວໆນີ້"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"ອີກບໍ່ດົນຈະຮອດວັນເກີດຂອງ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="anniversary_status" msgid="1790034157507590838">"ວັນຄົບຮອບ"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"ວັນຄົບຮອບ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"ກຳລັງແບ່ງປັນສະຖານທີ່"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> ກຳລັງແບ່ງປັນສະຖານທີ່"</string>
<string name="new_story_status" msgid="9012195158584846525">"ເລື່ອງໃໝ່"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> ແບ່ງປັນເລື່ອງໃໝ່ແລ້ວ"</string>
<string name="video_status" msgid="4548544654316843225">"ຄົນກຳລັງເບິ່ງ"</string>
<string name="audio_status" msgid="4237055636967709208">"ກຳລັງຟັງ"</string>
<string name="game_status" msgid="1340694320630973259">"ກຳລັງຫຼິ້ນ"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ໝູ່"</string>
<string name="empty_status" msgid="5938893404951307749">"ມາລົມກັນຄືນນີ້!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"ເນື້ອຫາຈະສະແດງໃນອີກບໍ່ດົນ"</string>
<string name="missed_call" msgid="4228016077700161689">"ສາຍບໍ່ໄດ້ຮັບ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ເບິ່ງຂໍ້ຄວາມຫຼ້າສຸດ, ສາຍບໍ່ໄດ້ຮັບ ແລະ ອັບເດດສະຖານະ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ການສົນທະນາ"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຂໍ້ຄວາມແລ້ວ"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຮູບພາບແລ້ວ"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ບໍ່ໄດ້ຕັ້ງໂມງປຸກ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index f9fdf10..12b65a2 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Atsisakyti"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Palieskite piršto antspaudo jutiklį"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Piršto antspaudo piktograma"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Veidas neatpažintas. Naudokite kontrolinį kodą."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Jei norite tęsti, naudokite kontrolinį kodą"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Nepavyko atpažinti kontrolinio kodo. Naudokite ekrano užraktą."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Ieškoma jūsų…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Veido piktograma"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Suderinamumo priartinimo mygtukas."</string>
@@ -666,13 +663,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Eternetas"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Signalas"</string>
<string name="wallet_title" msgid="5369767670735827105">"Piniginė"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Paruošta"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Rodyti viską"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Atrakinti, kad būtų galima mokėti"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Paruošta"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Nustatyti mokėjimą"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Atrakinti, kad būtų galima naudoti"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Gaunant korteles kilo problema, bandykite dar kartą vėliau"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Darbo profilis"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lėktuvo režimas"</string>
<string name="add_tile" msgid="6239678623873086686">"Pridėti išklotinės elementą"</string>
@@ -741,9 +737,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Būsena:</b> pakeista į begarsį lygį"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Būsenos:</b> reitingas padidintas"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Būsenos:</b> reitingas sumažintas"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Rodoma pokalbių skilties viršuje, rodoma kaip slankusis burbulas, pateikiama profilio nuotrauka užrakinimo ekrane"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Visada rodoma pranešimų viršuje, net įjungus svarbiausių pokalbių režimą"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetiniai"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Svarbiausi pokalbiai"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko pokalbių funkcijų"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Šios grupės pranešimai čia nekonfigūruojami"</string>
@@ -1021,10 +1017,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Pokalbis nustatytas į prioritetinį"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetiniai pokalbiai bus:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Rodyti pokalbių skilties viršuje"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Rodyti profilio nuotrauką užrakinimo ekrane"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Rodyti kaip slankųjį debesėlį programų viršuje"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Svarbiausi pokalbiai"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Įjungus svarbiausių pokalbių režimą, šie pokalbiai visada rodomi sąrašo viršuje"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profilio nuotraukos rodomos užrakinimo ekrane"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Lengvai rasite šiuos pokalbius burbuluose pagrindiniame ekrane"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Pertraukti netrukdymo režimą"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Supratau"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nustatymai"</string>
@@ -1042,6 +1038,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Perjungti"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Pritaikomumo gestas pakeistas pritaikomumo mygtuku\n\n"<annotation id="link">"Žr. nustatymus"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Perkelkite mygtuką prie krašto, kad laikinai jį paslėptumėte"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Perkelti į viršų kairėje"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Perkelti į viršų dešinėje"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Perkelti į apačią kairėje"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Perkelti į apačią dešinėje"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Perkelti į kraštą ir slėpti"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Perkelti iš krašto ir rodyti"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Įrenginio valdikliai"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridėkite prijungtų įrenginių valdiklių"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Įrenginio valdiklių nustatymas"</string>
@@ -1114,31 +1116,35 @@
<string name="basic_status" msgid="2315371112182658176">"Atidaryti pokalbį"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Pokalbio valdikliai"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Palieskite pokalbį, kad pridėtumėte jį prie pagrindinio ekrano"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Sugrįžkite, kai gausite pranešimų"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Svarbiausi pokalbiai"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Paskutiniai pokalbiai"</string>
+ <string name="okay" msgid="6490552955618608554">"Gerai"</string>
<string name="timestamp" msgid="6577851592534538533">"Prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Mažiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Daugiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Gimimo diena"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"<xliff:g id="NAME">%1$s</xliff:g> gimtadienis"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Netrukus gimtadienis"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Greitai bus <xliff:g id="NAME">%1$s</xliff:g> gimtadienis"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Sukaktis"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"<xliff:g id="NAME">%1$s</xliff:g> jubiliejus"</string>
<string name="location_status" msgid="1294990572202541812">"Vieta bendrinama"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> bendrina vietovę"</string>
<string name="new_story_status" msgid="9012195158584846525">"Nauja istorija"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> pasidalijo nauja istorija"</string>
<string name="video_status" msgid="4548544654316843225">"Žiūri"</string>
<string name="audio_status" msgid="4237055636967709208">"Klausoma"</string>
<string name="game_status" msgid="1340694320630973259">"Leidžiama"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Draugai"</string>
<string name="empty_status" msgid="5938893404951307749">"Pakalbėkime šįvakar!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Turinys netrukus pasirodys"</string>
<string name="missed_call" msgid="4228016077700161689">"Praleistas skambutis"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> +"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Peržiūrėkite naujausius pranešimus, praleistus skambučius ir būsenos atnaujinimus"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pokalbis"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė pranešimą"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė vaizdą"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nuskaitant akumuliatoriaus skaitiklį iškilo problema"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Palieskite, kad sužinotumėte daugiau informacijos"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenustatyta signalų"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index ef48270..e4e19d9 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Nerādīt"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Pieskarieties pirksta nospieduma sensoram"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Pirksta nospieduma ikona"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nevar atpazīt seju. Lietojiet pirksta nospiedumu."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Lai turpinātu, izmantojiet pirksta nospiedumu."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Nevar atpazīt pirksta nospiedumu. Izmantojiet ekrāna bloķēšanu."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Notiek jūsu sejas meklēšana…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Sejas ikona"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Saderības tālummaiņas poga."</string>
@@ -663,13 +660,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Tīkls Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Signāls"</string>
<string name="wallet_title" msgid="5369767670735827105">"Maks"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Gatavs"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Rādīt visu"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Lai maksātu, atbloķējiet ekrānu"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Gatavs"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Maksājuma veida iestatīšana"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Lai izmantotu, atbloķējiet ekrānu"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Ienesot jūsu kartes, radās problēma. Lūdzu, vēlāk mēģiniet vēlreiz."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Darba profils"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lidojuma režīms"</string>
<string name="add_tile" msgid="6239678623873086686">"Pievienot elementu"</string>
@@ -738,9 +734,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Statuss:</b> svarīgums pazemināts, un paziņojums tiks rādīts bez skaņas"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Statuss:</b> rangs paaugstināts"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Statuss:</b> rangs pazemināts"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā, arī kā peldošs burbulis, profila attēls parādās bloķēšanas ekrānā"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Vienmēr tiek rādītas virs jūsu paziņojumiem (arī tad, ja ir ieslēgts režīms “Prioritāte”)"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Prioritārās sarunas"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Šeit nevar konfigurēt šo paziņojumu grupu."</string>
@@ -1016,10 +1012,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Saruna iestatīta kā prioritāra"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritārās sarunas:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Tiek rādītas sarunu sadaļas augšdaļā"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tiek rādīts profila attēls bloķēšanas ekrānā"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tiek rādītas kā peldošs burbulis virs lietotnēm"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Prioritārās sarunas"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Šīs sarunas tiek rādītas jūsu saraksta augšdaļā, un jūs vienmēr varat tās skatīt, ja ir ieslēgts režīms Prioritāte"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profila attēli tiek rādīti bloķēšanas ekrānā"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Šīs sarunas ērti varat skatīt sava sākuma ekrāna burbuļos"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Var tikt rādītas režīmā “Netraucēt”"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Labi"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Iestatījumi"</string>
@@ -1037,6 +1033,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Pārslēgt"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Pieejamības žests ir aizstāts ar pieejamības pogu\n\n"<annotation id="link">"Skatīt iestatījumus"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Lai īslaicīgi paslēptu pogu, pārvietojiet to uz malu"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Pārvietot augšpusē pa kreisi"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Pārvietot augšpusē pa labi"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Pārvietot apakšpusē pa kreisi"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Pārvietot apakšpusē pa labi"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Pārvietot uz malu un paslēpt"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Pārvietot no malas un parādīt"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Ierīču vadīklas"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pievienojiet vadīklas pievienotajām ierīcēm"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Ierīču vadīklu iestatīšana"</string>
@@ -1108,31 +1110,35 @@
<string name="basic_status" msgid="2315371112182658176">"Atvērt sarunu"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Sarunu logrīki"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Pieskarieties kādai sarunai, lai pievienotu to savam sākuma ekrānam."</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Atgriezieties šeit, kad būsiet saņēmis ziņojumus."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritārās sarunas"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Jaunākās sarunas"</string>
+ <string name="okay" msgid="6490552955618608554">"Labi"</string>
<string name="timestamp" msgid="6577851592534538533">"Pirms šāda laika: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pirms mazāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pirms vairāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Dzimšanas diena"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Ir lietotāja <xliff:g id="NAME">%1$s</xliff:g> dzimšanas diena"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Gaidāma dzimšanas diena"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Drīz būs lietotāja <xliff:g id="NAME">%1$s</xliff:g> dzimšanas diena"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Gadadiena"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Ir lietotāja <xliff:g id="NAME">%1$s</xliff:g> gadadiena"</string>
<string name="location_status" msgid="1294990572202541812">"Tiek kopīgota vieta…"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> kopīgo atrašanās vietu"</string>
<string name="new_story_status" msgid="9012195158584846525">"Jauns raksts"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> kopīgoja jaunu stāstu"</string>
<string name="video_status" msgid="4548544654316843225">"Notiek skatīšanās…"</string>
<string name="audio_status" msgid="4237055636967709208">"Notiek klausīšanās…"</string>
<string name="game_status" msgid="1340694320630973259">"Tiek spēlēta spēle…"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Draugi"</string>
<string name="empty_status" msgid="5938893404951307749">"Patērzēsim šovakar!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Saturs drīz tiks parādīts"</string>
<string name="missed_call" msgid="4228016077700161689">"Neatbildēts zvans"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Skatiet jaunākos ziņojumus, neatbildētos zvanus un statusa atjauninājumus."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Saruna"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja ziņojumu"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja attēlu"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nevar iegūt informāciju par akumulatora uzlādes līmeni."</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Pieskarieties, lai iegūtu plašāku informāciju."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nav iestatīts signāls"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index bd9c535..87246ce 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Отфрли"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Допрете го сензорот за отпечатоци"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Икона за отпечаток"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не се препознава ликот. Користете отпечаток."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Употребете го отпечатокот за да продолжите"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Не се препознава отпечатокот. Користете заклучување екран."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Ве бараме вас…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Икона за лице"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Копче за компатибилност на зум."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Етернет"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Аларм"</string>
<string name="wallet_title" msgid="5369767670735827105">"Паричник"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Подготвено"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Прикажи ги сите"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Отклучете за да платите"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Подготвено"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Поставете плаќање"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Отклучете за да користите"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Имаше проблем при преземањето на картичките. Обидете се повторно подоцна"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Работен профил"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Авионски режим"</string>
<string name="add_tile" msgid="6239678623873086686">"Додај плочка"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Статус:</b> намалено на „Тивко“"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Статус:</b> рангирано повисоко"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Статус:</b> рангирано пониско"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Се појавува на горниот дел од секцијата на разговорот во вид на лебдечко меурче, покажувајќи ја профилната слика на заклучениот екран"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Секогаш прикажувај на врвот од известувањата, дури и кога е вклучен „Приоритетен режим“"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Приоритетни разговори"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува функции за разговор"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Оваа група известувања не може да се конфигурира тука"</string>
@@ -977,7 +973,7 @@
<string name="mobile_data_disable_message" msgid="8604966027899770415">"Нема да имате пристап до податоците или интернетот преку <xliff:g id="CARRIER">%s</xliff:g>. Интернетот ќе биде достапен само преку Wi-Fi."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"вашиот оператор"</string>
<string name="touch_filtered_warning" msgid="8119511393338714836">"Бидејќи апликацијата го прикрива барањето за дозвола, „Поставките“ не може да го потврдат вашиот одговор."</string>
- <string name="slice_permission_title" msgid="3262615140094151017">"Дали да се дозволи <xliff:g id="APP_0">%1$s</xliff:g> да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
+ <string name="slice_permission_title" msgid="3262615140094151017">"Да се дозволи <xliff:g id="APP_0">%1$s</xliff:g> да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="6675965177075443714">"- Може да чита информации од <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="slice_permission_text_2" msgid="6758906940360746983">"- Може да презема дејства во <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="slice_permission_checkbox" msgid="4242888137592298523">"Дозволете <xliff:g id="APP">%1$s</xliff:g> да прикажува делови од која било апликација"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Разговорот е поставен како приоритетен"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приоритетните разговори:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ќе се прикажуваат најгоре во делот со разговори;"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ќе прикажуваат профилна слика на заклучен екран."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Се појавува како лебдечко балонче врз апликациите"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Приоритетни разговори"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Разговориве се прикажани на врвот од списокот и секогаш може да ги видите кога е вклучен „Приоритетен режим“"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Профилните слики се прикажуваат на заклучен екран"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Лесно може да ги најдете разговориве во балончиња на почетниот екран"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекинува „Не вознемирувај“"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Сфатив"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Поставки"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Префрли"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Копчето за пристапност го замени движењето за пристапност\n\n"<annotation id="link">"Прикажи поставки"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Преместете го копчето до работ за да го сокриете привремено"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Премести горе лево"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Премести горе десно"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Премести долу лево"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Премести долу десно"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Премести до работ и сокриј"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Премести над работ и прикажи"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Контроли за уредите"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроли за поврзаните уреди"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Поставете ги контролите за уредите"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Започни разговор"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виџети за разговор"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Допрете на разговор за да го додадете на вашиот почетен екран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Вратете се тука кога ќе добиете пораки"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Приоритетни разговори"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Неодамнешни разговори"</string>
+ <string name="okay" msgid="6490552955618608554">"Во ред"</string>
<string name="timestamp" msgid="6577851592534538533">"Пред <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Пред помалку од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Пред повеќе од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Роденден"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Роденден е на <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Претстоен роденден"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Наскоро е роденден на <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Годишнина"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Годишнина е на <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Споделување локација"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> ја споделува локацијата"</string>
<string name="new_story_status" msgid="9012195158584846525">"Нова приказна"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> сподели нова сторија"</string>
<string name="video_status" msgid="4548544654316843225">"Гледање видео"</string>
<string name="audio_status" msgid="4237055636967709208">"Слушам"</string>
<string name="game_status" msgid="1340694320630973259">"Играње игра"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Пријатели"</string>
<string name="empty_status" msgid="5938893404951307749">"Разговарај вечерва!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Содржините ќе се прикажат наскоро"</string>
<string name="missed_call" msgid="4228016077700161689">"Пропуштен повик"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Видете ги неодамнешните пораки, пропуштени повици и промени на статусот"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> испрати порака"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> испрати слика"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем при читањето на мерачот на батеријата"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Допрете за повеќе информации"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Нема поставен аларм"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 568c19e..955f144 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ഡിസ്മിസ് ചെയ്യുക"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ഫിംഗർപ്രിന്റ് സെൻസർ സ്പർശിക്കുക"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ഫിംഗർപ്രിന്റ് ഐക്കൺ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"മുഖം തിരിച്ചറിയാനായില്ല. പകരം ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കൂ."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"തുടരുന്നതിന് നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ഫിംഗർപ്രിന്റ് തിരിച്ചറിയാനാകുന്നില്ല. പകരം സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"നിങ്ങൾക്കായി തിരയുന്നു…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"മുഖത്തിന്റെ ഐക്കൺ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"അനുയോജ്യതാ സൂം ബട്ടൺ."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"തയ്യാറാണ്"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>നില:</b> നിശബ്ദമാക്കി തരം താഴ്ത്തി"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>നില:</b> ഉയർന്ന റാങ്കിംഗ് നൽകി"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>നില:</b> താഴ്ന്ന റാങ്കിംഗ് നൽകി"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> സംഭാഷണ സവിശേഷതകളെ പിന്തുണയ്ക്കുന്നില്ല"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്ഫിഗര് ചെയ്യാൻ കഴിയില്ല"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"സംഭാഷണം മുൻഗണനയുള്ളതായി സജ്ജീകരിച്ചു"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"മുൻഗണനാ സംഭാഷണങ്ങൾ ഇനിപ്പറയുന്നവ ചെയ്യും:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"സംഭാഷണ വിഭാഗത്തിന്റെ മുകളിൽ കാണിക്കുക"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം കാണിക്കുക"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ആപ്പുകളുടെ മുകളിൽ ഫ്ലോട്ടിംഗ് ബബിൾ ആയി ദൃശ്യമാകും"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ശല്യപ്പെടുത്തരുത്\' തടസ്സപ്പെടുത്തുക"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"മനസ്സിലായി"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ക്രമീകരണം"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"മാറുക"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ഉപയോഗസഹായി വിരൽചലനത്തെ മാറ്റി പകരം ഉപയോഗസഹായി ബട്ടൺ വന്നു\n\n"<annotation id="link">"ക്രമീകരണം കാണുക"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"തൽക്കാലം മറയ്ക്കുന്നതിന് ബട്ടൺ അരുകിലേക്ക് നീക്കുക"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ഉപകരണ നിയന്ത്രണങ്ങൾ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"കണക്റ്റ് ചെയ്ത ഉപകരണങ്ങൾക്ക് നിയന്ത്രണങ്ങൾ ചേർക്കുക"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ഉപകരണ നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കുക"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"സംഭാഷണം തുറക്കുക"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"സംഭാഷണ വിജറ്റുകൾ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"നിങ്ങളുടെ ഹോം സ്ക്രീനിൽ ചേർക്കാൻ സംഭാഷണത്തിൽ ടാപ്പ് ചെയ്യുക"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"കുറച്ച് സന്ദേശങ്ങൾ ലഭിച്ച ശേഷം ഇവിടെ വീണ്ടും പരിശോധിക്കൂ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"മുൻഗണനാ സംഭാഷണങ്ങൾ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"അടുത്തിടെയുള്ള സംഭാഷണങ്ങൾ"</string>
+ <string name="okay" msgid="6490552955618608554">"ശരി"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> എന്നതിൽ കുറവ്"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string>
<string name="birthday_status" msgid="2596961629465396761">"ജന്മദിനം"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ഉടൻ വരുന്ന ജന്മദിനം"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"വാര്ഷികം"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"ലൊക്കേഷൻ പങ്കിടുന്നു"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"പുതിയ വാർത്ത"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"കാണുന്നു"</string>
<string name="audio_status" msgid="4237055636967709208">"കേൾക്കുന്നു"</string>
<string name="game_status" msgid="1340694320630973259">"കളിക്കുന്നു"</string>
<string name="empty_user_name" msgid="3389155775773578300">"സുഹൃത്തുക്കൾ"</string>
<string name="empty_status" msgid="5938893404951307749">"ഇന്നുരാത്രി ചാറ്റുചെയ്യാം!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"മിസ്ഡ് കോൾ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"അടുത്തിടെയുള്ള സന്ദേശങ്ങൾ, മിസ്ഡ് കോളുകൾ, സ്റ്റാറ്റസ് അപ്ഡേറ്റുകൾ എന്നിവ കാണുക"</string>
<string name="people_tile_title" msgid="6589377493334871272">"സംഭാഷണം"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"നിങ്ങളുടെ ബാറ്ററി മീറ്റർ വായിക്കുന്നതിൽ പ്രശ്നമുണ്ട്"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"കൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"അലാറം സജ്ജീകരിച്ചിട്ടില്ല"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 953d414..8cdd8d4 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Бэлэн"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Ажлын профайл"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Төлөв:</b> Чимээгүй болгож зэрэглэлийг нь бууруулсан"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Төлөв:</b> Дээгүүр зэрэглэл хийсэн"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Төлөв:</b> Доогуур зэрэглэл хийсэн"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Харилцан ярианы хэсгийн дээд талд хөвж буй бөмбөлөг хэлбэрээр харагдах бөгөөд профайлын зургийг түгжигдсэн дэлгэцэд үзүүлнэ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Тохиргоо"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Ач холбогдол"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь харилцан ярианы онцлогуудыг дэмждэггүй"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Харилцан яриаг чухал гэж тохируулсан"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Чухал харилцан яриа нь:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Харилцан ярианы хэсгийн дээд талд харуулна"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Түгжигдсэн дэлгэц дээр профайлын зургийг харуулна"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Аппуудын дээр хөвөгч бөмбөлөг хэлбэрээр харагдана"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Бүү саад бол онцлогийг үл хэрэгсэн тасалдуулна"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ойлголоо"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Тохиргоо"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Сэлгэх"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Хандалтын товчлуурыг хандалтын зангаагаар сольсон\n\n"<annotation id="link">"Тохиргоо харах"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Үүнийг түр нуухын тулд товчлуурыг зах руу зөөнө үү"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Төхөөрөмжийн хяналт"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Холбогдсон төхөөрөмжүүд дээрээ хяналт нэмэх"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Төхөөрөмжийн хяналтыг тохируулах"</string>
@@ -1094,8 +1117,8 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (салсан)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Холбогдож чадсангүй. Дахин оролдоно уу."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Шинэ төхөөрөмж хослуулах"</string>
- <string name="build_number_clip_data_label" msgid="3623176728412560914">"Хийгдсэн дугаар"</string>
- <string name="build_number_copy_toast" msgid="877720921605503046">"Хийгдсэн дугаарыг түр санах ойд хуулсан."</string>
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Хийцийн дугаар"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Хийцийн дугаарыг түр санах ойд хуулсан."</string>
<string name="basic_status" msgid="2315371112182658176">"Харилцан яриаг нээх"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Харилцан ярианы жижиг хэрэгслүүд"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Үндсэн нүүрэндээ нэмэх харилцан яриаг товшино уу"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-с бага хугацааны өмнө"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-с дээш хугацааны өмнө"</string>
<string name="birthday_status" msgid="2596961629465396761">"Төрсөн өдөр"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Удахгүй болох төрсөн өдөр"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Тэмдэглэлт ой"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Байршил хуваалцаж байна"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Шинэ стори"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Үзэж байна"</string>
<string name="audio_status" msgid="4237055636967709208">"Сонсож байна"</string>
<string name="game_status" msgid="1340694320630973259">"Тоглож байна"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Найзууд"</string>
<string name="empty_status" msgid="5938893404951307749">"Өнөө орой чаталъя!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Аваагүй дуудлага"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Саяхны мессеж, аваагүй дуудлага болон төлөвийн шинэчлэлтийг харах"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Харилцан яриа"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Таны батарей хэмжигчийг уншихад асуудал гарлаа"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нэмэлт мэдээлэл авахын тулд товшино уу"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Сэрүүлэг тавиагүй"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 4098426..77e2694 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"डिसमिस करा"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"फिंगरप्रिंट आयकन"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरा ओळखू शकत नाही. त्याऐवजी फिंगरप्रिंट वापरा."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"पुढे सुरू ठेवण्यासाठी तुमची फिंगरप्रिंट वापरा"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"फिंगरप्रिंट ओळखता आली नाही. त्याऐवजी स्क्रीन लॉक वापरा."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"तुमच्यासाठी शोधत आहे…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"चेहरा आयकन"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"सुसंगतता झूम बटण."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"तयार आहे"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"कार्य प्रोफाईल"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>स्थिती</b> ला सायलंट म्हणून डीमोट केले गेले"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>स्थिती</b> ला थोडे जास्त म्हणून रँक केले गेले"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>स्थिती</b> ला थोडी कमी म्हणून रँक केले गेले"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"संभाषण विभागात सर्वात वरती फ्लोटिंग बबल म्हणून दिसते, लॉक स्क्रीनवर प्रोफाइल पिक्चर दाखवते"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"या सूचनांचा संच येथे कॉंफिगर केला जाऊ शकत नाही"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"संभाषणाला प्राधान्य म्हणून सेट केले आहे"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"प्राधान्य दिलेली संभाषणे:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"संभाषण विभागाच्या सर्वात वरती दाखवा"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीनवर प्रोफाइल फोटो दाखवा"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ॲप्सच्या सर्वात वरती फ्लोटिंग बबल म्हणून दिसतील"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"व्यत्यय आणू नका मध्ये अडथळा आणतील"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"समजले"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिंग्ज"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"स्विच करा"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"अॅक्सेसिबिलिटी जेश्चर हे आता अॅक्सेसिबिलिटी बटण आहे \n\n"<annotation id="link">"सेटिंग्ज पाहा"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"बटण तात्पुरते लपवण्यासाठी ते कोपर्यामध्ये हलवा"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"डिव्हाइस नियंत्रणे"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"तुमच्या कनेक्ट केलेल्या डिव्हाइससाठी नियंत्रणे जोडा"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"डिव्हाइस नियंत्रणे सेट करा"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"संभाषण उघडा"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"संभाषण विजेट"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"तुमच्या होम स्क्रीन वर संभाषण जोडण्यासाठी त्यावर टॅप करा"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"तुम्हाला काही मेसेज मिळाल्यावर येथे पुन्हा पाहा"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"प्राधान्य दिलेली संभाषणे"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"अलीकडील संभाषणे"</string>
+ <string name="okay" msgid="6490552955618608554">"ओके"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पूर्वी"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा कमी"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा आधी"</string>
<string name="birthday_status" msgid="2596961629465396761">"वाढदिवस"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"वाढदिवस लवकरच आहे"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"वर्धापन दिन"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"स्थान शेअर करत आहे"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"नवीन स्टोरी"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"पाहत आहे"</string>
<string name="audio_status" msgid="4237055636967709208">"ऐकत आहे"</string>
<string name="game_status" msgid="1340694320630973259">"प्ले करत आहे"</string>
<string name="empty_user_name" msgid="3389155775773578300">"मित्रमैत्रिणी"</string>
<string name="empty_status" msgid="5938893404951307749">"चला, आज रात्री चॅट करूया!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"मिस्ड कॉल"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"अलीकडील मेसेज, मिस्ड कॉल आणि स्टेटस अपडेट पाहा"</string>
<string name="people_tile_title" msgid="6589377493334871272">"संभाषण"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"तुमचे बॅटरी मीटर वाचताना समस्या आली"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"अधिक माहितीसाठी टॅप करा"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म सेट केला नाही"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 2b6a852..6e90234 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ketepikan"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sentuh penderia cap jari"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikon cap jari"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak mengenali wajah. Gunakan cap jari."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Gunakan cap jari anda untuk teruskan"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Tidak mengenali cap jari. Sebaliknya, gunakan kunci skrin."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Mencari anda…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikon wajah"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Butang zum keserasian."</string>
@@ -548,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Lihat Dasar"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Lihat kawalan"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Peranti ini milik <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nPentadbir IT anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda dan maklumat lokasi peranti anda.\n\nUntuk maklumat lanjut, hubungi pentadbir IT anda."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> mungkin dapat mengakses data yang dikaitkan dengan peranti ini, apl terurus dan menukar tetapan peranti ini.\n\nJika anda mempunyai pertanyaan, hubungi <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> mungkin dapat mengakses data yang dikaitkan dengan peranti ini, mengurus apl dan menukar tetapan peranti ini.\n\nJika anda mempunyai pertanyaan, hubungi <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Peranti ini milik organisasi anda.\n\nPentadbir IT anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda dan maklumat lokasi peranti anda.\n\nUntuk maklumat lanjut, hubungi pentadbir IT anda."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Organisasi anda memasang sijil kuasa pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisasi anda memasang sijil kuasa dalam profil kerja anda. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Penggera"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Sedia"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Tunjukkan semua"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Buka kunci untuk membayar"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Sedia"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Sediakan pembayaran"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Buka kunci untuk menggunakan"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Terdapat masalah sewaktu mendapatkan kad anda. Sila cuba sebentar lagi"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Profil kerja"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mod pesawat"</string>
<string name="add_tile" msgid="6239678623873086686">"Tambahkan jubin"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Diturunkan Taraf kepada Senyap"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Dinilai Lebih Tinggi"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Dinilai Lebih Rendah"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ditunjukkan di sebelah atas bahagian perbualan, terpapar sebagai gelembung terapung, gambar profil dipaparkan pada skrin kunci"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Sentiasa ditunjukkan di sebelah atas pemberitahuan anda, walaupun apabila mod Keutamaan dihidupkan"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Perbualan keutamaan"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong ciri perbualan"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Perbualan ditetapkan kepada keutamaan"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Perbualan keutamaan akan:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Muncul di atas bahagian perbualan"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Memaparkan gambar profil pada skrin kunci"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Dipaparkan sebagai gelembung terapung di atas apl"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Perbualan keutamaan"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Perbualan ini ditunjukkan di sebelah atas senarai anda dan sentiasa boleh mencapai anda apabila mod Keutamaan dihidupkan"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Gambar profil ditunjukkan pada skrin kunci"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Anda boleh menemukan perbualan ini dengan mudah dalam gelembung pada Skrin utama anda"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ganggu ciri Jangan Ganggu"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Tetapan"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Tukar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Butang kebolehaksesan menggantikan gerak isyarat kebolehaksesan\n\n"<annotation id="link">"Lihat tetapan"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Gerakkan butang ke tepi untuk menyembunyikannya buat sementara waktu"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Alihkan ke atas sebelah kiri"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Alihkan ke atas sebelah kanan"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Alihkan ke bawah sebelah kiri"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Alihkan ke bawah sebelah kanan"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Alihkan ke tepi dan sorokkan"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alihkan ke tepi dan tunjukkan"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kawalan peranti"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambah kawalan untuk peranti yang disambungkan"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Sediakan kawalan peranti"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Buka perbualan"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widget perbualan"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ketik perbualan untuk menambahkan perbualan itu pada skrin Utama anda"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Semak di sini semula selepas anda mendapat beberapa mesej"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Perbualan keutamaan"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Perbualan terbaharu"</string>
+ <string name="okay" msgid="6490552955618608554">"Okey"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kurang daripada <xliff:g id="DURATION">%1$s</xliff:g> lalu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Lebih <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="birthday_status" msgid="2596961629465396761">"Hari Lahir"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Hari ini hari lahir <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Hari lahir tak lama lagi"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Hari lahir <xliff:g id="NAME">%1$s</xliff:g> tidak lama lagi"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Ulang tahun"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Ulang tahun <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Berkongsi lokasi"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> berkongsi lokasi"</string>
<string name="new_story_status" msgid="9012195158584846525">"Cerita baharu"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> berkongsi cerita baharu"</string>
<string name="video_status" msgid="4548544654316843225">"Menonton"</string>
<string name="audio_status" msgid="4237055636967709208">"Mendengar"</string>
<string name="game_status" msgid="1340694320630973259">"Memainkan"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Rakan"</string>
<string name="empty_status" msgid="5938893404951307749">"Mari bersembang!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Kandungan akan muncul tidak lama lagi"</string>
<string name="missed_call" msgid="4228016077700161689">"Panggilan terlepas"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Lihat mesej terbaharu, panggilan terlepas dan kemaskinian status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Perbualan"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> menghantar mesej"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> menghantar imej"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Masalah membaca meter bateri anda"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketik untuk mendapatkan maklumat lanjut"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Tiada penggera"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index abcbb83..091a384 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ပယ်ရန်"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"လက်ဗွေ သင်္ကေတ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"မျက်နှာကို မမှတ်မိပါ။ လက်ဗွေကို အစားထိုးသုံးပါ။"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ရှေ့ဆက်ရန် သင့်လက်ဗွေကို သုံးပါ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"လက်ဗွေကို မမှတ်မိပါ။ ဖန်သားပြင်လော့ခ်ချခြင်းကို အစားထိုးသုံးပါ။"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"သင့်ကို ရှာဖွေနေသည်…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"မျက်နှာသင်္ကေတ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"အံဝင်ခွင်ကျ ဇူးမ်ခလုတ်"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"အဆင်သင့်"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"အလုပ် ပရိုဖိုင်"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>အခြေအနေ-</b> အသံတိတ်ခြင်းသို့ ပြန်ချိန်ညှိထားသည်"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>အခြေအနေ-</b> အဆင့်တိုးထားသည်"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>အခြေအနေ-</b> အဆင့်လျှော့ထားသည်"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်၊ လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြသည်"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ဆက်တင်များ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"စကားဝိုင်းကို ဦးစားပေးအဖြစ် သတ်မှတ်ထားသည်"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ဦးစားပေး စကားဝိုင်းသည်-"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"စကားဝိုင်းကဏ္ဍ၏ အပေါ်ဘက်တွင်ပြရန်"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြရန်"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"အက်ပ်အပေါ်တွင် မျောနေသောပူဖောင်းကွက်အဖြစ် ပေါ်မည်"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'မနှောင့်ယှက်ရ\' ကို ကြားဖြတ်ခြင်း"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ဆက်တင်များ"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ခလုတ်"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"အများသုံးစွဲနိုင်မှုခလုတ်က အများသုံးစွဲနိုင်မှုလက်ဟန်ကို အစားထိုးသည်\n\n"<annotation id="link">"ဆက်တင်များကို ကြည့်ပါ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ခလုတ်ကို ယာယီဝှက်ရန် အစွန်းသို့ရွှေ့ပါ"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"စက်ထိန်းစနစ်"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ချိတ်ဆက်စက်များအတွက် ထိန်းချုပ်မှုများထည့်ပါ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"စက်ထိန်းစနစ် ထည့်သွင်းခြင်း"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"စကားဝိုင်းကို သင်၏ ‘ပင်မစာမျက်နှာ’ သို့ထည့်ရန် တို့ပါ"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"မက်ဆေ့ဂျ်အချို့ရသည်နှင့် ဤနေရာမှာ ပြန်စစ်ဆေးပါ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ဦးစားပေး စကားဝိုင်းများ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"မကြာသေးမီက စကားဝိုင်းများ"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"ပြီးခဲ့သည့် <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> မပြည့်ခင်"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> ကျော်"</string>
<string name="birthday_status" msgid="2596961629465396761">"မွေးနေ့"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"မကြာမီလာမည့် မွေးနေ့"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"နှစ်ပတ်လည်"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"တည်နေရာမျှဝေခြင်း"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"ဝဘ်ပို့စ်အသစ်"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"ကြည့်ရှုနေသည်"</string>
<string name="audio_status" msgid="4237055636967709208">"နားထောင်နေသည်"</string>
<string name="game_status" msgid="1340694320630973259">"ကစားနေသည်"</string>
<string name="empty_user_name" msgid="3389155775773578300">"မိတ်ဆွေများ"</string>
<string name="empty_status" msgid="5938893404951307749">"ယနေ့ညချတ်လုပ်ကြစို့။"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"လွတ်သွားသောခေါ်ဆိုမှု"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"မကြာသေးမီက မက်ဆေ့ဂျ်၊ လွတ်သွားသောခေါ်ဆိုမှုနှင့် အခြေအနေအပ်ဒိတ်များကို ကြည့်နိုင်သည်"</string>
<string name="people_tile_title" msgid="6589377493334871272">"စကားဝိုင်း"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"သင်၏ ဘက်ထရီမီတာကို ဖတ်ရာတွင် ပြဿနာရှိနေသည်"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"နောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"နှိုးစက်ပေးမထားပါ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 6f766352..a2e6c48 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Avvis"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Trykk på fingeravtrykkssensoren"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikon for fingeravtrykk"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet gjenkjennes ikke. Bruk fingeravtrykk."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Bruk fingeravtrykket for å fortsette"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Fingeravtrykket gjenkjennes ikke. Bruk skjermlås i stedet."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Ser etter deg …"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ansiktikon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Zoomknapp for kompatibilitet."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work-profil"</string>
@@ -735,14 +737,16 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Nedgradert til lydløst"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Rangert høyere"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Rangert lavere"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtaledelen, vises som en flytende boble, viser profilbildet på låseskjermen"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Innstillinger"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalefunksjoner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Denne varselgruppen kan ikke konfigureres her"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Omdirigert varsel"</string>
- <string name="notification_channel_dialog_title" msgid="6856514143093200019">"Alle <xliff:g id="APP_NAME">%1$s</xliff:g>-varsler"</string>
+ <string name="notification_channel_dialog_title" msgid="6856514143093200019">"Alle varsler fra <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="see_more_title" msgid="7409317011708185729">"Se mer"</string>
<string name="appops_camera" msgid="5215967620896725715">"Denne appen bruker kameraet."</string>
<string name="appops_microphone" msgid="8805468338613070149">"Denne appen bruker mikrofonen."</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Samtalen er prioritert"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Dette skjer med prioriterte samtaler:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"De vises øverst i samtaledelen."</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profilbildet vises på låseskjermen."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vises som en svevende boble over apper"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Overstyr «Ikke forstyrr»"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Greit"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Innstillinger"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Bytt"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Tilgjengelighet-knappen har erstattet tilgjengelighetsbevegelsen\n\n"<annotation id="link">"Se innstillingene"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Flytt knappen til kanten for å skjule den midlertidig"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Legg til kontroller for de tilkoblede enhetene dine"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhetsstyring"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Åpen samtale"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Samtalemoduler"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Trykk på en samtale for å legge den til på startskjermen"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Sjekk her igjen når du mottar noen meldinger"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriterte samtaler"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nylige samtaler"</string>
+ <string name="okay" msgid="6490552955618608554">"Ok"</string>
<string name="timestamp" msgid="6577851592534538533">"For <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"For mindre enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"For mer enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="birthday_status" msgid="2596961629465396761">"Bursdag"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Bursdag snart"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Merkedag"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Deler posisjonen"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Ny nyhetssak"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Ser på"</string>
<string name="audio_status" msgid="4237055636967709208">"Lytter"</string>
<string name="game_status" msgid="1340694320630973259">"Spiller"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Venner"</string>
<string name="empty_status" msgid="5938893404951307749">"La oss chatte senere"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Tapt anrop"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se nylige meldinger, tapte anrop og statusoppdateringer"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kunne ikke lese batterimåleren"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trykk for å få mer informasjon"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm angitt"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 0be4f52..36837c0 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4811759950673118541">"प्रणाली UI"</string>
+ <string name="app_label" msgid="4811759950673118541">"सिस्टम UI"</string>
<string name="status_bar_clear_all_button" msgid="2491321682873657397">"हटाउनुहोस्"</string>
<string name="status_bar_no_notifications_title" msgid="7812479124981107507">"कुनै सूचनाहरू छैन"</string>
<string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"चलिरहेको"</string>
@@ -62,13 +62,13 @@
<string name="usb_debugging_always" msgid="4003121804294739548">"यो कम्प्युटरबाट सधैँ अनुमति दिनुहोस्"</string>
<string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमति दिनुहोस्"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डिबग गर्न अनुमति छैन"</string>
- <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्।"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"हाल यस डिभाइसमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्।"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"यस नेटवर्कमा वायरलेस डिबगिङ सेवा प्रयोग गर्न दिने हो?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"नेटवर्कको नाम (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi ठेगाना (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"यस नेटवर्कमा सधैँ अनुमति दिनुहोस्"</string>
<string name="wifi_debugging_allow" msgid="4573224609684957886">"अनुमति दिनुहोस्"</string>
<string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"वायरलेस डिबगिङ सेवालाई अनुमति दिइएको छैन"</string>
- <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"हाल यस यन्त्रमा साइन इन हुनुभएका प्रयोगकर्ता वायरलेस डिबगिङ सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्ताको खातामार्फत साइन इन गर्नुहोस्।"</string>
+ <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"हाल यस डिभाइसमा साइन इन हुनुभएका प्रयोगकर्ता वायरलेस डिबगिङ सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्ताको खातामार्फत साइन इन गर्नुहोस्।"</string>
<string name="usb_contaminant_title" msgid="894052515034594113">"USB पोर्ट असक्षम पारियो"</string>
<string name="usb_contaminant_message" msgid="7730476585174719805">"तपाईंको यन्त्रलाई तरल पदार्थ वा धुलोबाट जोगाउन यसको USB पोर्ट असक्षम पारिएको छ र यसले कुनै पनि सहायक उपकरणहरू पहिचान गर्ने छैन।\n\nउक्त USB पोर्ट फेरि प्रयोग गर्दा हुन्छ भने तपाईंलाई यसबारे सूचित गरिने छ।"</string>
<string name="usb_port_enabled" msgid="531823867664717018">"चार्जर तथा सामानहरू पत्ता लगाउन सक्षम पारिएको USB पोर्ट"</string>
@@ -98,12 +98,12 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"रेकर्ड गर्न थाल्ने हो?"</string>
- <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको यन्त्रमा प्ले गरिने सबै संवेदनशील जानकारी रेकर्ड गर्न सक्छ। यो जानकारीमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string>
+ <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको डिभाइसमा प्ले गरिने सबै संवेदनशील जानकारी रेकर्ड गर्न सक्छ। यो जानकारीमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"अडियो रेकर्ड गर्नुहोस्"</string>
- <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"यन्त्रको अडियो"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"तपाईंको यन्त्रका सङ्गीत, कल र रिङटोन जस्ता आवाज"</string>
+ <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"डिभाइसको अडियो"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"तपाईंको डिभाइसका सङ्गीत, कल र रिङटोन जस्ता आवाज"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"माइक्रोफोन"</string>
- <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"यन्त्रको अडियो र माइक्रोफोनको आवाज"</string>
+ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"डिभाइसको अडियो र माइक्रोफोनको आवाज"</string>
<string name="screenrecord_start" msgid="330991441575775004">"सुरु गर्नुहोस्"</string>
<string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"स्क्रिन रेकर्ड गर्दै"</string>
<string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"स्क्रिन र अडियो रेकर्ड गर्दै"</string>
@@ -162,16 +162,16 @@
<string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"अत्यन्तै धेरै पटक गलत प्रयास गरिए। \n <xliff:g id="NUMBER">%d</xliff:g>सेकेन्ड पछि पुनः प्रयास गर्नुहोस्।"</string>
<string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"फेरि प्रयास गर्नुहोस्। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> मध्ये <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> प्रयास।"</string>
<string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"तपाईंको डेटा मेटाइने छ"</string>
- <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string>
- <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string>
- <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string>
+ <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो डिभाइसको डेटा मेटाइने छ।"</string>
+ <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने यो डिभाइसको डेटा मेटाइने छ।"</string>
+ <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने यो डिभाइसको डेटा मेटाइने छ।"</string>
<string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string>
<string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string>
<string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string>
<string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string>
<string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string>
<string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string>
- <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो यन्त्रको डेटा मेटाइने छ।"</string>
+ <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो डिभाइसको डेटा मेटाइने छ।"</string>
<string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो प्रयोगकर्तालाई हटाइने छ।"</string>
<string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो कार्यलयको प्रोफाइल र यसको डेटा मेटाइने छ।"</string>
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"हटाउनुहोस्"</string>
@@ -425,8 +425,8 @@
<string name="quick_settings_screen_record_label" msgid="1594046461509776676">"स्रिनको रेकर्ड"</string>
<string name="quick_settings_screen_record_start" msgid="1574725369331638985">"सुरु गर्नुहोस्"</string>
<string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"रोक्नुहोस्"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="8643239110815357707">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको यन्त्रको माइक्रोफोन प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="7773612142162829116">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको यन्त्रको क्यामेरा प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="8643239110815357707">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको डिभाइसको माइक्रोफोन प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="7773612142162829116">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको डिभाइसको क्यामेरा प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
<string name="media_seamless_remote_device" msgid="177033467332920464">"यन्त्र"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"एपहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"एपहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string>
@@ -450,9 +450,9 @@
<string name="keyguard_unlock" msgid="8031975796351361601">"खोल्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="keyguard_retry" msgid="886802522584053523">"फेरि प्रयास गर्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC प्रयोग गर्न स्क्रिन अनलक गर्नुहोस्"</string>
- <string name="do_disclosure_generic" msgid="4896482821974707167">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ"</string>
- <string name="do_disclosure_with_name" msgid="2091641464065004091">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> को स्वामित्वमा छ"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो यन्त्र उपलब्ध गराएको हो"</string>
+ <string name="do_disclosure_generic" msgid="4896482821974707167">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ"</string>
+ <string name="do_disclosure_with_name" msgid="2091641464065004091">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> को स्वामित्वमा छ"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो डिभाइस उपलब्ध गराएको हो"</string>
<string name="phone_hint" msgid="6682125338461375925">"फोनको लागि आइकनबाट स्वाइप गर्नुहोस्"</string>
<string name="voice_hint" msgid="7476017460191291417">"आवाज सहायताका लागि आइकनबाट स्वाइप गर्नुहोस्"</string>
<string name="camera_hint" msgid="4519495795000658637">"क्यामेराको लागि आइकनबाट स्वाइप गर्नुहोस्"</string>
@@ -497,7 +497,7 @@
<string name="user_remove_user_message" msgid="6702834122128031833">"यस प्रयोगकर्ताको सबै एपहरू तथा डेटा हटाइने छ।"</string>
<string name="user_remove_user_remove" msgid="8387386066949061256">"हटाउनुहोस्"</string>
<string name="battery_saver_notification_title" msgid="8419266546034372562">"ब्याट्री सेभर अन छ"</string>
- <string name="battery_saver_notification_text" msgid="2617841636449016951">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string>
+ <string name="battery_saver_notification_text" msgid="2617841636449016951">"प्रदर्शन र ब्याकग्राउन्ड डेटा घटाउँनुहोस्"</string>
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ब्याट्री सेभर अफ गर्नुहोस्"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, फोटो, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"यो कार्य प्रदान गर्ने सेवाले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, फोटो, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string>
@@ -518,26 +518,26 @@
<string name="profile_owned_footer" msgid="2756770645766113964">"प्रोफाइल अनुगमन हुन सक्छ"</string>
<string name="vpn_footer" msgid="3457155078010607471">"सञ्जाल अनुगमित हुन सक्छ"</string>
<string name="branded_vpn_footer" msgid="816930186313188514">"नेटवर्कको अनुगमन गरिने सम्भावना छ"</string>
- <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"यो यन्त्र तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ"</string>
- <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string>
- <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो यन्त्र उपलब्ध गराएको हो"</string>
- <string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ र <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
- <string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र <xliff:g id="VPN_APP">%2$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
- <string name="quick_settings_disclosure_management" msgid="5515296598440684962">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ"</string>
- <string name="quick_settings_disclosure_named_management" msgid="3476472755775165827">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ"</string>
- <string name="quick_settings_disclosure_management_vpns" msgid="371835422690053154">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string>
- <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string>
+ <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"यो डिभाइस तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ"</string>
+ <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string>
+ <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो डिभाइस उपलब्ध गराएको हो"</string>
+ <string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ र <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
+ <string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र <xliff:g id="VPN_APP">%2$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
+ <string name="quick_settings_disclosure_management" msgid="5515296598440684962">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ"</string>
+ <string name="quick_settings_disclosure_named_management" msgid="3476472755775165827">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ"</string>
+ <string name="quick_settings_disclosure_management_vpns" msgid="371835422690053154">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string>
+ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा नेटवर्कको ट्राफिकको अनुगमन गर्न पनि सक्छ"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलमा नेटवर्क ट्राफिकको अनुगमन गर्न पनि सक्छ"</string>
<string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"तपाईंका IT एड्मिन कार्य प्रोफाइलमा गरिने नेटवर्कसम्बन्धी क्रियाकलाप देख्न सक्नुहुन्छ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्कको अनुगमन हुनसक्छ"</string>
- <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"यो यन्त्र VPN हरूमा कनेक्ट गरिएको छ"</string>
+ <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"यो डिभाइस VPN हरूमा कनेक्ट गरिएको छ"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"तपाईंको कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"तपाईंको व्यक्तिगत प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"यो यन्त्र <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो यन्त्र उपलब्ध गराएको हो"</string>
- <string name="monitoring_title_device_owned" msgid="7029691083837606324">"यन्त्रको व्यवस्थापन"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"यो डिभाइस <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले यो डिभाइस उपलब्ध गराएको हो"</string>
+ <string name="monitoring_title_device_owned" msgid="7029691083837606324">"डिभाइसको व्यवस्थापन"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"प्रोफाइल अनुगमन गर्दै"</string>
<string name="monitoring_title" msgid="4063890083735924568">"सञ्जाल अनुगमन"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
@@ -547,21 +547,21 @@
<string name="disconnect_vpn" msgid="26286850045344557">"विच्छेद VPN"</string>
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"नीतिहरू हेर्नुहोस्"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"नियन्त्रणहरू हेर्नुहोस्"</string>
- <string name="monitoring_description_named_management" msgid="505833016545056036">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ।\n\nतपाईंका IT एड्मिन सेटिङ, संस्थागत पहुँच, एप, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको निगरानी र व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्ना IT एड्मिनसँग सम्पर्क गर्नुहोस्।"</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> ले यो यन्त्रसँग सम्बन्धित डेटा प्रयोग गर्न, एपहरू व्यवस्थापन गर्न र यी यन्त्रहरूको सेटिङ बदल्न सक्छ।\n\nतपाईंसँग प्रश्नहरू छन् भने <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> मा सम्पर्क गर्नुहोस्।"</string>
- <string name="monitoring_description_management" msgid="4308879039175729014">"यो यन्त्र तपाईंको सङ्गठनको स्वामित्वमा छ।\n\nतपाईंका IT एड्मिन सेटिङ, संस्थागत पहुँच, एप, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको निगरानी र व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्ना IT एड्मिनसँग सम्पर्क गर्नुहोस्।"</string>
+ <string name="monitoring_description_named_management" msgid="505833016545056036">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ।\n\nतपाईंका IT एड्मिन सेटिङ, संस्थागत पहुँच, एप, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको डिभाइसको स्थानसम्बन्धी जानकारीको निगरानी र व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्ना IT एड्मिनसँग सम्पर्क गर्नुहोस्।"</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> ले यो डिभाइससँग सम्बन्धित डेटा प्रयोग गर्न, एपहरू व्यवस्थापन गर्न र यी डिभाइसहरूको सेटिङ बदल्न सक्छ।\n\nतपाईंसँग प्रश्नहरू छन् भने <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> मा सम्पर्क गर्नुहोस्।"</string>
+ <string name="monitoring_description_management" msgid="4308879039175729014">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ।\n\nतपाईंका IT एड्मिन सेटिङ, संस्थागत पहुँच, एप, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको डिभाइसको स्थानसम्बन्धी जानकारीको निगरानी र व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्ना IT एड्मिनसँग सम्पर्क गर्नुहोस्।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापित गऱ्यो। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरेको छ। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
- <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"यस यन्त्रमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
- <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"तपाईंका प्रशासकले तपाईंको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्क लग गर्ने प्रक्रियालाई सक्रिय गर्नुभएको छ।"</string>
+ <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"यस डिभाइसमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
+ <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"तपाईंका प्रशासकले तपाईंको डिभाइसमा ट्राफिकको अनुगमन गर्ने नेटवर्क लग गर्ने प्रक्रियालाई सक्रिय गर्नुभएको छ।"</string>
<string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"तपाईंका एड्मिनले \'नेटवर्क लगिङ\' सुविधा अन गर्नुभएको छ। यो सुविधाले तपाईंको कार्य प्रोफाइलको ट्राफिक अनुगमन गर्छ तर व्यक्तिगत प्रोफाइलको ट्राफिक भने अनुगमन गर्दैन।"</string>
<string name="monitoring_description_named_vpn" msgid="5749932930634037027">"तपाईं इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string>
<string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"तपाईं इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP_0">%1$s</xliff:g> र <xliff:g id="VPN_APP_1">%2$s</xliff:g> मा जडान हुनुहुन्छ।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"तपाईंको कार्य प्रोफाइल तपाईंका इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"तपाईंको व्यक्तिगत प्रोफाइल इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string>
<string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"तपाईंको यन्त्र <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> द्वारा व्यवस्थापन गरिएको छ।"</string>
- <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्न <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> को प्रयोग गर्दछ।"</string>
- <string name="monitoring_description_do_body" msgid="7700878065625769970">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, एप, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string>
+ <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको डिभाइसको व्यवस्थापन गर्न <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> को प्रयोग गर्दछ।"</string>
+ <string name="monitoring_description_do_body" msgid="7700878065625769970">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, एप, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको डिभाइसको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
<string name="monitoring_description_do_learn_more" msgid="645149183455573790">"थप जान्नुहोस्"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"तपाईं <xliff:g id="VPN_APP">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string>
@@ -569,10 +569,10 @@
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN सम्बन्धी सेटिङहरू खोल्नुहोस्"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"खुला विश्वसनीय प्रमाणहरू"</string>
- <string name="monitoring_description_network_logging" msgid="577305979174002252">"तपाईँको प्रशासकले तपाईँको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्कको लगिङलाई सक्रिय पार्नुभएको छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
+ <string name="monitoring_description_network_logging" msgid="577305979174002252">"तपाईँको प्रशासकले तपाईँको डिभाइसमा ट्राफिकको अनुगमन गर्ने नेटवर्कको लगिङलाई सक्रिय पार्नुभएको छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
<string name="monitoring_description_vpn" msgid="1685428000684586870">"तपाईँले VPN जडान गर्न एपलाई अनुमति दिनुभयो।\n\nयो एपले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, एप र वेबसाइटहरू अनुगमन गर्न सक्छ।"</string>
<string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"तपाईंको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> ले व्यवस्थापन गर्दछ।\n\nतपाईंको प्रशासकले तपाईंको इमेल, एप र वेबसाइट सहित नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईं एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्छ।"</string>
- <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"यो यन्त्र तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ। तपाईंका अभिभावक तपाईंले प्रयोग गर्ने एप, तपाईंको स्थान र तपाईंले यन्त्र चलाएर बिताउने समय जस्ता जानकारी हेर्न तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string>
+ <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"यो डिभाइस तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ। तपाईंका अभिभावक तपाईंले प्रयोग गर्ने एप, तपाईंको स्थान र तपाईंले यन्त्र चलाएर बिताउने समय जस्ता जानकारी हेर्न तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="monitoring_description_app" msgid="376868879287922929">"तपाईं आफ्ना इमेल, एप र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string>
<string name="monitoring_description_app_personal" msgid="1970094872688265987">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> सँग जडित हुनुहुन्छ जसले इ-मेल, एपहरू र वेबसाइट लगायतका तपाईंको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।"</string>
@@ -648,7 +648,7 @@
<string name="output_service_bt" msgid="4315362133973911687">"ब्लुटुथ"</string>
<string name="output_service_wifi" msgid="9003667810868222134">"Wi-Fi"</string>
<string name="output_service_bt_wifi" msgid="7186882540475524124">"ब्लुटुथ र Wi-Fi"</string>
- <string name="system_ui_tuner" msgid="1471348823289954729">"प्रणाली UI ट्युनर"</string>
+ <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string>
<string name="show_battery_percentage" msgid="6235377891802910455">"इम्बेड गरिएको ब्याट्री प्रतिशत देखाउनुहोस्"</string>
<string name="show_battery_percentage_summary" msgid="9053024758304102915">"चार्ज नगरेको बेला स्टाटस बार आइकन भित्र ब्याट्री प्रतिशत स्तर देखाउनुहोस्"</string>
<string name="quick_settings" msgid="6211774484997470203">"द्रुत सेटिङहरू"</string>
@@ -664,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"तयार छ"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"कार्य प्रोफाइल"</string>
@@ -679,13 +684,13 @@
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"कार्य प्रोफाइल"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"केहीका लागि रमाइलो हुन्छ तर सबैका लागि होइन"</string>
- <string name="tuner_warning" msgid="1861736288458481650">"प्रणाली UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस आफू अनुकूल गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string>
+ <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस आफू अनुकूल गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string>
<string name="tuner_persistent_warning" msgid="230466285569307806">"यी प्रयोगात्मक सुविधाहरू भावी विमोचनहरूमा परिवर्तन हुन, बिग्रन वा हराउन सक्छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string>
<string name="got_it" msgid="477119182261892069">"बुझेँ"</string>
- <string name="tuner_toast" msgid="3812684836514766951">"बधाईँ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ"</string>
+ <string name="tuner_toast" msgid="3812684836514766951">"बधाईँ छ! सेटिङहरूमा सिस्टम UI ट्युनर थप गरिएको छ"</string>
<string name="remove_from_settings" msgid="633775561782209994">"सेटिङहरूबाट हटाउनुहोस्"</string>
- <string name="remove_from_settings_prompt" msgid="551565437265615426">"प्रणाली UI ट्युनर सेटिङहरूबाट हटाउने र यसका सबै सुविधाहरू प्रयोग गर्न रोक्ने हो?"</string>
- <string name="activity_not_found" msgid="8711661533828200293">"तपाईँको यन्त्रमा एप स्थापना भएको छैन"</string>
+ <string name="remove_from_settings_prompt" msgid="551565437265615426">"सिस्टम UI ट्युनर सेटिङहरूबाट हटाउने र यसका सबै सुविधाहरू प्रयोग गर्न रोक्ने हो?"</string>
+ <string name="activity_not_found" msgid="8711661533828200293">"तपाईँको डिभाइसमा एप स्थापना भएको छैन"</string>
<string name="clock_seconds" msgid="8709189470828542071">"घडीमा सेकेन्ड देखाउनुहोस्"</string>
<string name="clock_seconds_desc" msgid="2415312788902144817">"वस्तुस्थिति पट्टीको घडीमा सेकेन्ड देखाउनुहोस्। ब्याट्री आयु प्रभावित हुन सक्छ।"</string>
<string name="qs_rearrange" msgid="484816665478662911">"द्रुत सेटिङहरू पुनः व्यवस्थित गर्नुहोस्"</string>
@@ -735,22 +740,24 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>स्थिति:</b> सूचनालाई कम महत्त्वपूर्ण ठानी साइलेन्ट मोडमा सेट गरिएको छ"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>स्थिति:</b> धेरै महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>स्थिति:</b> कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखिन्छ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"प्रोक्सीमार्फत आउने सूचना"</string>
<string name="notification_channel_dialog_title" msgid="6856514143093200019">"<xliff:g id="APP_NAME">%1$s</xliff:g> सम्बन्धी सबै सूचनाहरू"</string>
<string name="see_more_title" msgid="7409317011708185729">"थप हेर्नुहोस्"</string>
- <string name="appops_camera" msgid="5215967620896725715">"यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।"</string>
- <string name="appops_microphone" msgid="8805468338613070149">"यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।"</string>
- <string name="appops_overlay" msgid="4822261562576558490">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्दै छ।"</string>
- <string name="appops_camera_mic" msgid="7032239823944420431">"यो अनुप्रयोगले माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string>
- <string name="appops_camera_overlay" msgid="6466845606058816484">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै क्यामेराको प्रयोग गर्दै छ।"</string>
- <string name="appops_mic_overlay" msgid="4609326508944233061">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोनको प्रयोग गर्दै छ।"</string>
- <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string>
+ <string name="appops_camera" msgid="5215967620896725715">"यो एपले क्यामेराको प्रयोग गर्दै छ।"</string>
+ <string name="appops_microphone" msgid="8805468338613070149">"यो एपले माइक्रोफोनको प्रयोग गर्दै छ।"</string>
+ <string name="appops_overlay" msgid="4822261562576558490">"यो एपले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्दै छ।"</string>
+ <string name="appops_camera_mic" msgid="7032239823944420431">"यो एपले माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string>
+ <string name="appops_camera_overlay" msgid="6466845606058816484">"यो एपले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै क्यामेराको प्रयोग गर्दै छ।"</string>
+ <string name="appops_mic_overlay" msgid="4609326508944233061">"यो एपले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोनको प्रयोग गर्दै छ।"</string>
+ <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यो एपले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string>
<string name="notification_appops_settings" msgid="5208974858340445174">"सेटिङहरू"</string>
<string name="notification_appops_ok" msgid="2177609375872784124">"ठिक छ"</string>
<string name="feedback_alerted" msgid="5192459808484271208">"सिस्टमले स्वतः यस सूचनालाई <b>महत्त्वपूर्ण ठानी पूर्वनिर्धारित मोडमा</b> सेट गरिदियो।"</string>
@@ -793,7 +800,7 @@
<string name="battery_panel_title" msgid="5931157246673665963">"ब्याट्री उपयोग"</string>
<string name="battery_detail_charging_summary" msgid="8821202155297559706">"चार्ज गर्ने समयमा ब्याट्री सेभर उपलब्ध छैन"</string>
<string name="battery_detail_switch_title" msgid="6940976502957380405">"ब्याट्री सेभर"</string>
- <string name="battery_detail_switch_summary" msgid="3668748557848025990">"कार्यसम्पादन र पृष्ठभूमि डेटा घटाउँछ"</string>
+ <string name="battery_detail_switch_summary" msgid="3668748557848025990">"कार्यसम्पादन र ब्याकग्राउन्ड डेटा घटाउँछ"</string>
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> बटन"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"पछाडि"</string>
@@ -870,7 +877,7 @@
<item msgid="5874146774389433072">"दायाँतिर लैजानुहोस्"</item>
</string-array>
<string name="menu_ime" msgid="5677467548258017952">"किबोर्ड स्विचर"</string>
- <string name="save" msgid="3392754183673848006">"सुरक्षित गर्नुहोस्"</string>
+ <string name="save" msgid="3392754183673848006">"सेभ गर्नुहोस्"</string>
<string name="reset" msgid="8715144064608810383">"रिसेट गर्नुहोस्"</string>
<string name="adjust_button_width" msgid="8313444823666482197">"बटनको चौडाइ समायोजन गर्नुहोस्"</string>
<string name="clipboard" msgid="8517342737534284617">"क्लिपबोर्ड"</string>
@@ -925,13 +932,13 @@
<string name="thermal_shutdown_title" msgid="2702966892682930264">"फोन अति नै तातिएकाले चिसिन बन्द भयो"</string>
<string name="thermal_shutdown_message" msgid="6142269839066172984">"तपाईंको फोन अहिले सामान्य रूपमा चलिरहेको छ।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string>
<string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने एपहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन एपहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग"</string>
- <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"यन्त्रको हेरचाह गर्ने तरिका हेर्नुहोस्"</string>
+ <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"डिभाइसको हेरचाह गर्ने तरिका हेर्नुहोस्"</string>
<string name="high_temp_title" msgid="2218333576838496100">"फोन तातो भइरहेको छ"</string>
<string name="high_temp_notif_message" msgid="1277346543068257549">"फोन नचिस्सिँदासम्म केही सुविधाहरू उपलब्ध हुने छैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string>
<string name="high_temp_dialog_message" msgid="3793606072661253968">"तपाईंको फोन स्वतः चिसो हुने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।"</string>
- <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"यन्त्रको हेरचाह गर्ने तरिका हेर्नुहोस्"</string>
+ <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"डिभाइसको हेरचाह गर्ने तरिका हेर्नुहोस्"</string>
<string name="high_temp_alarm_title" msgid="2359958549570161495">"चार्जर अनप्लग गर्नुहोस्"</string>
- <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"यो यन्त्र चार्ज गर्दा कुनै समस्या भयो। पावर एडाप्टर अनप्लग गर्नुहोस् र केबल तातो हुन सक्ने भएकाले ध्यान दिनुहोस्।"</string>
+ <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"यो डिभाइस चार्ज गर्दा कुनै समस्या भयो। पावर एडाप्टर अनप्लग गर्नुहोस् र केबल तातो हुन सक्ने भएकाले ध्यान दिनुहोस्।"</string>
<string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"हेरचाहसम्बन्धी चरणहरू हेर्नुहोस्"</string>
<string name="lockscreen_shortcut_left" msgid="1238765178956067599">"बायाँतिरको सर्टकट"</string>
<string name="lockscreen_shortcut_right" msgid="4138414674531853719">"दायाँतिरको सर्टकट"</string>
@@ -1004,17 +1011,21 @@
<string name="privacy_type_location" msgid="7991481648444066703">"स्थान"</string>
<string name="privacy_type_microphone" msgid="9136763906797732428">"माइक्रोफोन"</string>
<string name="sensor_privacy_mode" msgid="4462866919026513692">"सेन्सरहरू निष्क्रिय छन्"</string>
- <string name="device_services" msgid="1549944177856658705">"यन्त्रका सेवाहरू"</string>
+ <string name="device_services" msgid="1549944177856658705">"डिभाइसका सेवाहरू"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"सार्नुहोस्"</string>
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"वार्तालापको प्राथमिकता निर्धारण गरी \"महत्त्वपूर्ण\" बनाइयो"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"महत्वपूर्ण वार्तालापहरू:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"वार्तालाप खण्डको सिरानमा देखिने छन्"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लक स्क्रिनमा प्रोफाइल फोटो देखाउने छन्"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"एपहरूमाथि तैरिने बबलका रूपमा देखाइयोस्"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"बाधा नपुऱ्याउनुहोस् मोडलाई बेवास्ता गरियोस्"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"बुझेँ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिङ"</string>
@@ -1032,6 +1043,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"बदल्नुहोस्"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"एक्सेसिबिलिटी इसाराका स्थानमा एक्सेसिबिलिटी बटन प्रयोग हुन थालेको छ\n\n"<annotation id="link">"सेटिङ हेर्नुहोस्"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"यो बटन केही बेर नदेखिने पार्न किनारातिर सार्नुहोस्"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"यन्त्र नियन्त्रण गर्ने विजेटहरू"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"आफ्ना जोडिएका यन्त्रहरूका लागि नियन्त्रण सुविधाहरू थप्नुहोस्"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"यन्त्र नियन्त्रण गर्ने विजेटहरू सेटअप गर्नुहोस्"</string>
@@ -1096,7 +1119,7 @@
<string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> वटा यन्त्र चयन गरिए"</string>
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (डिस्कनेक्ट गरिएको)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"कनेक्ट गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string>
- <string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"नयाँ यन्त्रको जोडा बनाउनुहोस्"</string>
+ <string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"नयाँ डिभाइसको जोडा बनाउनुहोस्"</string>
<string name="build_number_clip_data_label" msgid="3623176728412560914">"बिल्ड नम्बर"</string>
<string name="build_number_copy_toast" msgid="877720921605503046">"बिल्ड नम्बर कपी गरी क्लिपबोर्डमा सारियो।"</string>
<string name="basic_status" msgid="2315371112182658176">"वार्तालाप खोल्नुहोस्"</string>
@@ -1114,20 +1137,36 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा कम समयअघि"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा बढी समयअघि"</string>
<string name="birthday_status" msgid="2596961629465396761">"जन्मदिन"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"आगामी जन्मदिन"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"वार्षिकोत्सव"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"स्थानसम्बन्धी जानकारी सेयर गरिँदै छ"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"नयाँ स्टोरी"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"भिडियो हेरिँदै छ"</string>
<string name="audio_status" msgid="4237055636967709208">"सुनिँदै छ"</string>
<string name="game_status" msgid="1340694320630973259">"खेलिँदै छ"</string>
<string name="empty_user_name" msgid="3389155775773578300">"साथीहरू"</string>
<string name="empty_status" msgid="5938893404951307749">"आज राति च्याट गरौँ!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"मिस कल"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"हालसालैका म्यासेज, मिस कल र स्ट्याटस अपडेट हेर्नुहोस्"</string>
<string name="people_tile_title" msgid="6589377493334871272">"वार्तालाप"</string>
- <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"यन्त्रको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
+ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म राखिएको छैन"</string>
</resources>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index 471f36b..e6c5bd0 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -33,7 +33,7 @@
<!-- The color of the text inside a notification -->
<color name="notification_primary_text_color">@*android:color/notification_primary_text_color_dark</color>
- <color name="notif_pill_background">@android:color/system_neutral1_800</color>
+ <color name="notif_pill_background">@*android:color/surface_dark</color>
<color name="notif_pill_text">@android:color/system_neutral1_50</color>
<color name="notification_guts_link_icon_tint">@color/GM2_grey_500</color>
@@ -47,9 +47,6 @@
<color name="notification_section_clear_all_btn_color">@color/GM2_grey_500</color>
<color name="notification_channel_dialog_separator">@color/GM2_grey_700</color>
- <!-- The color of the background in the bottom part of QSCustomizer -->
- <color name="qs_customize_decoration">@color/GM2_grey_900</color>
-
<!-- The color of the background in the separated list of the Global Actions menu -->
<color name="global_actions_separated_background">@color/GM2_grey_900</color>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index d46d489..fdf0e9b 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Klaar"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Alles tonen"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Ontgrendelen om te betalen"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Klaar"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Betaling instellen"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ontgrendelen om te gebruiken"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Er is een probleem opgetreden bij het ophalen van je kaarten. Probeer het later opnieuw."</string>
<string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Tegel toevoegen"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> verlaagd naar Stil"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> hoger gerangschikt"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> lager gerangschikt"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Verschijnt als zwevende bubbel bovenaan het gespreksgedeelte en toont profielfoto op vergrendelscherm"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Staat altijd bovenaan je meldingen, ook als de prioriteitsstand aanstaat"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Prioriteitsgesprekken"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Deze groep meldingen kan hier niet worden ingesteld"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ga naar Instellingen om de systeemnavigatie te updaten"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Gesprek ingesteld als prioriteit"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioriteitsgesprekken:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Worden bovenaan het gespreksgedeelte getoond"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tonen profielafbeelding op vergrendelscherm"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zijn als zwevende ballon zichtbaar vóór apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Prioriteitsgesprekken"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Deze gesprekken staan bovenaan je lijst en kunnen je altijd bereiken als de prioriteitsstand aanstaat"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profielfoto\'s worden getoond op het vergrendelscherm"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Je kunt deze gesprekken makkelijk vinden in ballonnen op je startscherm"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreken \'Niet storen\'"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellingen"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Schakelen"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"De knop Toegankelijkheid vervangt het toegankelijkheidsgebaar\n\n"<annotation id="link">"Instellingen bekijken"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Knop naar de rand verplaatsen om deze tijdelijk te verbergen"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Naar linksboven verplaatsen"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Naar rechtsboven verplaatsen"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Naar linksonder verplaatsen"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Naar rechtsonder verplaatsen"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Naar rand verplaatsen en verbergen"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Over rand verplaatsen en tonen"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Apparaatbediening"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bedieningselementen voor je gekoppelde apparaten toevoegen"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Apparaatbediening instellen"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Minder dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Meer dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string>
<string name="birthday_status" msgid="2596961629465396761">"Verjaardag"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"<xliff:g id="NAME">%1$s</xliff:g> is jarig"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Bijna jarig"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"<xliff:g id="NAME">%1$s</xliff:g> is binnenkort jarig"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Jubileum"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Het is het jubileum van <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Locatie delen"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> deelt de locatie"</string>
<string name="new_story_status" msgid="9012195158584846525">"Nieuw verhaal"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> heeft een nieuwe story gedeeld"</string>
<string name="video_status" msgid="4548544654316843225">"Aan het kijken"</string>
<string name="audio_status" msgid="4237055636967709208">"Aan het luisteren"</string>
<string name="game_status" msgid="1340694320630973259">"Aan het spelen"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Vrienden"</string>
<string name="empty_status" msgid="5938893404951307749">"Chatten vanavond?"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Er verschijnt binnenkort content"</string>
<string name="missed_call" msgid="4228016077700161689">"Gemist gesprek"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Bekijk recente berichten, gemiste gesprekken en statusupdates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> heeft een bericht gestuurd"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> heeft een afbeelding gestuurd"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem bij het lezen van je batterijmeter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik hier voor meer informatie"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker gezet"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 9739b41..cc9cad2 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"ପ୍ରସ୍ତୁତ"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ସ୍ଥିତି:</b> ନୀରବକୁ ଡିମୋଟ୍ କରାଯାଇଛି"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ସ୍ଥିତି:</b> ରେଙ୍କ ଉପରକୁ କରାଯାଇଛି"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ସ୍ଥିତି:</b> ରେଙ୍କ ତଳକୁ କରାଯାଇଛି"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଫ୍ଲୋଟିଂ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ବାର୍ତ୍ତାଳାପ ପ୍ରାଥମିକତାରେ ସେଟ୍ କରାଯାଇଛି"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ପ୍ରାଥମିକତା ଦିଆଯାଇଥିବା ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଦେଖାନ୍ତୁ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ଆପଗୁଡ଼ିକ ଉପରେ ଫ୍ଲୋଟିଂ ବବଲ୍ ପରି ଦେଖାଯିବ"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ମୋଡରେ ବାଧା"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ବୁଝିଗଲି"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ସେଟିଂସ୍"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚରକୁ ଆକ୍ସେସିବିଲିଟୀ ବଟନରେ ପରିବର୍ତ୍ତନ କରାଯାଇଛି\n\n"<annotation id="link">"ସେଟିଂସ୍ ଦେଖନ୍ତୁ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ବଟନକୁ ଅସ୍ଥାୟୀ ଭାବେ ଲୁଚାଇବା ପାଇଁ ଧାରକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ଆପଣଙ୍କ ସଂଯୁକ୍ତ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ନିୟନ୍ତ୍ରଣ ଯୋଗ କରନ୍ତୁ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ କମ୍ ସମୟ ପୂର୍ବେ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ ଅଧିକ ସମୟ ପୂର୍ବେ"</string>
<string name="birthday_status" msgid="2596961629465396761">"ଜନ୍ମଦିନ"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ଜନ୍ମଦିନ ଶୀଘ୍ର ଆସୁଛି"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"ବାର୍ଷିକ ଉତ୍ସବ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"ଲୋକେସନ୍ ସେୟାର୍ ହେଉଛି"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"ନୂଆ ଷ୍ଟୋରୀ"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"ଦେଖୁଛନ୍ତି"</string>
<string name="audio_status" msgid="4237055636967709208">"ଶୁଣୁଛି"</string>
<string name="game_status" msgid="1340694320630973259">"ଚାଲୁଛି"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ସାଙ୍ଗମାନେ"</string>
<string name="empty_status" msgid="5938893404951307749">"ରାତିରେ ଚାଟ୍ କରିବା!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"ମିସ୍ଡ କଲ୍"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ବର୍ତ୍ତମାନର ମେସେଜ୍, ମିସ୍ଡ କଲ୍ ଏବଂ ସ୍ଥିତି ଅପଡେଟଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ବାର୍ତ୍ତାଳାପ"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ଆଲାର୍ମ ସେଟ୍ ହୋଇନାହିଁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 1d9cabc..3de8716 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -144,7 +144,7 @@
<string name="voice_assist_label" msgid="3725967093735929020">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ ਖੋਲ੍ਹੋ"</string>
<string name="camera_label" msgid="8253821920931143699">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string>
<string name="cancel" msgid="1089011503403416730">"ਰੱਦ ਕਰੋ"</string>
- <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
+ <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ਤਸਦੀਕ ਕਰੋ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ਖਾਰਜ ਕਰੋ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ਚਿਹਰਾ ਨਹੀਂ ਪਛਾਣ ਸਕਦੇ। ਇਸਦੀ ਬਜਾਏ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ।"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਸਦੀ ਬਜਾਏ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ।"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ਚਿਹਰਾ ਪ੍ਰਤੀਕ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ਅਨੁਰੂਪਤਾ ਜ਼ੂਮ ਬਟਨ।"</string>
@@ -649,8 +646,8 @@
<string name="output_service_wifi" msgid="9003667810868222134">"ਵਾਈ-ਫਾਈ"</string>
<string name="output_service_bt_wifi" msgid="7186882540475524124">"ਬਲੂਟੁੱਥ ਅਤੇ ਵਾਈ-ਫਾਈ"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"System UI ਟਿਊਨਰ"</string>
- <string name="show_battery_percentage" msgid="6235377891802910455">"ਜੋਡ਼ੀ ਗਈ ਬੈਟਰੀ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string>
- <string name="show_battery_percentage_summary" msgid="9053024758304102915">"ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ ਤਾਂ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਦੇ ਅੰਦਰ ਬੈਟਰੀ ਪੱਧਰ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string>
+ <string name="show_battery_percentage" msgid="6235377891802910455">"ਜੋੜੀ ਗਈ ਬੈਟਰੀ ਫ਼ੀਸਦ ਦਿਖਾਓ"</string>
+ <string name="show_battery_percentage_summary" msgid="9053024758304102915">"ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ ਤਾਂ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਦੇ ਅੰਦਰ ਬੈਟਰੀ ਪੱਧਰ ਫ਼ੀਸਦ ਦਿਖਾਓ"</string>
<string name="quick_settings" msgid="6211774484997470203">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
<string name="status_bar" msgid="4357390266055077437">"ਸਥਿਤੀ ਪੱਟੀ"</string>
<string name="overview" msgid="3522318590458536816">"ਰੂਪ-ਰੇਖਾ"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"ਤਿਆਰ"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ਸਥਿਤੀ:</b> ਦਰਜਾ ਘਟਾ ਕੇ ਸ਼ਾਂਤ \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ਸਥਿਤੀ:</b> ਦਰਜਾ ਵਧਾਇਆ ਗਿਆ"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ਸਥਿਤੀ:</b> ਦਰਜਾ ਘਟਾਇਆ ਗਿਆ"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ, ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਈ ਜਾਂਦੀ ਹੈ"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਗੱਲਬਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
@@ -891,8 +895,8 @@
<item msgid="6135970080453877218">"ਇਸ ਪ੍ਰਤੀਕ ਨੂੰ ਨਾ ਦਿਖਾਓ"</item>
</string-array>
<string-array name="battery_options">
- <item msgid="7714004721411852551">"ਹਮੇਸ਼ਾਂ ਪ੍ਰਤੀਸ਼ਤਤਾ ਦਿਖਾਓ"</item>
- <item msgid="3805744470661798712">"ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਪ੍ਰਤੀਸ਼ਤਤਾ ਦਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
+ <item msgid="7714004721411852551">"ਹਮੇਸ਼ਾਂ ਫ਼ੀਸਦ ਦਿਖਾਓ"</item>
+ <item msgid="3805744470661798712">"ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਫ਼ੀਸਦ ਦਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
<item msgid="8619482474544321778">"ਇਸ ਪ੍ਰਤੀਕ ਨੂੰ ਨਾ ਦਿਖਾਓ"</item>
</string-array>
<string name="tuner_low_priority" msgid="8412666814123009820">"ਘੱਟ ਤਰਜੀਹ ਵਾਲੇ ਸੂਚਨਾ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਦਿਖਾਓ"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ਗੱਲਬਾਤ ਨੂੰ ਤਰਜੀਹੀ ਗੱਲਬਾਤ ਵਜੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ਤਰਜੀਹੀ ਗੱਲਾਂਬਾਤਾਂ ਨਾਲ ਇਹ ਵਿਹਾਰ ਹੋਵੇਗਾ:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਓ"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਓ"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ਐਪਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਫਲੋਟਿੰਗ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਵਿਘਨ ਪੈ ਸਕਦਾ ਹੈ"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ਸਮਝ ਲਿਆ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ਸੈਟਿੰਗਾਂ"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ਸਵਿੱਚ"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ\n\n"<annotation id="link">"ਸੈਟਿੰਗਾਂ ਦੇਖੋ"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ਬਟਨ ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਲੁਕਾਉਣ ਲਈ ਕਿਨਾਰੇ \'ਤੇ ਲਿਜਾਓ"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ਡੀਵਾਈਸ ਕੰਟਰੋਲ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ਆਪਣੇ ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਲਈ ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ਗੱਲਬਾਤ ਵਿਜੇਟ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕੋਈ ਗੱਲਬਾਤ ਚੁਣੋ"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"ਤੁਹਾਨੂੰ ਕੁਝ ਸੁਨੇਹੇ ਮਿਲਣ \'ਤੇ, ਉਹਨਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਵਾਪਸ ਇੱਥੇ ਆਓ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ਤਰਜੀਹੀ ਗੱਲਾਂਬਾਤਾਂ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ਹਾਲੀਆ ਗੱਲਾਂਬਾਤਾਂ"</string>
+ <string name="okay" msgid="6490552955618608554">"ਠੀਕ ਹੈ"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ਪਹਿਲਾਂ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਪਹਿਲਾਂ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਪਹਿਲਾਂ"</string>
<string name="birthday_status" msgid="2596961629465396761">"ਜਨਮਦਿਨ"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ਜਨਮਦਿਨ ਜਲਦ ਆ ਰਿਹਾ ਹੈ"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"ਵਰ੍ਹੇਗੰਢ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"ਟਿਕਾਣਾ ਸਾਂਝਾ ਹੋ ਰਿਹਾ ਹੈ"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"ਨਵੀਂ ਕਹਾਣੀ"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"ਦੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="audio_status" msgid="4237055636967709208">"ਸੁਣਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="game_status" msgid="1340694320630973259">"ਖੇਡੀ ਜਾ ਰਹੀ ਹੈ"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ਦੋਸਤ"</string>
<string name="empty_status" msgid="5938893404951307749">"ਆਓ ਅੱਜ ਰਾਤ ਚੈਟ ਕਰੀਏ!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"ਮਿਸ ਕਾਲ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ਹਾਲੀਆ ਸੁਨੇਹੇ, ਮਿਸ ਕਾਲਾਂ ਅਤੇ ਸਥਿਤੀ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੇਖੋ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ਗੱਲਬਾਤ"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ਕੋਈ ਅਲਾਰਮ ਸੈੱਟ ਨਹੀਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index c25d43bc..cc0c6d5 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Zamknij"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotknij czytnika linii papilarnych"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona odcisku palca"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nie rozpoznaję twarzy. Użyj odcisku palca."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Użyj odcisku palca, aby kontynuować"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Nie rozpoznaję odcisku palca. Użyj blokady ekranu."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Szukam Cię…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona twarzy"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Przycisk powiększenia na potrzeby zgodności."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Gotowe"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil służbowy"</string>
@@ -741,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stan:</b> zmieniono na Ciche"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Stan:</b> podniesiono ważność"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stan:</b> obniżono ważność"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wyświetla się jako pływający dymek u góry sekcji rozmów, pokazuje zdjęcie profilowe na ekranie blokady"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje funkcji rozmów"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tej grupy powiadomień nie można tu skonfigurować"</string>
@@ -800,7 +804,7 @@
<item quantity="other">%d minuty</item>
<item quantity="one">]%d minuta</item>
</plurals>
- <string name="battery_panel_title" msgid="5931157246673665963">"Zużycie baterii"</string>
+ <string name="battery_panel_title" msgid="5931157246673665963">"Wykorzystanie baterii"</string>
<string name="battery_detail_charging_summary" msgid="8821202155297559706">"Oszczędzanie baterii nie jest dostępne podczas ładowania"</string>
<string name="battery_detail_switch_title" msgid="6940976502957380405">"Oszczędzanie baterii"</string>
<string name="battery_detail_switch_summary" msgid="3668748557848025990">"Zmniejsza wydajność i ogranicza dane w tle"</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Rozmowę ustawiono jako priorytetową"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Rozmowy priorytetowe:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Wyświetlają się u góry sekcji rozmów"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Pokazują zdjęcie profilowe na ekranie blokady"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Wyświetlane jako pływający dymek nad aplikacjami"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ignorują tryb Nie przeszkadzać"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ustawienia"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Przełącz"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Przycisk ułatwień dostępu zastąpił gest ułatwień dostępu\n\n"<annotation id="link">"Wyświetl ustawienia"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Przesuń przycisk do krawędzi, aby ukryć go tymczasowo"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Sterowanie urządzeniami"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodaj elementy sterujące połączonymi urządzeniami"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurowanie sterowania urządzeniami"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"Otwarta rozmowa"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widżety Rozmowa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Kliknij rozmowę, aby dodać ją do ekranu głównego"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Tu pojawią się otrzymane wiadomości"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Rozmowy priorytetowe"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Ostatnie rozmowy"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Mniej niż <xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ponad <xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
<string name="birthday_status" msgid="2596961629465396761">"Urodziny"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Wkrótce urodziny"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Rocznica"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Udostępniam lokalizację"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nowy artykuł"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Oglądam"</string>
<string name="audio_status" msgid="4237055636967709208">"Słucham"</string>
<string name="game_status" msgid="1340694320630973259">"Odtwarzam"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Znajomi"</string>
<string name="empty_status" msgid="5938893404951307749">"Porozmawiajmy!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Nieodebrane połączenie"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Zobacz ostatnie wiadomości, nieodebrane połączenia i stany"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Rozmowa"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem z odczytaniem pomiaru wykorzystania baterii"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Kliknij, aby uzyskać więcej informacji"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nie ustawiono alarmu"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 32153bf..5b1f72e 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -545,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Ver políticas"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Ver controles"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Este dispositivo pertence à organização <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador de TI pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de local do dispositivo.\n\nPara saber mais, entre em contato com seu administrador de TI."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"A empresa <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pode gerenciar apps, mudar as configurações deste dispositivo e acessar dados associados a ele.\n\nNo caso de dúvidas, entre em contato com <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"A empresa <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pode gerenciar apps, mudar as configurações deste dispositivo e acessar dados associados a ele.\n\nEm caso de dúvidas, entre em contato com <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Este dispositivo pertence à sua organização.\n\nO administrador de TI pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de local do dispositivo.\n\nPara saber mais, entre em contato com seu administrador de TI."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Mostrar tudo"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Desbloquear para pagar"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Pronto"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Configurar o pagamento"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desbloquear para usar"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Ocorreu um problema ao carregar os cards. Tente novamente mais tarde"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avião"</string>
<string name="add_tile" msgid="6239678623873086686">"Adicionar bloco"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> rebaixada a Silenciosa"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> classificada com maior prioridade"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> classificada com menor prioridade"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Sempre aparecem em cima das notificações, mesmo quando o modo Prioridade está ativado"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Conversas prioritárias"</string>
<string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar esse grupo de notificações aqui"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa foi definida como prioritária"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritárias:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecem na parte superior da seção de conversa"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostram a foto do perfil na tela de bloqueio"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Conversas prioritárias"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Essas conversas são exibidas em cima da sua lista e ficam em evidência quando o modo Prioridade está ativado"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"As fotos do perfil são exibidas na tela de bloqueio"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Veja essas conversas com facilidade em balões na sua tela inicial"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configurações"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"O botão de acessibilidade substituiu o gesto de acessibilidade\n\n"<annotation id="link">"Veja as configurações"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mova o botão para a borda para ocultá-lo temporariamente"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Mover para o canto superior esquerdo"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Mover para o canto superior direito"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Mover para o canto inferior esquerdo"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="birthday_status" msgid="2596961629465396761">"Aniversário"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"É o aniversário de <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Aniversário chegando"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"O aniversário de <xliff:g id="NAME">%1$s</xliff:g> está chegando"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Data comemorativa"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"É o aniversário de <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Compartilhando local"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> está compartilhando o local"</string>
<string name="new_story_status" msgid="9012195158584846525">"Nova story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> compartilhou uma nova story"</string>
<string name="video_status" msgid="4548544654316843225">"Assistindo"</string>
<string name="audio_status" msgid="4237055636967709208">"Ouvindo"</string>
<string name="game_status" msgid="1340694320630973259">"Jogando"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Vamos conversar hoje à noite."</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"O conteúdo será exibido em breve"</string>
<string name="missed_call" msgid="4228016077700161689">"Chamada perdida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 5f585d4..602f3ce 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ignorar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressões digitais."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícone de impressão digital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impos. reconh. rosto. Utilize a impressão digital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utilize a sua impressão digital para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Não é possível reconhecer a impressão digital. Em alternativa, utilize o bloqueio de ecrã."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"À sua procura…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ícone de rosto"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botão zoom de compatibilidade."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Estado:</b> despromovida para Silenciosa"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Estado:</b> passou para classificação superior"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Estado:</b> passou para classificação inferior"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece no topo da secção de conversas, surge como balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar este grupo de notificações aqui."</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Aceda às Definições para atualizar a navegação no sistema."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversa definida como prioritária"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritárias irão:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecer na parte superior da secção de conversas."</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar a imagem do perfil no ecrã de bloqueio."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes por cima de apps."</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompem o modo Não incomodar."</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Definições"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Mudar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"O botão Acessibilidade substituiu o gesto de acessibilidade\n\n"<annotation id="link">"Ver definições"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mova o botão para a extremidade para o ocultar temporariamente"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controlos de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adicione controlos para os dispositivos associados."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configure os controlos de dispositivos"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Abrir conversa"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toque numa conversa para a adicionar ao ecrã principal"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Volte aqui quando tiver mensagens"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversas com prioridade"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversas recentes"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Há <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Há menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Há mais de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Aniversário"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Aniversário em breve"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Aniversário"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"A partilhar localiz."</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nova notícia"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"A ver"</string>
<string name="audio_status" msgid="4237055636967709208">"A ouvir"</string>
<string name="game_status" msgid="1340694320630973259">"Em reprodução"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Vamos conversar!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Chamada não atendida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas não atendidas e atualizações de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ocorreu um problema ao ler o medidor da bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para obter mais informações"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme defin."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 32153bf..5b1f72e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -545,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Ver políticas"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Ver controles"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Este dispositivo pertence à organização <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador de TI pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de local do dispositivo.\n\nPara saber mais, entre em contato com seu administrador de TI."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"A empresa <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pode gerenciar apps, mudar as configurações deste dispositivo e acessar dados associados a ele.\n\nNo caso de dúvidas, entre em contato com <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"A empresa <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> pode gerenciar apps, mudar as configurações deste dispositivo e acessar dados associados a ele.\n\nEm caso de dúvidas, entre em contato com <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Este dispositivo pertence à sua organização.\n\nO administrador de TI pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de local do dispositivo.\n\nPara saber mais, entre em contato com seu administrador de TI."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Mostrar tudo"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Desbloquear para pagar"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Pronto"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Configurar o pagamento"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desbloquear para usar"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Ocorreu um problema ao carregar os cards. Tente novamente mais tarde"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avião"</string>
<string name="add_tile" msgid="6239678623873086686">"Adicionar bloco"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> rebaixada a Silenciosa"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> classificada com maior prioridade"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> classificada com menor prioridade"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Sempre aparecem em cima das notificações, mesmo quando o modo Prioridade está ativado"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Conversas prioritárias"</string>
<string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar esse grupo de notificações aqui"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa foi definida como prioritária"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritárias:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecem na parte superior da seção de conversa"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostram a foto do perfil na tela de bloqueio"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Conversas prioritárias"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Essas conversas são exibidas em cima da sua lista e ficam em evidência quando o modo Prioridade está ativado"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"As fotos do perfil são exibidas na tela de bloqueio"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Veja essas conversas com facilidade em balões na sua tela inicial"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configurações"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"O botão de acessibilidade substituiu o gesto de acessibilidade\n\n"<annotation id="link">"Veja as configurações"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mova o botão para a borda para ocultá-lo temporariamente"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Mover para o canto superior esquerdo"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Mover para o canto superior direito"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Mover para o canto inferior esquerdo"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="birthday_status" msgid="2596961629465396761">"Aniversário"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"É o aniversário de <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Aniversário chegando"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"O aniversário de <xliff:g id="NAME">%1$s</xliff:g> está chegando"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Data comemorativa"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"É o aniversário de <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Compartilhando local"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> está compartilhando o local"</string>
<string name="new_story_status" msgid="9012195158584846525">"Nova story"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> compartilhou uma nova story"</string>
<string name="video_status" msgid="4548544654316843225">"Assistindo"</string>
<string name="audio_status" msgid="4237055636967709208">"Ouvindo"</string>
<string name="game_status" msgid="1340694320630973259">"Jogando"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Amigos"</string>
<string name="empty_status" msgid="5938893404951307749">"Vamos conversar hoje à noite."</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"O conteúdo será exibido em breve"</string>
<string name="missed_call" msgid="4228016077700161689">"Chamada perdida"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index a70e2a2..f68d6ac 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Închideți"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Atingeți senzorul de amprente"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Pictograma amprentă"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Chipul nu a fost recunoscut. Folosiți amprenta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Folosiți amprenta pentru a continua"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Amprenta nu a fost recunoscută. Folosiți blocarea ecranului."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Vă căutăm…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Pictograma chip"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Buton zoom pentru compatibilitate."</string>
@@ -667,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Gata"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil de serviciu"</string>
@@ -738,9 +740,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stare:</b> setată ca Silențioasă"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Stare:</b> clasificată mai sus"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stare:</b> clasificată mai jos"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se afișează în partea de sus a secțiunii de conversație, apare ca un balon flotant, afișează fotografia de profil pe ecranul de blocare"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setări"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă funcții pentru conversații"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Acest grup de notificări nu poate fi configurat aici"</string>
@@ -1016,10 +1020,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accesați Setările pentru a actualiza navigarea în sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Conversația a fost setată ca prioritară"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Conversațiile cu prioritate vor:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Apar în partea de sus a secțiunii de conversație"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afișează fotografia de profil pe ecranul de blocare"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Apar ca un balon flotant deasupra aplicațiilor"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Întrerup modul Nu deranja"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setări"</string>
@@ -1037,6 +1045,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Comutator"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Butonul de accesibilitate a înlocuit gestul de accesibilitate\n\n"<annotation id="link">"Vedeți setările"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mutați butonul spre margine pentru a-l ascunde temporar"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivelor"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adăugați comenzi pentru dispozitivele conectate"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurați comenzile dispozitivelor"</string>
@@ -1108,31 +1128,43 @@
<string name="basic_status" msgid="2315371112182658176">"Deschideți conversația"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgeturi pentru conversație"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Atingeți o conversație ca să o adăugați pe ecranul de pornire"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Reveniți aici după ce primiți câteva mesaje"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversații cu prioritate"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversații recente"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Acum <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"În urmă cu mai puțin de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"În urmă cu peste <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Ziua de naștere"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Zi de naștere în curând"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Zi aniversară"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Se afișează locația"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Subiect nou"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Urmăresc"</string>
<string name="audio_status" msgid="4237055636967709208">"Se ascultă"</string>
<string name="game_status" msgid="1340694320630973259">"Se redă"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Prieteni"</string>
<string name="empty_status" msgid="5938893404951307749">"Conversăm prin chat diseară?"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Apel nepreluat"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Vedeți mesaje recente, apeluri pierdute și actualizări de stare"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversație"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problemă la citirea măsurării bateriei"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Atingeți pentru mai multe informații"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nicio alarmă setată"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 30b0e3b..9557db3 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Закрыть"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Прикоснитесь к сканеру отпечатков пальцев."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Значок отпечатка пальца"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не удалось распознать лицо. Используйте отпечаток."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Чтобы продолжить, прикоснитесь пальцем к сканеру."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Не удалось распознать отпечаток пальца. Используйте другой способ разблокировки экрана."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Поиск лица…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Значок лица"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Кнопка масштабирования (режим совместимости)"</string>
@@ -551,10 +548,10 @@
<string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"Сертификаты ЦС"</string>
<string name="disable_vpn" msgid="482685974985502922">"Отключить VPN"</string>
<string name="disconnect_vpn" msgid="26286850045344557">"Отключить VPN"</string>
- <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Просмотреть политику"</string>
+ <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Узнать больше"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Показать элементы управления"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Это устройство принадлежит организации \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\".\n\nВаш системный администратор может управлять настройками, приложениями и параметрами доступа к корпоративным ресурсам на этом устройстве, а также связанными с ним данными (например, сведениями о местоположении).\n\nЗа подробной информацией обращайтесь к системному администратору."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"\"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g>\" может получать доступ к данным, связанным с этим устройством, изменять его настройки и управлять приложениями.\n\nЕсли у вас есть вопросы, свяжитесь с организацией \"<xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>\"."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"У компании \"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g>\" есть доступ к данным, связанным с этим устройством, также она может изменять его настройки и управлять приложениями.\n\nЕсли у вас есть вопросы, обратитесь в компанию \"<xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>\"."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Это устройство принадлежит вашей организации.\n\nСистемный администратор может управлять настройками, приложениями и параметрами доступа к корпоративным ресурсам на этом устройстве, а также связанными с ним данными (например, сведениями о местоположении).\n\nЗа подробной информацией обращайтесь к системному администратору."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Ваша организация установила сертификат ЦС на устройство. Она может отслеживать и изменять защищенный сетевой трафик."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Ваша организация установила сертификат ЦС в рабочем профиле. Она может отслеживать и изменять защищенный сетевой трафик."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Рабочий профиль"</string>
@@ -741,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Статус:</b> понижено до уровня \"Без звука\""</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Статус:</b> уровень важности повышен"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Статус:</b> уровень важности понижен"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, фото профиля показывается на заблок. экране"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает функции разговоров."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Эту группу уведомлений нельзя настроить здесь."</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Чтобы обновить параметры навигации в системе, перейдите в настройки."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Разговор помечен как важный"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Преимущества:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Важные разговоры показываются в верхней части списка разговоров."</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Фото профиля показывается на заблокированном экране."</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показывать как всплывающий чат над приложениями"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Показывать в режиме \"Не беспокоить\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ОК"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Переключить"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Жест заменен на кнопку специальных возможностей\n\n"<annotation id="link">"Открыть настройки"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Чтобы временно скрыть кнопку, переместите ее к краю экрана"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Управление устройствами"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавьте виджеты для управления устройствами."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройте виджеты управления устройствами"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"Открытый чат"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виджеты чатов"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Нажмите на чат, чтобы добавить его на главный экран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Здесь вы увидите свои сообщения."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Важные разговоры"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Недавние разговоры"</string>
+ <string name="okay" msgid="6490552955618608554">"ОК"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> назад"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Прошло не более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Прошло более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"День рождения"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Скоро день рождения"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Годовщина"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Доступ открыт"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Новая история"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Просмотр"</string>
<string name="audio_status" msgid="4237055636967709208">"Прослушивание аудио"</string>
<string name="game_status" msgid="1340694320630973259">"Игра запущена"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Друзья"</string>
<string name="empty_status" msgid="5938893404951307749">"Давайте поболтаем!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Пропущенный вызов"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Просматривайте недавние сообщения, пропущенные звонки и обновления статуса."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Чат"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не удается получить данные об уровне заряда батареи"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нажмите, чтобы узнать больше."</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Будильников нет"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 7206f02..9f32ac5 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -657,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"එලාමය"</string>
<string name="wallet_title" msgid="5369767670735827105">"පසුම්බිය"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"සූදානම්"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"සියල්ල පෙන්වන්න"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"ගෙවීමට අගුලු හරින්න"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"සූදානම්"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"ගෙවීම පිහිටුවන්න"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"භාවිත කිරීමට අගුලු හරින්න"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"ඔබගේ කාඩ්පත ලබා ගැනීමේ ගැටලුවක් විය, කරුණාකර පසුව නැවත උත්සාහ කරන්න"</string>
<string name="status_bar_work" msgid="5238641949837091056">"කාර්යාල පැතිකඩ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ගුවන්යානා ප්රකාරය"</string>
<string name="add_tile" msgid="6239678623873086686">"ටයිල් එක් කරන්න"</string>
@@ -732,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>තත්ත්වය:</b> නිශ්ශබ්ද වෙත පහත දමන ලදි"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>තත්ත්වය:</b> ඉහළට ශ්රේණිගත කරන ලදි"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>තත්ත්වය:</b> පහළට ශ්රේණිගත කරන ලදි"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"සංවාද කොටසේ ඉහළම පෙන්වයි, බුබුළක් ලෙස දිස් වේ, අගුලු තිරයේ පැතිකඩ පින්තූරය සංදර්ශනය වේ"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"ප්රමුඛතා ප්රකාරය ක්රියාත්මක විට පවා, ඔබගේ දැනුම්දීම්වල ඉහළින්ම පෙන්වයි"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"සැකසීම්"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ප්රමුඛතාව"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"ප්රමුඛතා සංවාද"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> සංවාද විශේෂාංගවලට සහාය නොදක්වයි"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"මෙම දැනුම්දීම් සමූහය මෙහි වින්යාස කළ නොහැක"</string>
@@ -1008,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"සංවාදය ප්රමුඛතාව වෙත සකසන ලදී"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ප්රමුඛතා සංවාද:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"සංවාද කොටසේ ඉහළ දී පෙන්වන්න"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"පැතිකඩ පින්තූරය අගුලු තිරය මත පෙන්වන්න"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"යෙදුම්වල ඉහළම පාවෙන බුබුලක් ලෙස දිස් වේ"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"ප්රමුඛතා සංවාද"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"මෙම සංවාද ඔබගේ ලැයිස්තුවේ ඉහළින්ම පෙන්වන අතර ප්රමුඛතා ප්රකාරය ක්රියාත්මක විට සෑම විටම ඔබ වෙත ළඟා විය හැකිය"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"අගුලු තිරයේ පැතිකඩ පින්තූර පෙන්වයි"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"ඔබටද ඔබගේ මුල් තිරයේ බුබුළුවල මෙම සංවාද පහසුවෙන් සොයා ගත හැකිය"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"බාධා නොකරන්න හට බාධා කරන්න"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"තේරුණා"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"සැකසීම්"</string>
@@ -1029,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ස්විචය"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ප්රවේශ්යතා බොත්තම ප්රවේශ්යතා ඉංගිතය ප්රතිස්ථාපනය කළේය\n\n"<annotation id="link">"සැකසීම් බලන්න"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"එය තාවකාලිකව සැඟවීමට බොත්තම දාරයට ගෙන යන්න"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"ඉහළ වමට ගෙන යන්න"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"ඉහළ දකුණට ගෙන යන්න"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"පහළ වමට ගෙන යන්න"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"පහළ දකුණට ගෙන යන්න"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"මායිමට ගෙන යන්න සහ සඟවන්න"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"මායිමෙන් පිටට ගන්න සහ පෙන්වන්න"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"උපාංග පාලන"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ඔබේ සම්බන්ධිත උපාංග සඳහා පාලන එක් කරන්න"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"උපාංග පාලන පිහිටුවන්න"</string>
@@ -1107,19 +1112,27 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා අඩු කාලයකට පෙර"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා පෙර"</string>
<string name="birthday_status" msgid="2596961629465396761">"උපන් දිනය"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"මේ <xliff:g id="NAME">%1$s</xliff:g>ගේ උපන් දිනයයි"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"උපන් දිනය ඉක්මනින්"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"මේ ළඟදීම <xliff:g id="NAME">%1$s</xliff:g>ගේ උපන් දිනයයි"</string>
<string name="anniversary_status" msgid="1790034157507590838">"සංවත්සරය"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"මේ <xliff:g id="NAME">%1$s</xliff:g>ගේ සංවත්සරයයි"</string>
<string name="location_status" msgid="1294990572202541812">"ස්ථානය බෙදා ගැනීම"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> ස්ථානය බෙදා ගනිමින්"</string>
<string name="new_story_status" msgid="9012195158584846525">"අලුත් කතාව"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> නව කතාවක් බෙදා ගන්නා ලදි"</string>
<string name="video_status" msgid="4548544654316843225">"නරඹමින්"</string>
<string name="audio_status" msgid="4237055636967709208">"සවන් දෙමින්"</string>
<string name="game_status" msgid="1340694320630973259">"ක්රීඩා කරමින්"</string>
<string name="empty_user_name" msgid="3389155775773578300">"මිතුරන්"</string>
<string name="empty_status" msgid="5938893404951307749">"අද රෑ කතාබහ කරමු!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"අන්තර්ගතය ඉක්මනින් පෙන්වනු ඇත"</string>
<string name="missed_call" msgid="4228016077700161689">"මඟ හැරුණු ඇමතුම"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"මෑත පණිවිඩ, මඟ හැරුණු ඇමතුම් සහ තත්ත්ව යාවත්කාලීන කිරීම් බලන්න"</string>
<string name="people_tile_title" msgid="6589377493334871272">"සංවාදය"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> පණිවිඩයක් එවා ඇත"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> රූපයක් යවන ලදී"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"තවත් තොරතුරු සඳහා තට්ටු කරන්න"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"එලාම සකසා නැත"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 4919352..ec2f637 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -453,7 +453,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ak chcete použiť NFC, odomknite"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Toto zariadenie patrí vašej organizácii"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Toto zariadení patrí organizácii <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Toto zariadenie poskytla organizácia <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Toto zariadenie poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Telefón otvoríte prejdením prstom od ikony"</string>
<string name="voice_hint" msgid="7476017460191291417">"Hlasového asistenta otvoríte prejdením prstom od ikony"</string>
<string name="camera_hint" msgid="4519495795000658637">"Fotoaparát otvoríte prejdením prstom od ikony"</string>
@@ -524,7 +524,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Toto zariadenie spravuje tvoj rodič"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Vaša organizácia spravuje toto zariadenie a môže sledovať sieťovú premávku"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vlastní toto zariadenie a môže sledovať sieťovú premávku"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Toto zariadenie poskytla organizácia <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Toto zariadenie poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Toto zariadenie patrí vašej organizácii a je pripojené k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"Toto zariadenie patrí organizácii <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je pripojené k sieti <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Toto zariadenie patrí vašej organizácii"</string>
@@ -539,7 +539,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovný profil je pripojený k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Váš osobný profil je pripojený k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Toto zariadenie je pripojené k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Toto zariadenie poskytla organizácia <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Toto zariadenie poskytuje <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Správa zariadení"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Monitorovanie profilu"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Sledovanie siete"</string>
@@ -667,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pripravené"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Pracovný profil"</string>
@@ -738,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Preradené nižšie do kategórie Tiché"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Preradené vyššie"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stav:</b> Preradené nižšie"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Nájdete ju hore v sekcii konverzácií ako plávajúcu bublinu, zobrazuje profilovú fotku na uzamknutej obrazovke"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje funkcie konverzácie"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Túto skupinu upozornení nejde na tomto mieste konfigurovať"</string>
@@ -1018,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzácia je nastavená ako prioritná"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritné konverzácie:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"sa zobrazujú navrchu sekcie konverzácií"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"zobrazujú profilovú fotku na uzamknutej obrazovke"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazovať ako plávajúce bubliny nad aplikáciami"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prerušovať režim bez vyrušení"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Dobre"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavenia"</string>
@@ -1039,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prepnúť"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Tlačidlo dostupnosti nahradilo gesto dostupnosti\n\n"<annotation id="link">"Zobraziť nastavenia"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Ak chcete tlačidlo dočasne skryť, presuňte ho k okraju"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte si ovládače pripojených zariadení"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadení"</string>
@@ -1119,19 +1142,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Pred menej ako <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pred viac ako <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Narodeniny"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Blížia sa narodeniny"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Výročie"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Zdieľa sa poloha"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nová správa"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Pozerá sa video"</string>
<string name="audio_status" msgid="4237055636967709208">"Počúvam"</string>
<string name="game_status" msgid="1340694320630973259">"Hrá sa hra"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Priatelia"</string>
<string name="empty_status" msgid="5938893404951307749">"Porozprávajme sa."</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Zmeškaný hovor"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pozrite si nedávne správy, zmeškané hovory a aktualizácie stavu"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzácia"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pri čítaní meradla batérie sa vyskytol problém"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím si zobrazíte ďalšie informácie"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Žiadny budík"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index c995383..868372c 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -539,7 +539,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Delovni profil je povezan v aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Osebni profil je povezan v aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Ta naprava je povezava v aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"To napravo zagotavlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"To napravo zagotavlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Upravljanje naprav"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Nadzor nad profilom"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Nadzor omrežja"</string>
@@ -667,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Pripravljeno"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil za Android Work"</string>
@@ -738,9 +743,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stanje:</b> Uvrščeno med obvestila brez zvoka"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Stanje:</b> Uvrščeno višje"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stanje:</b> Uvrščeno nižje"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikaz na vrhu razdelka s pogovorom in v plavajočem oblačku, prikaz profilne slike na zaklenjenem zaslonu"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prednost"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Te skupine obvestil ni mogoče konfigurirati tukaj"</string>
@@ -1018,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Pogovor je nastavljen kot prednosten"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prednostni pogovori bodo:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazani na vrhu razdelka s pogovorom"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazali profilno sliko na zaklenjenem zaslonu"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazano kot lebdeč oblaček čez druge aplikacije"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Preglasi način »ne moti«"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"V redu"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavitve"</string>
@@ -1039,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Stikalo"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Gumb za funkcije za ljudi s posebnimi potrebami je zamenjal pripadajočo potezo.\n\n"<annotation id="link">"Ogled nastavitev"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Če želite gumb začasno skriti, ga premaknite ob rob."</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrolniki naprave"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrolnike za povezane naprave"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavitev kontrolnikov naprave"</string>
@@ -1119,19 +1142,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Pred manj kot <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pred več kot <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Rojstni dan"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Rojstni dan se bliža"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Obletnica"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Deljenje lokacije"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Nova zgodba"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Gledanje"</string>
<string name="audio_status" msgid="4237055636967709208">"Poslušanje"</string>
<string name="game_status" msgid="1340694320630973259">"Igranje"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Prijatelji"</string>
<string name="empty_status" msgid="5938893404951307749">"Naj se klepet začne!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Neodgovorjeni klic"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Več kot <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Ogled nedavnih sporočil, neodgovorjenih klicev in posodobitev stanj"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pogovor"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Težava z branjem indikatorja stanja napolnjenosti baterije"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dotaknite se za več informacij"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ni nastavljenih alarmov"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 9d54f5f..990aad9 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Hiq"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Prek sensorin e gjurmës së gishtit"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona e gjurmës së gishtit"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nuk mund ta dallojë fytyrën. Përdor më mirë gjurmën e gishtit."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Përdor gjurmën e gishtit për të vazhduar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Nuk mund ta dallojë gjurmën e gishtit. Përdor më mirë kyçjen e ekranit."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Po të kërkojmë…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona e fytyrës"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Butoni i zmadhimit të pajtueshmërisë."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Gati"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profili i punës"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Statusi:</b> Ulur në nivel si në heshtje"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Statusi:</b> Renditur më lart"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Statusi:</b> Renditur më poshtë"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë pluskuese, shfaq fotografinë e profilit në ekranin e kyçjes"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mbështet veçoritë e bisedës"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ky grup njoftimesh nuk mund të konfigurohet këtu"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Biseda u caktua me përparësi"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Bisedat me përparësi do të:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Shfaqen në krye të seksionit të bisedës"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Shfaqin fotografinë e profilit në ekranin e kyçjes"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Shfaq si flluskë pluskuese mbi aplikacione"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ndërprit \"Mos shqetëso\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"E kuptova"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cilësimet"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Ndërro"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Butoni i qasshmërisë është zëvendësuar me gjestin e qasshmërisë\n\n"<annotation id="link">"Shiko cilësimet"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Zhvendose butonin në skaj për ta fshehur përkohësisht"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrollet e pajisjes"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Shto kontrolle për pajisjet e tua të lidhura"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguro kontrollet e pajisjes"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Hap bisedën"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Miniaplikacionet e bisedave"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Trokit te një bisedë dhe shtoje në ekranin bazë"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Kontrollo përsëri këtu pasi të marrësh disa mesazhe"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Bisedat me përparësi"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Bisedat e fundit"</string>
+ <string name="okay" msgid="6490552955618608554">"Në rregull"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Më pak se <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mbi <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
<string name="birthday_status" msgid="2596961629465396761">"Ditëlindja"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Ditëlindje së shpejti"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Përvjetor"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Ndarja e vendndodhjes"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Histori e re"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Po shikon"</string>
<string name="audio_status" msgid="4237055636967709208">"Po dëgjon"</string>
<string name="game_status" msgid="1340694320630973259">"Po luhet"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Miq"</string>
<string name="empty_status" msgid="5938893404951307749">"Le të bisedojmë sonte!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Telefonatë e humbur"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Mbi <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Shiko mesazhet e fundit, telefonatat e humbura dhe përditësimet e statusit"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Biseda"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem me leximin e matësit të baterisë"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trokit për më shumë informacione"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nuk është caktuar asnjë alarm"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index a10d247..55d75f8 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Одбаци"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Додирните сензор за отисак прста"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Икона отиска прста"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лице није препознато. Користите отисак прста."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Наставите помоћу отиска прста"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Препознавање отиска прста није успело. Користите закључавање екрана уместо тога."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Тражимо вас…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Икона лица"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Дугме Зум компатибилности."</string>
@@ -667,7 +664,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Спремно"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Пословни профил"</string>
@@ -738,9 +740,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Статус:</b> Деградирано у Нечујно"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Статус:</b> Рангирано више"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Статус:</b> Рангирано ниже"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Приказује се у врху одељка за конверзације као плутајући облачић, приказује слику профила на закључаном екрану"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Подешавања"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не подржава функције конверзације"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ова група обавештења не може да се конфигурише овде"</string>
@@ -1016,10 +1020,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Конверзација је подешена на приоритетну"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приоритетне конверзације:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"се приказују у врху одељка за конверзације"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"приказују слику профила на закључаном екрану"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Приказују се плутајући облачићи преко апликација"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Омета подешавање Не узнемиравај"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Важи"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Подешавања"</string>
@@ -1037,6 +1045,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Пређи"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Дугме Приступачност је заменило покрет за приступачност\n\n"<annotation id="link">"Прикажи подешавања"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Померите дугме до ивице да бисте га привремено сакрили"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Контроле уређаја"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроле за повезане уређаје"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Подесите контроле уређаја"</string>
@@ -1108,31 +1128,43 @@
<string name="basic_status" msgid="2315371112182658176">"Отворите конверзацију"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виџети за конверзацију"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Додирните конверзацију да бисте је додали на почетни екран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Вратите се овде када добијете неку поруку"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Приоритетне конверзације"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Недавне конверзације"</string>
+ <string name="okay" msgid="6490552955618608554">"Важи"</string>
<string name="timestamp" msgid="6577851592534538533">"Пре <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Пре мање од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Пре више од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="birthday_status" msgid="2596961629465396761">"Рођендан"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Рођендан је ускоро"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Годишњица"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Дели се локација"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Нова прича"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Гледа се"</string>
<string name="audio_status" msgid="4237055636967709208">"Слуша се"</string>
<string name="game_status" msgid="1340694320630973259">"Игра се"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Пријатељи"</string>
<string name="empty_status" msgid="5938893404951307749">"Ћаскамо вечерас!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Пропуштен позив"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Погледајте недавне поруке, пропуштене позиве и ажурирања статуса"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Конверзација"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем са очитавањем мерача батерије"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Додирните за више информација"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Аларм није подешен"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 7e43a2a..8284cbd 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -449,7 +449,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Lås upp om du vill använda NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Den här enheten tillhör organisationen"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Den här enheten tillhör <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Den här enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Svep från ikonen och öppna telefonen"</string>
<string name="voice_hint" msgid="7476017460191291417">"Svep från ikonen och öppna röstassistenten"</string>
<string name="camera_hint" msgid="4519495795000658637">"Svep från ikonen och öppna kameran"</string>
@@ -518,7 +518,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Den här enheten hanteras av din förälder"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organisationen äger den här enheten och kan övervaka nätverkstrafiken"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> äger den här enheten och kan övervaka nätverkstrafiken"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Den här enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Den här enheten tillhör organisationen och är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"Den här enheten tillhör <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> och är ansluten till <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Den här enheten tillhör organisationen"</string>
@@ -533,7 +533,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Din personliga profil är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Den här enheten är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Den här enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Enheten tillhandahålls av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Enhetshantering"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Profilövervakning"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Nätverksövervakning"</string>
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Jobbprofil"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Ändrad till Tyst"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Höjd"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Sänkt"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Visas högst upp bland konversationerna som en flytande bubbla och visar profilbilden på låsskärmen"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsfunktioner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Den här aviseringsgruppen kan inte konfigureras här"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Öppna inställningarna och uppdatera systemnavigeringen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Konversationen har angetts som prioriterad"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Följande gäller för prioriterade konversationer:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"De visas högst upp bland konversationerna"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profilbilden visas på låsskärmen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Visa som en flytande bubbla ovanpå appar"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Avbryt Stör ej"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Inställningar"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Reglage"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Tillgänglighetsknappen har ersatt tillgänglighetsrörelsen\n\n"<annotation id="link">"Visa inställningarna"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Flytta knappen till kanten för att dölja den tillfälligt"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyrning"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lägg till snabbkontroller för anslutna enheter"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurera enhetsstyrning"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"Mindre än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mer än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string>
<string name="birthday_status" msgid="2596961629465396761">"Födelsedag"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Födelsedag inom kort"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Högtidsdag"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Delar plats"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Ny artikel"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Tittar"</string>
<string name="audio_status" msgid="4237055636967709208">"Lyssnar"</string>
<string name="game_status" msgid="1340694320630973259">"Spelar"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Vänner"</string>
<string name="empty_status" msgid="5938893404951307749">"Vi chattar i kväll!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Missat samtal"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"över <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se de senaste meddelandena, missade samtal och statusuppdateringar"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konversation"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batteriindikatorn visas inte"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryck för mer information"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Inget inställt alarm"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 27fe234..848d5b5 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ondoa"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Gusa kitambua alama ya kidole"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Aikoni ya alama ya kidole"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Imeshindwa kutambua uso. Tumia alama ya kidole."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Tumia alama ya kidole chako ili uendelee"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Imeshindwa kutambua alama ya kidole. Tumia mbinu ya kufunga skrini badala yake."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Inakutafuta…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Aikoni ya uso"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Kichupo cha kukuza kwa utangamanifu"</string>
@@ -452,7 +449,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Fungua ili utumie NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Kifaa hiki kinamilikiwa na shirika lako"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Kifaa hiki kinamilikiwa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Kifaa hiki kinatolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Kifaa hiki kimetolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"Telezesha kidole kutoka kwa aikoni ili ufikie simu"</string>
<string name="voice_hint" msgid="7476017460191291417">"Telezesha kidole kutoka aikoni ili upate mapendekezo ya sauti"</string>
<string name="camera_hint" msgid="4519495795000658637">"Telezesha kidole kutoka aikoni ili ufikie kamera"</string>
@@ -521,7 +518,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Kifaa hiki kinadhibitiwa na mzazi wako"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Shirika lako linamiliki kifaa hiki na huenda likafuatilia trafiki ya mtandao"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> inamiliki kifaa hiki na huenda ikafuatilia trafiki ya mtandao"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Kifaa hiki kinatolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Kifaa hiki kimetolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Kifaa hiki kinamilikiwa na shirika lako na kimeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"Kifaa hiki kinamilikiwa na <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> na kimeunganishwa kwenye <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Kifaa hiki kinamilikiwa na shirika lako"</string>
@@ -536,7 +533,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Wasifu wako wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Wasifu wako wa binafsi umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Kifaa hiki kimeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Kifaa hiki kinatolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Kifaa hiki kimetolewa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Udhibiti wa kifaa"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Ufuatiliaji wasifu"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Ufuatiliaji wa mtandao"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethaneti"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Kengele"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Tayari"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Onyesha zote"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Fungua ili ulipe"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Tayari"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Weka njia ya kulipa"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Fungua ili utumie"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Hitilafu imetokea wakati wa kuleta kadi zako, tafadhali jaribu tena baadaye"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Wasifu wa kazini"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Hali ya ndegeni"</string>
<string name="add_tile" msgid="6239678623873086686">"Ongeza kigae"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Imeshushwa Hadhi Kuwa Kimya"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Hali:</b> Imeorodheshwa Katika Nafasi ya Juu"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Hali:</b> Imeorodheshwa Katika Nafasi ya Chini"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Huonyeshwa kwenye sehemu ya juu ya mazungumzo, huonekana kama kiputo, huonyesha picha ya wasifu kwenye skrini iliyofungwa"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Huonyeshwa kwenye sehemu ya juu ya arifa zako kila wakati, hata wakati umewasha hali ya Kipaumbele"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Mazungumzo ya kipaumbele"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii vipengele vya mazungumzo"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Mazungumzo yamepewa kipaumbele"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Mazungumzo yaliyopewa kipaumbele:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Huonyeshwa kwenye sehemu ya juu ya mazungumzo"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Huonyesha picha ya wasifu kwenye skrini iliyofungwa"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Yataonekana kama kiputo kinachoelea juu ya programu"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Mazungumzo ya kipaumbele"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Mazungumzo haya yanaonyeshwa kwenye sehemu ya juu ya orodha yako na yanaweza kukufikia ukiwa umewasha hali ya Kipaumbele"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Picha za wasifu zinaonyeshwa kwenye skrini iliyofungwa"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Unaweza kupata mazungumzo haya kwa urahisi katika viputo kwenye Skrini yako ya kwanza"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Katiza kipengele cha Usinisumbue"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Nimeelewa"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mipangilio"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Swichi"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Kitufe cha zana za ufikivu kimechukua nafasi ya ishara ya ufikivu\n\n"<annotation id="link">"Angalia mipangilio"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Sogeza kitufe kwenye ukingo ili ukifiche kwa muda"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Sogeza juu kushoto"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Sogeza juu kulia"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Sogeza chini kushoto"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sogeza chini kulia"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Sogeza kwenye ukingo kisha ufiche"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Sogeza nje ya ukingo kisha uonyeshe"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa ulivyounganisha"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya vifaa"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Fungua mazungumzo"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Wijeti za mazungumzo"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Gusa mazungumzo ili uyaweke kwenye Skrini yako ya kwanza"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Angalia hapa tena utakapopokea ujumbe"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Mazungumzo ya kipaumbele"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Mazungumzo ya hivi majuzi"</string>
+ <string name="okay" msgid="6490552955618608554">"Sawa"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Chini ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Zaidi ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
<string name="birthday_status" msgid="2596961629465396761">"Siku ya kuzaliwa"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Ni siku ya kuzaliwa ya <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Siku ya kuzaliwa inakaribia"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Siku ya kuzaliwa ya <xliff:g id="NAME">%1$s</xliff:g> inakaribia"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Maadhimisho"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Ni maadhimisho ya <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Inashiriki mahali"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> anashiriki maelezo ya mahali"</string>
<string name="new_story_status" msgid="9012195158584846525">"Habari mpya"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> ameshiriki hadithi mpya"</string>
<string name="video_status" msgid="4548544654316843225">"Unatazama"</string>
<string name="audio_status" msgid="4237055636967709208">"Inasikiliza"</string>
<string name="game_status" msgid="1340694320630973259">"Inacheza"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Marafiki"</string>
<string name="empty_status" msgid="5938893404951307749">"Tupige gumzo usiku!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Maudhui yataonekana hivi karibuni"</string>
<string name="missed_call" msgid="4228016077700161689">"Simu ambayo hukujibu"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Angalia ujumbe wa hivi majuzi, simu ambazo hukujibu na taarifa za hali"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Mazungumzo"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ametuma ujumbe"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ametuma picha"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Tatizo la kusoma mita ya betri yako"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Gusa ili upate maelezo zaidi"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Hujaweka kengele"</string>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
index f2df4b9..302e5e4 100644
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -40,4 +40,9 @@
<dimen name="qs_tile_margin_top">32dp</dimen>
<dimen name="qs_brightness_padding_top">6dp</dimen>
<dimen name="qs_detail_margin_top">28dp</dimen>
+
+ <!-- In split shade mode notifications should be aligned to QS header so the value should be
+ adjusted to qs header height and height of centered content inside of it:
+ (quick_qs_offset_height (48dp) - ongoing_appops_chip_height (24dp) ) / 2 -->
+ <dimen name="notifications_top_padding_split_shade">12dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 73f8a56..d6e1b69 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"நிராகரி"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"கைரேகை சென்சாரைத் தொடவும்"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"கைரேகை ஐகான்"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"முகத்தை அடையாளம் காண முடியவில்லை. கைரேகையைப் பயன்படுத்தவும்."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"தொடர்வதற்குக் கைரேகையைப் பயன்படுத்தவும்"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"கைரேகையை அடையாளம் காண முடியவில்லை. அதற்குப் பதிலாகத் திரைப்பூட்டைப் பயன்படுத்தவும்."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"உங்கள் முகத்தைத் தேடுகிறது…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"முக ஐகான்"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"பொருந்துமாறு அளவை மாற்றும் பட்டன்."</string>
@@ -452,7 +449,7 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFCயைப் பயன்படுத்த அன்லாக் செய்யவும்"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"இந்த சாதனம் உங்கள் நிறுவனத்துக்கு சொந்தமானது"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"இந்த சாதனம் <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> நிறுவனத்துக்கு சொந்தமானது"</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"இந்தச் சாதனம் <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> நிறுவனத்தால் வழங்கப்பட்டது"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"இந்தச் சாதனத்தை வழங்கியவர் <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="phone_hint" msgid="6682125338461375925">"ஃபோனிற்கு ஐகானிலிருந்து ஸ்வைப் செய்யவும்"</string>
<string name="voice_hint" msgid="7476017460191291417">"குரல் உதவிக்கு ஐகானிலிருந்து ஸ்வைப் செய்யவும்"</string>
<string name="camera_hint" msgid="4519495795000658637">"கேமராவிற்கு ஐகானிலிருந்து ஸ்வைப் செய்யவும்"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"தயாராக உள்ளது"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"பணிக் கணக்கு"</string>
@@ -727,7 +729,7 @@
<string name="notification_automatic_title" msgid="3745465364578762652">"தானியங்கு"</string>
<string name="notification_channel_summary_low" msgid="4860617986908931158">"ஒலி / அதிர்வு இல்லை"</string>
<string name="notification_conversation_summary_low" msgid="1734433426085468009">"ஒலி / அதிர்வு இல்லாமல் உரையாடல் பிரிவின் கீழ்ப் பகுதியில் தோன்றும்"</string>
- <string name="notification_channel_summary_default" msgid="3282930979307248890">"மொபைல் அமைப்புகளின் அடிப்படையில் ஒலிக்கவோ அதிரவோ செய்யும்"</string>
+ <string name="notification_channel_summary_default" msgid="3282930979307248890">"மொபைல் அமைப்புகளின் அடிப்படையில் ஒலிக்கலாம்/அதிரலாம்"</string>
<string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"மொபைல் அமைப்புகளின் அடிப்படையில் ஒலிக்கவோ அதிரவோ செய்யும். <xliff:g id="APP_NAME">%1$s</xliff:g> இலிருந்து வரும் உரையாடல்கள் இயல்பாகவே குமிழாகத் தோன்றும்."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"இந்த உள்ளடக்கத்திற்கான மிதக்கும் ஷார்ட்கட் மூலம் உங்கள் கவனத்தைப் பெற்றிருக்கும்."</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"இந்த அறிவிப்பு ஒலி எழுப்ப வேண்டுமா அதிர வேண்டுமா என்பதை சிஸ்டம் தீர்மானிக்கும்"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>நிலை:</b> நிசப்த நிலைக்குக் குறைத்து அமைக்கப்பட்டது"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>நிலை:</b> முக்கியத்துவம் உயர்த்தப்பட்டது"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>நிலை:</b> முக்கியத்துவம் குறைக்கப்பட்டது"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"உரையாடல் பிரிவின் மேற்பகுதியில் மிதக்கும் குமிழாகத் தோன்றும். பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"உரையாடல் அம்சங்களை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"முன்னுரிமை அளிக்கப்பட்ட உரையாடலாக அமைக்கப்பட்டது"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"முன்னுரிமை அளிக்கப்பட்ட உரையாடல்கள் இவ்வாறு இருக்கும்:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"உரையாடல் பிரிவின் மேல் காட்டும்"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ஆப்ஸின் மேல் மிதக்கும் குமிழாகத் தோன்றும்"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தைக் குறுக்கிடும்"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"சரி"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"அமைப்புகள்"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ஸ்விட்ச்"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"அணுகல்தன்மை பட்டன் இப்போது அணுகல்தன்மை சைகையாக மாற்றப்பட்டுள்ளது\n\n"<annotation id="link">"அமைப்புகளில் காண்க"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"பட்டனைத் தற்காலிகமாக மறைக்க ஓரத்திற்கு நகர்த்தும்"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"சாதனக் கட்டுப்பாடுகள்"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"இணைக்கப்பட்ட சாதனங்களில் கட்டுப்பாடுகளைச் சேர்க்கலாம்"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"சாதனக் கட்டுப்பாடுகளை அமைத்தல்"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"திறந்தநிலை உரையாடல்"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"உரையாடல் விட்ஜெட்டுகள்"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ஓர் உரையாடலை உங்கள் முகப்புத் திரையில் சேர்க்க அந்த உரையாடலைத் தட்டுங்கள்"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"செய்திகளைப் பெற்றதும் இங்கே மீண்டும் வரவும்"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"முன்னுரிமை அளிக்கப்பட்ட உரையாடல்கள்"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"சமீபத்திய உரையாடல்கள்"</string>
+ <string name="okay" msgid="6490552955618608554">"சரி"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>க்குக் குறைவாக"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string>
<string name="birthday_status" msgid="2596961629465396761">"பிறந்தநாள்"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"விரைவில் பிறந்தநாள்"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"ஆண்டு விழா"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"இடத்தைப் பகிர்கிறது"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"புதிய செய்தி"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"பார்க்கிறீர்கள்"</string>
<string name="audio_status" msgid="4237055636967709208">"ஆடியோ கேட்கிறீர்கள்"</string>
<string name="game_status" msgid="1340694320630973259">"விளையாடுகிறீர்கள்"</string>
<string name="empty_user_name" msgid="3389155775773578300">"நண்பர்கள்"</string>
<string name="empty_status" msgid="5938893404951307749">"இன்றிரவு உரையாடலாம்!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"தவறிய அழைப்பு"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"சமீபத்திய மெசேஜ்களையும் தவறிய அழைப்புகளையும் ஸ்டேட்டஸ் அப்டேட்களையும் பார்க்கலாம்"</string>
<string name="people_tile_title" msgid="6589377493334871272">"உரையாடல்"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"பேட்டரி அளவை அறிவதில் சிக்கல்"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"மேலும் தகவல்களுக்கு தட்டவும்"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"அலாரம் எதுவுமில்லை"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index e141210..8b2392e 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"తీసివేయి"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"వేలిముద్ర సెన్సార్ను తాకండి"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"వేలిముద్ర చిహ్నం"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ముఖం గుర్తించలేము. బదులుగా వేలిముద్ర ఉపయోగించండి."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"కొనసాగించడానికి మీ వేలిముద్రను ఉపయోగించండి"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"వేలిముద్రను గుర్తించడం సాధ్యపడదు. బదులుగా స్క్రీన్ లాక్ను ఉపయోగించండి."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"మీ కోసం చూస్తోంది…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ముఖ చిహ్నం"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"అనుకూలత జూమ్ బటన్."</string>
@@ -407,7 +404,7 @@
<string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> వినియోగించబడింది"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"<xliff:g id="DATA_LIMIT">%s</xliff:g> పరిమితి"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> హెచ్చరిక"</string>
- <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"కార్యాలయ ప్రొఫైల్"</string>
+ <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"ఆఫీస్ ప్రొఫైల్"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"రాత్రి కాంతి"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"సూర్యాస్తమయానికి"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"సూర్యోదయం వరకు"</string>
@@ -664,10 +661,15 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"సిద్ధంగా ఉంది"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
- <string name="status_bar_work" msgid="5238641949837091056">"కార్యాలయ ప్రొఫైల్"</string>
+ <string name="status_bar_work" msgid="5238641949837091056">"ఆఫీస్ ప్రొఫైల్"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ఎయిర్ప్లేన్ మోడ్"</string>
<string name="add_tile" msgid="6239678623873086686">"టైల్ను జోడించండి"</string>
<string name="broadcast_tile" msgid="5224010633596487481">"ప్రసార టైల్"</string>
@@ -677,7 +679,7 @@
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="accessibility_quick_settings_detail" msgid="544463655956179791">"శీఘ్ర సెట్టింగ్లు, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"హాట్స్పాట్"</string>
- <string name="accessibility_managed_profile" msgid="4703836746209377356">"కార్యాలయ ప్రొఫైల్"</string>
+ <string name="accessibility_managed_profile" msgid="4703836746209377356">"ఆఫీస్ ప్రొఫైల్"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"కొందరికి సరదాగా ఉంటుంది కానీ అందరికీ అలాగే ఉండదు"</string>
<string name="tuner_warning" msgid="1861736288458481650">"సిస్టమ్ UI ట్యూనర్ Android వినియోగదారు ఇంటర్ఫేస్ను మెరుగుపరచడానికి మరియు అనుకూలీకరించడానికి మీకు మరిన్ని మార్గాలను అందిస్తుంది. ఈ ప్రయోగాత్మక లక్షణాలు భవిష్యత్తు విడుదలల్లో మార్పుకు లోనవ్వచ్చు, తాత్కాలికంగా లేదా పూర్తిగా నిలిపివేయవచ్చు. జాగ్రత్తగా కొనసాగండి."</string>
<string name="tuner_persistent_warning" msgid="230466285569307806">"ఈ ప్రయోగాత్మక లక్షణాలు భవిష్యత్తు విడుదలల్లో మార్పుకు లోనవ్వచ్చు, తాత్కాలికంగా లేదా పూర్తిగా నిలిపివేయవచ్చు. జాగ్రత్తగా కొనసాగండి."</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>స్టేటస్:</b> నిశ్శబ్దం స్థాయికి తగ్గించబడింది"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>స్టేటస్:</b> ఎక్కువ ర్యాంక్కు సర్దుబాటు చేయబడింది"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>స్టేటస్:</b> తక్కువ ర్యాంక్కు సర్దుబాటు చేయబడింది"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"సంభాషణ విభాగం ఎగువన ఉంటుంది, తేలుతున్న బబుల్లాగా కనిపిస్తుంది, లాక్ స్క్రీన్పై ప్రొఫైల్ ఫోటోను ప్రదర్శిస్తుంది"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్లు"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> సంభాషణ ఫీచర్లను సపోర్ట్ చేయదు"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ఈ నోటిఫికేషన్ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము"</string>
@@ -951,7 +955,7 @@
<string name="notification_channel_battery" msgid="9219995638046695106">"బ్యాటరీ"</string>
<string name="notification_channel_screenshot" msgid="7665814998932211997">"స్క్రీన్షాట్లు"</string>
<string name="notification_channel_general" msgid="4384774889645929705">"సాధారణ సందేశాలు"</string>
- <string name="notification_channel_storage" msgid="2720725707628094977">"నిల్వ"</string>
+ <string name="notification_channel_storage" msgid="2720725707628094977">"స్టోరేజ్"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"సూచనలు"</string>
<string name="instant_apps" msgid="8337185853050247304">"ఇన్స్టంట్ యాప్లు"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"సంభాషణ ప్రధానమైనదిగా సెట్ చేయబడింది"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ప్రధాన సంభాషణలు ఇక్కడ కనిపిస్తాయి:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"సంభాషణ విభాగంలో ఎగువున చూపబడుతుంది"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"లాక్ స్క్రీన్ మీద ప్రొఫైల్ ఫోటో చూపబడుతుంది"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"యాప్ల పైన తేలియాడే బబుల్లాగా కనిపిస్తాయి"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'అంతరాయం కలిగించవద్దు\' మోడ్కు అంతరాయం"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"అర్థమైంది"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"సెట్టింగ్లు"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"స్విచ్ చేయి"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"యాక్సెసిబిలిటీ బటన్, యాక్సెసిబిలిటీ సంజ్ఞను భర్తీ చేసింది\n\n"<annotation id="link">"సెట్టింగ్లను చూడండి"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"తాత్కాలికంగా దానిని దాచడానికి బటన్ను చివరకు తరలించండి"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"పరికరం నియంత్రణలు"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"మీ కనెక్ట్ అయిన పరికరాలకు నియంత్రణలను జోడించండి"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"పరికరం నియంత్రణలను సెటప్ చేయడం"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"సంభాషణను తెరవండి"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"సంభాషణ విడ్జెట్లు"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"దీనిని మీ మొదటి స్క్రీన్కు జోడించడానికి సంభాషణను ట్యాప్ చేయండి"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"మీరు కొన్ని మెసేజ్లను పొందిన తర్వాత తిరిగి ఇక్కడ చెక్ చేయండి"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ప్రాధాన్య సంభాషణలు"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ఇటీవలి సంభాషణలు"</string>
+ <string name="okay" msgid="6490552955618608554">"సరే"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> కంటే ముందు"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string>
<string name="birthday_status" msgid="2596961629465396761">"పుట్టినరోజు"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"పుట్టినరోజు వస్తోంది"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"వార్షికోత్సవం"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"లొకేషన్ షేరింగ్"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"కొత్త కథనం"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"చూస్తున్నారు"</string>
<string name="audio_status" msgid="4237055636967709208">"వినడం"</string>
<string name="game_status" msgid="1340694320630973259">"ఆడుతున్నారు"</string>
<string name="empty_user_name" msgid="3389155775773578300">"ఫ్రెండ్స్"</string>
<string name="empty_status" msgid="5938893404951307749">"రాత్రి చాట్ చేద్దాం!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"మిస్డ్ కాల్"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ఇటీవలి మెసేజ్లు, మిస్డ్ కాల్లు, అలాగే స్టేటస్ అప్డేట్లను చూడండి"</string>
<string name="people_tile_title" msgid="6589377493334871272">"సంభాషణ"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"మీ బ్యాటరీ మీటర్ను చదవడంలో సమస్య"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"మరింత సమాచారం కోసం ట్యాప్ చేయండి"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"అలారం సెట్ చేయలేదు"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 65ebb33c..b8e586d 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ปิด"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"แตะเซ็นเซอร์ลายนิ้วมือ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ไอคอนลายนิ้วมือ"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ไม่รู้จักใบหน้า ใช้ลายนิ้วมือแทน"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ใช้ลายนิ้วมือของคุณเพื่อดำเนินการต่อ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ไม่รู้จักลายนิ้วมือ ใช้การล็อกหน้าจอแทน"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"กำลังหาใบหน้าคุณ…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ไอคอนใบหน้า"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ปุ่มซูมที่ใช้งานร่วมกันได้"</string>
@@ -597,7 +594,7 @@
<string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"เปิดใช้"</string>
<string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ปิดใช้"</string>
<string name="accessibility_output_chooser" msgid="7807898688967194183">"เปลี่ยนอุปกรณ์เอาต์พุต"</string>
- <string name="screen_pinning_title" msgid="9058007390337841305">"ตรึงแอปอยู่"</string>
+ <string name="screen_pinning_title" msgid="9058007390337841305">"ปักหมุดแอปอยู่"</string>
<string name="screen_pinning_description" msgid="8699395373875667743">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string>
<string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string>
<string name="screen_pinning_description_gestural" msgid="7246323931831232068">"วิธีนี้ช่วยให้เห็นแอปบนหน้าจอตลอดจนกว่าจะเลิกตรึง เลื่อนขึ้นค้างไว้เพื่อเลิกตรึง"</string>
@@ -605,13 +602,13 @@
<string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string>
<string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"อาจมีการเข้าถึงข้อมูลส่วนตัว (เช่น รายชื่อติดต่อและเนื้อหาในอีเมล)"</string>
<string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"แอปที่ตรึงไว้อาจเปิดแอปอื่นๆ"</string>
- <string name="screen_pinning_toast" msgid="8177286912533744328">"หากต้องการเลิกตรึงแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string>
- <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"หากต้องการเลิกตรึงแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"หน้าแรก\" ค้างไว้"</string>
- <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"หากต้องการเลิกตรึงแอปนี้ ให้เลื่อนขึ้นค้างไว้"</string>
+ <string name="screen_pinning_toast" msgid="8177286912533744328">"หากต้องการเลิกปักหมุดแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"หากต้องการเลิกปักหมุดแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"หน้าแรก\" ค้างไว้"</string>
+ <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"หากต้องการเลิกปักหมุดแอปนี้ ให้เลื่อนขึ้นค้างไว้"</string>
<string name="screen_pinning_positive" msgid="3285785989665266984">"รับทราบ"</string>
<string name="screen_pinning_negative" msgid="6882816864569211666">"ไม่เป็นไร ขอบคุณ"</string>
- <string name="screen_pinning_start" msgid="7483998671383371313">"ตรึงแอปแล้ว"</string>
- <string name="screen_pinning_exit" msgid="4553787518387346893">"เลิกตรึงแอปแล้ว"</string>
+ <string name="screen_pinning_start" msgid="7483998671383371313">"ปักหมุดแอปแล้ว"</string>
+ <string name="screen_pinning_exit" msgid="4553787518387346893">"เลิกปักหมุดแอปแล้ว"</string>
<string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"ซ่อน <xliff:g id="TILE_LABEL">%1$s</xliff:g> ไหม"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"จะปรากฏอีกครั้งเมื่อคุณเปิดใช้ในการตั้งค่าครั้งถัดไป"</string>
<string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"ซ่อน"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"อีเทอร์เน็ต"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"การปลุก"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"พร้อม"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"แสดงทั้งหมด"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"ปลดล็อกเพื่อชำระเงิน"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"พร้อม"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"ตั้งค่าการชำระเงิน"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ปลดล็อกเพื่อใช้"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"เกิดปัญหาในการดึงข้อมูลบัตรของคุณ โปรดลองอีกครั้งในภายหลัง"</string>
<string name="status_bar_work" msgid="5238641949837091056">"โปรไฟล์งาน"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"โหมดบนเครื่องบิน"</string>
<string name="add_tile" msgid="6239678623873086686">"เพิ่มไทล์"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>สถานะ:</b> ลดระดับเป็นปิดเสียง"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>สถานะ:</b> อันดับสูงขึ้น"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>สถานะ:</b> อันดับต่ำลง"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"แสดงที่ด้านบนของส่วนการสนทนา ปรากฏเป็นบับเบิลแบบลอย แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"แสดงที่ด้านบนของการแจ้งเตือนเสมอแม้ว่าโหมดลำดับความสำคัญสูงจะเปิดอยู่"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"การตั้งค่า"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ลำดับความสำคัญ"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"การสนทนาสำคัญ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่รองรับฟีเจอร์การสนทนา"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"ตั้งค่าเป็นการสนทนาสำคัญแล้ว"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"การสนทนาสำคัญจะ:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"แสดงที่ด้านบนของส่วนการสนทนา"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"แสดงเป็นบับเบิลที่ลอยอยู่เหนือแอป"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"การสนทนาสำคัญ"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"การสนทนาเหล่านี้จะแสดงที่ด้านบนของรายการและให้คุณเข้าถึงได้อยู่เสมอเมื่อโหมดลำดับความสำคัญสูงเปิดอยู่"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"รูปโปรไฟล์จะแสดงในหน้าจอล็อก"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"คุณค้นหาการสนทนาเหล่านี้ได้ง่ายๆ ในบับเบิลบนหน้าจอหลัก"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"แสดงในโหมดห้ามรบกวน"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"รับทราบ"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"การตั้งค่า"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"เปลี่ยน"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ปุ่มการช่วยเหลือพิเศษแทนที่ท่าทางสัมผัสการช่วยเหลือพิเศษแล้ว\n\n"<annotation id="link">"ดูการตั้งค่า"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ย้ายปุ่มไปที่ขอบเพื่อซ่อนชั่วคราว"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"ย้ายไปด้านซ้ายบน"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"ย้ายไปด้านขวาบน"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"ย้ายไปด้านซ้ายล่าง"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ย้ายไปด้านขาวล่าง"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ย้ายไปที่ขอบและซ่อน"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ย้ายออกจากขอบและแสดง"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ระบบควบคุมอุปกรณ์"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"เพิ่มตัวควบคุมของอุปกรณ์ที่เชื่อมต่อ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ตั้งค่าระบบควบคุมอุปกรณ์"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"เปิดการสนทนา"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"วิดเจ็ตการสนทนา"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"แตะการสนทนาเพื่อเพิ่มไปยังหน้าจอหลัก"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"กลับมาดูที่นี่อีกครั้งเมื่อได้รับข้อความ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"การสนทนาสำคัญ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"การสนทนาล่าสุด"</string>
+ <string name="okay" msgid="6490552955618608554">"ตกลง"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ไม่ถึง <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
<string name="over_timestamp" msgid="4765793502859358634">"นานกว่า <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
<string name="birthday_status" msgid="2596961629465396761">"วันเกิด"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"วันนี้เป็นวันเกิดของ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"ใกล้ถึงวันเกิดแล้ว"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"ใกล้ถึงวันเกิดของ <xliff:g id="NAME">%1$s</xliff:g> แล้ว"</string>
<string name="anniversary_status" msgid="1790034157507590838">"วันครบรอบ"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"วันนี้เป็นวันครบรอบของ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"กำลังแชร์ตำแหน่ง"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g> กำลังแชร์ตำแหน่ง"</string>
<string name="new_story_status" msgid="9012195158584846525">"เรื่องราวใหม่"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g> แชร์เรื่องราวใหม่"</string>
<string name="video_status" msgid="4548544654316843225">"กำลังดูวิดีโอ"</string>
<string name="audio_status" msgid="4237055636967709208">"กำลังฟัง"</string>
<string name="game_status" msgid="1340694320630973259">"กำลังเล่น"</string>
<string name="empty_user_name" msgid="3389155775773578300">"เพื่อน"</string>
<string name="empty_status" msgid="5938893404951307749">"คืนนี้มาแชทกัน"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"เนื้อหาจะแสดงขึ้นเร็วๆ นี้"</string>
<string name="missed_call" msgid="4228016077700161689">"สายที่ไม่ได้รับ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ดูข้อความล่าสุด สายที่ไม่ได้รับ และการอัปเดตสถานะ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"การสนทนา"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ส่งข้อความ"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ส่งรูปภาพ"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"แตะดูข้อมูลเพิ่มเติม"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ไม่มีการตั้งปลุก"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 9c86e44..9d3378a 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"I-dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Pindutin ang fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icon ng fingerprint"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Hindi makilala ang mukha. Gumamit ng fingerprint."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Gamitin ang iyong fingerprint para magpatuloy"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Hindi makilala ang fingerprint. Gamitin na lang ang lock ng screen."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Hinahanap ka…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Button ng zoom ng pagiging tugma."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Handa na"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Ipakita lahat"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"I-unlock para magbayad"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Handa na"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Mag-set up ng pagbabayad"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"I-unlock para magamit"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Nagkaproblema sa pagkuha ng iyong mga card, pakisubukan ulit sa ibang pagkakataon"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Profile sa trabaho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Magdagdag ng tile"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Status:</b> Na-demote sa Naka-silent"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Status:</b> Ranked nang Mas Mataas"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Status:</b> Na-rank nang Mas Mababa"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Makikita sa itaas ng seksyon ng pag-uusap, lumalabas bilang floating bubble, ipinapakita sa lock screen ang larawan sa profile"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Palaging ipinapakita sa itaas ng iyong mga notification, kahit na naka-on ang Priority mode"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mga Setting"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Mga priyoridad na pag-uusap"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga feature ng pag-uusap"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Hindi mako-configure dito ang pangkat na ito ng mga notification"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Ginawang priyoridad ang pag-uusap"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Ang mga priyoridad na pag-uusap ay:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Lalabas sa itaas ng seksyon ng pag-uusap"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Magpapakita ng larawan sa profile sa lock screen"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ipakitang floating bubble sa ibabaw ng mga app"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Mga priyoridad na pag-uusap"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Ipinapakita ang pag-uusap na ito sa itaas ng listahan mo at palaging ipapakita sa iyo kapag naka-on ang Priority mode"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Ipinapakita ang mga larawan sa profile sa lock screen"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Madali mong mahahanap ang mga pag-uusap na ito sa mga bubble sa iyong Home screen"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ihinto ang Huwag Istorbohin"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mga Setting"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Pinalitan ng button ng accessibility ang galaw ng accessibility\n\n"<annotation id="link">"Tingnan ang mga setting"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Ilipat ang button sa gilid para pansamantala itong itago"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Ilipat sa kaliwa sa itaas"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Ilipat sa kanan sa itaas"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Ilipat sa kaliwa sa ibaba"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Ilipat sa kanan sa ibaba"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Ilipat sa sulok at itago"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alisin sa sulok at ipakita"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Mga kontrol ng device"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Magdagdag ng kontrol para sa mga nakakonektang device"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"I-set up ang mga kontrol ng device"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Buksan ang pag-uusap"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Mga widget ng pag-uusap"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Mag-tap sa isang pag-uusap para idagdag ito sa iyong Home screen"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Bumalik dito kapag nakakuha ka na ng ilang mensahe"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Mga priyoridad na pag-uusap"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Mga kamakailang pag-uusap"</string>
+ <string name="okay" msgid="6490552955618608554">"Okay"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Wala pang <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mahigit <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
<string name="birthday_status" msgid="2596961629465396761">"Kaarawan"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Kaarawan ni <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Kaarawang paparating"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Malapit na ang kaarawan ni <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Anibersaryo"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Anibersaryo ni <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Ibinabahagi ang lokasyon"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"Nagbabahagi ng lokasyon si <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="new_story_status" msgid="9012195158584846525">"Bagong kuwento"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"Nagbahagi si <xliff:g id="NAME">%1$s</xliff:g> ng bagong kuwento"</string>
<string name="video_status" msgid="4548544654316843225">"Nanonood"</string>
<string name="audio_status" msgid="4237055636967709208">"Nakikinig"</string>
<string name="game_status" msgid="1340694320630973259">"Nagpe-play"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Mga Kaibigan"</string>
<string name="empty_status" msgid="5938893404951307749">"Mag-chat tayo mamayang gabi!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Malapit nang lumabas ang content"</string>
<string name="missed_call" msgid="4228016077700161689">"Hindi nasagot na tawag"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Tingnan ang mga kamakailang mensahe, hindi nasagot na tawag, at update sa status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pag-uusap"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng mensahe"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng larawan"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nagkaproblema sa pagbabasa ng iyong battery meter"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"I-tap para sa higit pang impormasyon"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Walang alarm"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 67e883b..44ed1ae 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Kapat"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Parmak izi sensörüne dokunun"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Parmak izi simgesi"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Yüz tanınamadı. Bunun yerine parmak izi kullanın."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Devam etmek için parmak izinizi kullanın"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Parmak izi tanınamadı. Bunun yerine ekran kilidini kullanın."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Yüzünüz tanınmaya çalışılıyor…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Yüz simgesi"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Uyumluluk zum düğmesi."</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Cüzdan"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Hazır"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Tümünü göster"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Ödeme için kilidi aç"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Hazır"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Ödeme ayarlarını belirle"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Kullanmak için kilidi aç"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Kartlarınız alınırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin"</string>
<string name="status_bar_work" msgid="5238641949837091056">"İş profili"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Uçak modu"</string>
<string name="add_tile" msgid="6239678623873086686">"Blok ekle"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Durum:</b> Sessize Düşürüldü"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Durum:</b> Daha Yüksek Sıralandı"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Durum:</b> Daha Düşük Sıralandı"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Görüşme bölümünün üstünde gösterilir, kayan baloncuk olarak görünür, kilit ekranında profil resmini görüntüler"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Öncelik modu açık olduğunda bile her zaman bildirimlerinizin üst kısmında gösterilir"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Öncelikli görüşmeler"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sohbet özelliklerini desteklemiyor"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Bu bildirim grubu burada yapılandırılamaz"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Görüşme öncelikli olarak ayarlandı"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Öncelikli görüşmeler:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Görüşme bölümünün üstünde gösterilir"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilit ekranında profil resmi gösterilir"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Uygulamaların üzerinde kayan balon olarak görünür"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Öncelikli görüşmeler"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Listenizin üst kısmında gösterilen bu görüşmeler, Öncelik modu açık olduğunda her zaman size ulaşabilir"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Profil resimleri kilit ekranında gösterilir"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Bu görüşmeleri, ana ekranınızdaki baloncuklarda kolayca bulabilirsiniz"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Rahatsız Etmeyin\'i keser"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Geç"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Erişilebilirlik hareketi, Erişilebilirlik düğmesi ile değiştirildi\n\n"<annotation id="link">"Ayarları görüntüle"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Düğmeyi geçici olarak gizlemek için kenara taşıyın"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Sol üste taşı"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Sağ üste taşı"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Sol alta taşı"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sağ alta taşı"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Kenara taşıyıp gizle"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kenarın dışına taşıyıp göster"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz denetimleri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bağlı cihazlarınız için denetimler ekleyin"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz denetimlerini kur"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Görüşmeyi aç"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Görüşme widget\'ları"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ana ekranınıza eklemek için bir ileti dizisine dokunun"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Birkaç mesaj aldıktan sonra burayı tekrar kontrol edin"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Öncelikli görüşmeler"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Son görüşmeler"</string>
+ <string name="okay" msgid="6490552955618608554">"Tamam"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> önce"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Henüz <xliff:g id="DURATION">%1$s</xliff:g> olmadı"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> üzerinde bir süre önce"</string>
<string name="birthday_status" msgid="2596961629465396761">"Doğum günü"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Bugün <xliff:g id="NAME">%1$s</xliff:g> adlı kişinin doğum günü"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Yaklaşan doğum günü"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"<xliff:g id="NAME">%1$s</xliff:g> adlı kişinin doğum günü yaklaşıyor"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Yıl dönümü"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"<xliff:g id="NAME">%1$s</xliff:g> adlı kişinin yıl dönümü"</string>
<string name="location_status" msgid="1294990572202541812">"Konum paylaşılıyor"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"<xliff:g id="NAME">%1$s</xliff:g>, konum bilgisini paylaşıyor"</string>
<string name="new_story_status" msgid="9012195158584846525">"Yeni hikaye"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"<xliff:g id="NAME">%1$s</xliff:g>, yeni bir hikaye paylaştı"</string>
<string name="video_status" msgid="4548544654316843225">"İzleniyor"</string>
<string name="audio_status" msgid="4237055636967709208">"Dinleniyor"</string>
<string name="game_status" msgid="1340694320630973259">"Çalınıyor"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Arkadaşlar"</string>
<string name="empty_status" msgid="5938893404951307749">"Haydi sohbet edelim."</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"İçerik yakında gösterilecek"</string>
<string name="missed_call" msgid="4228016077700161689">"Cevapsız arama"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Yeni mesajları, cevapsız aramaları ve durum güncellemelerini görün"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konuşma"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> bir ileti gönderdi"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> bir resim gönderdi"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pil ölçeriniz okunurken sorun oluştu"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Daha fazla bilgi için dokunun"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm ayarlanmadı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index f0f51c6..6a762d7 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Закрити"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Торкніться сканера відбитків пальців"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Значок відбитка пальця"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Обличчя не розпізнано. Скористайтеся відбитком пальця."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Щоб продовжити, скористайтеся відбитком пальця"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Відбиток пальця не розпізнано. Використайте натомість дані для розблокування екрана."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Пошук обличчя…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Значок обличчя"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Кнопка масштабування сумісності."</string>
@@ -333,7 +330,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбувати"</string>
<string name="quick_settings_dnd_priority_label" msgid="6251076422352664571">"Лише пріоритетні"</string>
<string name="quick_settings_dnd_alarms_label" msgid="1241780970469630835">"Лише будильник"</string>
- <string name="quick_settings_dnd_none_label" msgid="8420869988472836354">"Без сигналів"</string>
+ <string name="quick_settings_dnd_none_label" msgid="8420869988472836354">"Повна тиша"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"Bluetooth (пристроїв: <xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"Bluetooth вимкнено"</string>
@@ -456,12 +453,12 @@
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Розблокуйте екран, щоб скористатись NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Цей пристрій належить вашій організації"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
- <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Цей пристрій надала організація <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"Цей пристрій надано компанією \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
<string name="phone_hint" msgid="6682125338461375925">"Телефон: проведіть пальцем від значка"</string>
<string name="voice_hint" msgid="7476017460191291417">"Голосові підказки: проведіть пальцем від значка"</string>
<string name="camera_hint" msgid="4519495795000658637">"Камера: проведіть пальцем від значка"</string>
<string name="interruption_level_none_with_warning" msgid="8394434073508145437">"Без звуку. Звук також буде вимкнено в програмах зчитування з екрана."</string>
- <string name="interruption_level_none" msgid="219484038314193379">"Без сигналів"</string>
+ <string name="interruption_level_none" msgid="219484038314193379">"Повна тиша"</string>
<string name="interruption_level_priority" msgid="661294280016622209">"Лише пріоритетні"</string>
<string name="interruption_level_alarms" msgid="2457850481335846959">"Лише будильник"</string>
<string name="interruption_level_none_twoline" msgid="8579382742855486372">"Без\nсигналів"</string>
@@ -527,7 +524,7 @@
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Цим пристроєм керує батько або мати"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Цей пристрій належить вашій організації. Її адміністратор може відстежувати мережевий трафік"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\". Її адміністратор може відстежувати мережевий трафік"</string>
- <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Цей пристрій надала організація <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Цей пристрій надано компанією \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"Цей пристрій належить вашій організації. Його підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_management_named_vpn" msgid="5302786161534380104">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\". Його підключено до додатка <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>
<string name="quick_settings_disclosure_management" msgid="5515296598440684962">"Цей пристрій належить вашій організації"</string>
@@ -542,7 +539,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш робочий профіль підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="5481763430080807797">"Ваш особистий профіль підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="2350838218824492465">"Цей пристрій підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Цей пристрій надала організація <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
+ <string name="monitoring_title_financed_device" msgid="3659962357973919387">"Цей пристрій надано компанією \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Керування пристроями"</string>
<string name="monitoring_title_profile_owned" msgid="6301118649405449568">"Відстеження профілю"</string>
<string name="monitoring_title" msgid="4063890083735924568">"Відстеження дій у мережі"</string>
@@ -554,7 +551,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"Переглянути правила"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"Переглянути засоби контролю"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\".\n\nIT-адміністратор може відстежувати й контролювати налаштування, корпоративний доступ, додатки, дані пристрою та інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв\'яжіться з IT-адміністратором."</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"Організація <xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> може отримувати доступ до даних, пов\'язаних із цим пристроєм, змінювати його налаштування та керувати додатками.\n\nЯкщо у вас є запитання, зв\'яжіться з організацією <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>."</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"Компанія \"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g>\" має доступ до даних, пов\'язаних із цим пристроєм, а також може змінювати його налаштування та керувати додатками.\n\nЯкщо у вас є запитання, зв\'яжіться з компанією \"<xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>\"."</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"Цей пристрій належить вашій організації.\n\nІТ-адміністратор може відстежувати й контролювати налаштування, корпоративний доступ, додатки, дані пристрою та інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв\'яжіться з ІТ-адміністратором."</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Адміністратор організації встановив центр сертифікації на цьому пристрої. Захищений мережевий трафік може відстежуватися або змінюватися."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Адміністратор організації встановив центр сертифікації у вашому робочому профілі. Захищений мережевий трафік може відстежуватися або змінюватися."</string>
@@ -670,7 +667,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Робочий профіль"</string>
@@ -733,17 +735,19 @@
<string name="notification_automatic_title" msgid="3745465364578762652">"Автоматично"</string>
<string name="notification_channel_summary_low" msgid="4860617986908931158">"Без звуку чи вібрації"</string>
<string name="notification_conversation_summary_low" msgid="1734433426085468009">"Без звуку чи вібрації, з\'являється нижче в розділі розмов"</string>
- <string name="notification_channel_summary_default" msgid="3282930979307248890">"Може дзвонити або вібрувати залежно від налаштувань телефона"</string>
- <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може дзвонити або вібрувати залежно від налаштувань телефона. Показує спливаючі розмови з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за умовчанням."</string>
+ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Дзвінок або вібрація залежно від налаштувань телефона"</string>
+ <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Дзвінок або вібрація залежно від налаштувань телефона. Розмови з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за умовчанням з\'являються як спливаючий чат."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привертає увагу до контенту плаваючим ярликом."</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Дозволити системі визначати, чи має сповіщення супроводжуватися звуком або вібрацією"</string>
<string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"<b>Статус</b>: підвищено до \"За умовчанням\""</string>
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Статус</b>: знижено до \"Без звуку\""</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Статус</b>: пріоритет підвищено"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Статус</b>: пріоритет знижено"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"З\'являється вгорі розділу розмов у спливаючому сповіщенні та показує зображення профілю на заблокованому екрані"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує функції розмов"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Цю групу сповіщень не можна налаштувати тут"</string>
@@ -1021,10 +1025,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Розмову призначено важливою"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Важливі розмови:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"З\'являються вгорі розділу розмов"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показують фото профілю на заблокованому екрані"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"З\'являються як спливаючі чати поверх додатків"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Переривають режим \"Не турбувати\""</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налаштування"</string>
@@ -1042,6 +1050,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Перемкнути"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Замість жесту спеціальних можливостей тепер використовується кнопка\n\n"<annotation id="link">"Переглянути налаштування"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Щоб тимчасово сховати кнопку, перемістіть її на край екрана"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Керування пристроями"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додайте елементи керування для підключених пристроїв"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Налаштувати елементи керування пристроями"</string>
@@ -1114,31 +1134,43 @@
<string name="basic_status" msgid="2315371112182658176">"Відкрита розмова"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Віджети розмов"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Натисніть розмову, щоб додати її на головний екран"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Поверніться сюди, коли отримаєте повідомлення"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Важливі розмови"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Нещодавні розмови"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Менше ніж <xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Понад <xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
<string name="birthday_status" msgid="2596961629465396761">"День народження"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Скоро іменини"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Річниця"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Ділюся геоданими"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Нова історія"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Дивлюся відео"</string>
<string name="audio_status" msgid="4237055636967709208">"Слухаю аудіо"</string>
<string name="game_status" msgid="1340694320630973259">"Граю в гру"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Друзі"</string>
<string name="empty_status" msgid="5938893404951307749">"Поспілкуймося!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Пропущений виклик"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Переглядайте останні повідомлення, пропущені виклики й оновлення статусу"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Розмова"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не вдалось отримати дані лічильника акумулятора"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Натисніть, щоб дізнатися більше"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Немає будильників"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 4d37244..0ec904f2 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ایپ یا آپ کی تنظیم کی جانب سے اسکرین شاٹس لینے کی اجازت نہیں ہے"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ترمیم کریں"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"اسکرین شاٹ میں ترمیم کریں"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"مزید کیپچر کریں"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"اسکرین شاٹ برخاست کریں"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"اسکرین شاٹ کا پیش منظر"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"اوپر کا احاطہ"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"برخاست کریں"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"فنگر پرنٹ سینسر پر ٹچ کریں"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"فنگر پرنٹ آئیکن"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چہرے کی شناخت نہیں ہو سکی۔ اس کے بجائے فنگر پرنٹ استعمال کریں۔"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"جاری رکھنے کے لیے اپنا فنگر پرنٹ استعمال کریں"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"فنگر پرنٹ کی شناخت نہیں کی جا سکی۔ اس کے بجائے اسکرین لاک کا استعمال کریں۔"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"آپ کے لیے تلاش کیا جا رہا ہے…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"چہرے کا آئیکن"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"مطابقت پذیری زوم بٹن۔"</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"رنگ پلٹیں"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"رنگ کی اصلاح کی وضع"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"مزید ترتیبات"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"صارف کی ترتیبات"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ہو گیا"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بند کریں"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"مربوط"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"منسلک ہے، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"مربوط ہو رہا ہے…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"یہ آلہ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> کا ہے اور VPNs سے منسلک ہے"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"آپ کی تنظیم آپ کے دفتری پروفائل میں نیٹ ورک ٹریفک مانیٹر کر سکتی ہے"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> آپ کے دفتری پروفائل میں نیٹ ورک ٹریفک مانیٹر کر سکتی ہے"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"آپ کا IT منتظم دفتری پروفائل نیٹ ورک کی سرگرمی دیکھ سکتا ہے۔"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"نیٹ ورک کو مانیٹر کیا جا سکتا ہے"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"یہ آلہ VPNs سے منسلک ہے"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"آپ کی دفتری پروفائل <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے"</string>
@@ -552,7 +545,7 @@
<string name="monitoring_button_view_policies" msgid="3869724835853502410">"پالیسیاں دیکھیں"</string>
<string name="monitoring_button_view_controls" msgid="8316440345340701117">"کنٹرولز دیکھیں"</string>
<string name="monitoring_description_named_management" msgid="505833016545056036">"یہ آلہ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> کا ہے۔\n\nآپ کا IT منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کے لیے اپنے IT منتظم سے رابطہ کریں۔"</string>
- <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> اس آلے سے وابستہ ڈیٹا تک رسائی حاصل، ایپس کا نظم اور ان آلات کی ترتیبات کو تبدیل کر سکتا ہے۔\n\nاگر آپ سوالات پوچھنا چاہتے ہیں تو <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> سے رابطہ کریں۔"</string>
+ <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> اس آلے سے وابستہ ڈیٹا تک رسائی حاصل، ایپس کا نظم اور ان آلات کی ترتیبات کو تبدیل کر سکتا ہے۔\n\nاگر آپ سوالات پوچھنا چاہتے ہیں تو <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> سے رابطہ کریں۔"</string>
<string name="monitoring_description_management" msgid="4308879039175729014">"یہ آلہ آپ کی تنظیم کا ہے۔\n\nآپ کا IT منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کے لیے اپنے IT منتظم سے رابطہ کریں۔"</string>
<string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"آپ کی تنظیم نے اس آلے پر ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"آپ کی تنظیم نے آپ کے دفتری پروفائل میں ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔"</string>
@@ -668,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"تیار ہے"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"دفتری پروفائل"</string>
@@ -739,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>اسٹیٹس:</b> کو خاموش پر درجہ بند کیا گیا"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>اسٹیٹس:</b> کو اعلی درجہ دیا گیا"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>اسٹیٹس:</b> کو کم درجہ دیا گیا"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"گفتگو کے سیکشن کے اوپری حصے پر دکھاتا ہے، تیرتے بلبلے کی طرح ظاہر ہوتا ہے، لاک اسکرین پر پروفائل تصویر دکھاتا ہے"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> گفتگو کی خصوصیات کو سپورٹ نہیں کرتا ہے"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا"</string>
@@ -1015,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"گفتگو کو ترجیح پر سیٹ کیا گیا"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ترجیحی گفتگوئیں:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"گفتگو سیکشن میں سب سے اوپر نظر آئیں گی"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"مقفل سکرین پر پروفائل کی تصویر دکھائیں گی"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ایپس کے سب سے اوپر فلوٹنگ بلبلہ کے طور پر ظاہر ہوں"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ڈسٹرب نہ کریں میں مداخلت کریں"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"سمجھ آ گئی"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ترتیبات"</string>
@@ -1036,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"سوئچ کریں"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"ایکسیسبیلٹی بٹن کو ایکسیسبیلٹی اشارے سے بدل دیا گیا\n\n"<annotation id="link">"ترتیبات دیکھیں"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"عارضی طور پر بٹن کو چھپانے کے لئے اسے کنارے پر لے جائیں"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"آلہ کے کنٹرولز"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"اپنے منسلک آلات کے لیے کنٹرولز شامل کریں"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"آلہ کے کنٹرولز سیٹ اپ کریں"</string>
@@ -1106,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"گفتگو کھولیں"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"گفتگو ویجیٹس"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"اسے اپنے ہوم اسکرین پر شامل کرنے کے لیے گفتگو پر تھپتھپائیں"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"کچھ پیغامات حاصل کرنے کے بعد یہاں دوبارہ چیک کریں"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ترجیحی گفتگوئیں"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"حالیہ گفتگوئیں"</string>
+ <string name="okay" msgid="6490552955618608554">"ٹھیک ہے"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> سے کچھ کم وقت قبل"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> سے زائد عرصہ قبل"</string>
<string name="birthday_status" msgid="2596961629465396761">"سالگرہ"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"سالگرہ قریب ہے"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"سالگرہ"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"مقام کا اشتراک کیا جا رہا ہے"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"نئی کہانی"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"دیکھ رہے ہیں"</string>
<string name="audio_status" msgid="4237055636967709208">"سنی جا رہی ہے"</string>
<string name="game_status" msgid="1340694320630973259">"کھیلی جا رہی ہے"</string>
<string name="empty_user_name" msgid="3389155775773578300">"دوست"</string>
<string name="empty_status" msgid="5938893404951307749">"آج رات چیٹ کرتے ہیں!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"چھوٹی ہوئی کال"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"حالیہ پیغامات، چھوٹی ہوئی کالز اور اسٹیٹس اپ ڈیٹس دیکھیں"</string>
<string name="people_tile_title" msgid="6589377493334871272">"گفتگو"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"آپ کے بیٹری میٹر کو پڑھنے میں دشواری"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"مزید معلومات کے لیے تھپتھپائیں"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"کوئی الارم سیٹ نہیں ہے"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 01349b4..66cecef 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -661,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Tayyor"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Ish profili"</string>
@@ -732,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Holati:</b> Sokin darajaga tushirildi"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Holati:</b> Yuqori darajaga chiqarildi"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Holati:</b> Quyi darajaga tushirildi"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Suhbatlar ruknining tepasida qalqib chiquvchi bulutcha shaklida chiqadi, ekran qulfida profil rasmi chiqadi"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Sozlamalar"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat funksiyalari ishlamaydi"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi"</string>
@@ -1008,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Tizim navigatsiyasini yangilash uchun Sozlamalarni oching"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Suhbat muhim deb belgilandi"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Muhim suhbatlar quyidagi amallarni bajaradi:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Suhbatlar ruknining tepasida chiqarish"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ekran qulfida profil rasmini chiqarish"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ilovalar ustida bulutchali xabar sifatida chiqadi"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Bezovta qilinmasin rejimida chiqarish"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Sozlamalar"</string>
@@ -1029,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Almashtirish"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Maxsus imkoniyatlar tugmasi maxsus imkoniyatlar ishorasini almashtirdi\n\n"<annotation id="link">"Sozlamalarni ochish"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Vaqtinchalik berkitish uchun tugmani qirra tomon suring"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Qurilmalarni boshqarish"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalar uchun boshqaruv elementlari"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Qurilma boshqaruv elementlarini sozlash"</string>
@@ -1107,19 +1130,35 @@
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>dan kam vaqt oldin"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>dan ortiq vaqt oldin"</string>
<string name="birthday_status" msgid="2596961629465396761">"Tavallud kuni"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Yaqinda tavallud kun"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Yubiley"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Joylashuv ulashilmoqda"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Yangi hikoya"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Tomosha"</string>
<string name="audio_status" msgid="4237055636967709208">"Gapiring"</string>
<string name="game_status" msgid="1340694320630973259">"Ijro etilmoqda"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Doʻstlar"</string>
<string name="empty_status" msgid="5938893404951307749">"Bugun yozishaylik!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Javobsiz chaqiruv"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Oxirgi xabarlar, javobsiz chaqiruvlar va holat yangilanishlari"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Suhbat"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya quvvati aniqlanmadi"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Batafsil axborot olish uchun bosing"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Signal sozlanmagan"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index dcd029f..dfcce49 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Đóng"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Chạm vào cảm biến vân tay"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Biểu tượng vân tay"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Không thể nhận dạng khuôn mặt. Hãy dùng vân tay."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Hãy dùng vân tay để tiếp tục"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Không thể nhận dạng vân tay. Hãy dùng phương thức khóa màn hình."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Đang tìm kiếm bạn…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Biểu tượng khuôn mặt"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Nút thu phóng khả năng tương thích."</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Sẵn sàng"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"Hồ sơ công việc"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Trạng thái:</b> Đã thay đổi thành Im lặng"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Trạng thái:</b> Đã tăng mức độ quan trọng"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Trạng thái:</b> Đã giảm mức độ quan trọng"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Hiển thị ở đầu phần cuộc trò chuyện, dưới dạng bong bóng nổi và hiển thị ảnh hồ sơ trên màn hình khóa"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ các tính năng trò chuyện"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Không thể định cấu hình nhóm thông báo này tại đây"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Đặt cuộc trò chuyện thành ưu tiên"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Cuộc trò chuyện ưu tiên sẽ:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Hiển thị ở đầu phần cuộc trò chuyện"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Hiển thị ảnh hồ sơ trên màn hình khóa"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Hiện ở dạng bong bóng nổi ở trên cùng của ứng dụng"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Làm gián đoạn chế độ Không làm phiền"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cài đặt"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Chuyển"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Nút hỗ trợ tiếp cận đã thay thế cử chỉ hỗ trợ tiếp cận\n\n"<annotation id="link">"Xem chế độ cài đặt"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Di chuyển nút sang cạnh để ẩn nút tạm thời"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Điều khiển thiết bị"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Thêm các tùy chọn điều khiển cho các thiết bị đã kết nối của bạn"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Thiết lập các tùy chọn điều khiển thiết bị"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"Mở cuộc trò chuyện"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Tiện ích trò chuyện"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Nhấn vào một cuộc trò chuyện để thêm cuộc trò chuyện đó vào Màn hình chính"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Hãy quay lại đây khi bạn nhận được tin nhắn"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Cuộc trò chuyện ưu tiên"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Cuộc trò chuyện gần đây"</string>
+ <string name="okay" msgid="6490552955618608554">"Ok"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Chưa đầy <xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hơn <xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
<string name="birthday_status" msgid="2596961629465396761">"Sinh nhật"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Sắp đến sinh nhật"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"Ngày kỷ niệm"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"Đang chia sẻ vị trí"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"Tin bài mới"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"Đang xem"</string>
<string name="audio_status" msgid="4237055636967709208">"Đang nghe"</string>
<string name="game_status" msgid="1340694320630973259">"Đang chơi"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Bạn bè"</string>
<string name="empty_status" msgid="5938893404951307749">"Cùng trò chuyện tối nay nhé!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"Cuộc gọi nhỡ"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Hơn <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Xem các tin nhắn, cuộc gọi nhỡ và thông tin cập nhật trạng thái gần đây"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Cuộc trò chuyện"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Đã xảy ra vấn đề khi đọc dung lượng pin của bạn"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Nhấn để biết thêm thông tin"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Chưa đặt chuông báo"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 7172e81..96a7ae0 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"关闭"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"请触摸指纹传感器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"指纹图标"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"无法识别人脸。请改用指纹。"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"使用指纹验证身份后才能继续"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"无法识别指纹。请改用屏幕锁定功能。"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"正在查找您的面孔…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"面孔图标"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"兼容性缩放按钮。"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作资料"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>状态</b>:已降低为“静音”"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>状态</b>:已调高顺序"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>状态</b>:已调低顺序"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以悬浮对话泡形式显示在对话部分顶部,如果设备处于锁定状态,在锁定屏幕上显示个人资料照片"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"您无法在此处配置这组通知"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"已设置为优先对话"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"优先对话将:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"显示在对话部分顶部"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在锁定屏幕上显示个人资料照片"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以悬浮对话泡的形式显示在应用之上"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中断勿扰模式"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"设置"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切换"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"“无障碍”按钮已取代无障碍手势\n\n"<annotation id="link">"查看设置"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"将按钮移到边缘,即可暂时将其隐藏"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"设备控制器"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"为您所连接的设备添加控件"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"设置设备控件"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"开放式对话"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"对话微件"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"点按对话即可将其添加到主屏幕"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"请在收到一些消息后再回来查看"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"优先对话"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"近期对话"</string>
+ <string name="okay" msgid="6490552955618608554">"确定"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>内"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超过 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="birthday_status" msgid="2596961629465396761">"生日"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"生日快到了"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"周年纪念日"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"正在分享位置信息"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"新故事"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"正在观看"</string>
<string name="audio_status" msgid="4237055636967709208">"正在收听"</string>
<string name="game_status" msgid="1340694320630973259">"正在玩游戏"</string>
<string name="empty_user_name" msgid="3389155775773578300">"好友"</string>
<string name="empty_status" msgid="5938893404951307749">"今晚来聊聊吧!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"未接电话"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看最近的信息、未接电话和状态更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"对话"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"读取电池计量器时出现问题"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"点按即可了解详情"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未设置闹钟"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index f243e7c..5f51239 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"關閉"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"請輕觸指紋感應器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"指紋圖示"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識面孔,請改用指紋完成驗證。"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"請使用您的指紋繼續"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"無法辨識指紋,請改用螢幕鎖定完成驗證。"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"正在搜尋您的臉孔…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"面孔圖示"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"相容性縮放按鈕。"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作設定檔"</string>
@@ -727,7 +729,7 @@
<string name="notification_automatic_title" msgid="3745465364578762652">"自動"</string>
<string name="notification_channel_summary_low" msgid="4860617986908931158">"無音效或震動"</string>
<string name="notification_conversation_summary_low" msgid="1734433426085468009">"無音效或震動,並在對話部分的較低位置顯示"</string>
- <string name="notification_channel_summary_default" msgid="3282930979307248890">"可能會根據手機設定發出鈴聲或震動"</string>
+ <string name="notification_channel_summary_default" msgid="3282930979307248890">"根據手機設定發出鈴聲或震動"</string>
<string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機設定發出鈴聲或震動。「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會預設以對話氣泡顯示。"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"為此內容建立浮動捷徑以保持注意力。"</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"由系統判斷是否要讓此通知發出音效或震動"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>狀態:</b>已降低為靜音"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>狀態:</b>已提高次序"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>狀態:</b>已調低次序"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"在對話部分頂部顯示浮動對話氣泡,並在上鎖畫面上顯示個人檔案相片"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"無法在此設定這組通知"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"前往「設定」更新系統導覽"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"對話已設為優先"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先對話將會:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"在對話部分的頂部顯示"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在上鎖畫面顯示個人檔案相片"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"在應用程式上以浮動小視窗顯示"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷「請勿騷擾」"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切換"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"無障礙工具按鈕取代咗無障礙手勢\n\n"<annotation id="link">"睇下設定"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"將按鈕移到邊緣即可暫時隱藏"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"為連接的裝置新增控制選項"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"開啟對話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"待你收到一些訊息後再回來查看"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"優先對話"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"最近的對話"</string>
+ <string name="okay" msgid="6490552955618608554">"確定"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="birthday_status" msgid="2596961629465396761">"生日之星"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"即將生日"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"週年紀念"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"分享位置資訊"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"最新報導"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"正在觀看"</string>
<string name="audio_status" msgid="4237055636967709208">"正在聽取音訊"</string>
<string name="game_status" msgid="1340694320630973259">"正在玩遊戲"</string>
<string name="empty_user_name" msgid="3389155775773578300">"朋友"</string>
<string name="empty_status" msgid="5938893404951307749">"今晚聊天吧!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"未接來電"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"對話"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"讀取電池計量器時發生問題"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"輕按即可瞭解詳情"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未設定鬧鐘"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index ffd235e..8d6ac87 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"關閉"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"請輕觸指紋感應器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"指紋圖示"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識臉孔,請改用指紋完成驗證。"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"使用指紋完成驗證才能繼續操作"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"無法辨識指紋,請改用螢幕鎖定完成驗證。"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"正在尋找你的臉孔…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"臉孔圖示"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"相容性縮放按鈕。"</string>
@@ -414,7 +411,7 @@
<string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string>
<string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> 關閉"</string>
<string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"深色主題"</string>
- <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"節約耗電量"</string>
+ <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"省電模式"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"於日落時開啟"</string>
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"於日出時關閉"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"開啟時間:<xliff:g id="TIME">%s</xliff:g>"</string>
@@ -664,7 +661,12 @@
<skip />
<!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
<skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_secondary_label_active (4909706168969888137) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_no_card (1750103386908123401) -->
+ <skip />
+ <!-- no translation found for wallet_secondary_label_device_locked (5175862019125370506) -->
+ <skip />
<!-- no translation found for wallet_error_generic (257704570182963611) -->
<skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作資料夾"</string>
@@ -735,9 +737,11 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>狀態:</b>已降低為靜音"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>狀態:</b>已調高順序"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>狀態:</b>已調降順序"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話框的形式顯示在對話部分的頂端。如果裝置處於鎖定狀態,則在螢幕鎖定畫面上顯示個人資料相片"</string>
+ <!-- no translation found for notification_channel_summary_priority (4592979359953954258) -->
+ <skip />
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
+ <!-- no translation found for notification_priority_title (5256226572739882190) -->
+ <skip />
<string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"無法在這裡設定這個通知群組"</string>
@@ -792,7 +796,7 @@
</plurals>
<string name="battery_panel_title" msgid="5931157246673665963">"電池用量"</string>
<string name="battery_detail_charging_summary" msgid="8821202155297559706">"充電時無法使用省電模式"</string>
- <string name="battery_detail_switch_title" msgid="6940976502957380405">"節約耗電量"</string>
+ <string name="battery_detail_switch_title" msgid="6940976502957380405">"省電模式"</string>
<string name="battery_detail_switch_summary" msgid="3668748557848025990">"降低效能並限制背景資料傳輸"</string>
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 按鈕"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home 鍵"</string>
@@ -1011,10 +1015,14 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"請前往「設定」更新系統操作機制"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"對話已設為優先"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先對話會:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"顯示在對話部分的頂端"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在螢幕鎖定畫面上顯示個人資料相片"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以浮動對話框形式顯示在應用程式最上層"</string>
+ <!-- no translation found for priority_onboarding_behavior (636826237468953117) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_at_top_text (3861580571311518785) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_show_avatar_text (1781653813573865071) -->
+ <skip />
+ <!-- no translation found for priority_onboarding_appear_as_bubble_text (4359924720680083057) -->
+ <skip />
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷零打擾模式"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"我知道了"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
@@ -1032,6 +1040,18 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切換"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"無障礙工具按鈕已取代無障礙手勢\n\n"<annotation id="link">"查看設定"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"將按鈕移到邊緣處即可暫時隱藏"</string>
+ <!-- no translation found for accessibility_floating_button_action_move_top_left (6253520703618545705) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_top_right (6106225581993479711) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_left (8063394111137429725) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_bottom_right (6196904373227440500) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_to_edge_and_hide_to_half (662401168245782658) -->
+ <skip />
+ <!-- no translation found for accessibility_floating_button_action_move_out_edge_and_show (8354760891651663326) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"新增已連結裝置的控制項"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string>
@@ -1102,31 +1122,43 @@
<string name="basic_status" msgid="2315371112182658176">"開放式對話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"輕觸對話即可新增至主畫面"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"等你收到一些訊息後再回來這裡看看"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"優先對話"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"最近的對話"</string>
+ <string name="okay" msgid="6490552955618608554">"確定"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="birthday_status" msgid="2596961629465396761">"本日壽星"</string>
+ <!-- no translation found for birthday_status_content_description (7677415209545817153) -->
+ <skip />
<string name="upcoming_birthday_status" msgid="2005452239256870351">"生日快到了"</string>
+ <!-- no translation found for upcoming_birthday_status_content_description (1210885672210845293) -->
+ <skip />
<string name="anniversary_status" msgid="1790034157507590838">"週年紀念"</string>
+ <!-- no translation found for anniversary_status_content_description (6214503393960662875) -->
+ <skip />
<string name="location_status" msgid="1294990572202541812">"正在分享位置資訊"</string>
+ <!-- no translation found for location_status_content_description (2982386178160071305) -->
+ <skip />
<string name="new_story_status" msgid="9012195158584846525">"新故事"</string>
+ <!-- no translation found for new_story_status_content_description (4963137422622516708) -->
+ <skip />
<string name="video_status" msgid="4548544654316843225">"正在觀看影片"</string>
<string name="audio_status" msgid="4237055636967709208">"正在聆聽內容"</string>
<string name="game_status" msgid="1340694320630973259">"正在玩遊戲"</string>
<string name="empty_user_name" msgid="3389155775773578300">"好友"</string>
<string name="empty_status" msgid="5938893404951307749">"今晚來聊聊吧!"</string>
+ <!-- no translation found for status_before_loading (1500477307859631381) -->
+ <skip />
<string name="missed_call" msgid="4228016077700161689">"未接來電"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"對話"</string>
+ <!-- no translation found for new_notification_text_content_description (5574393603145263727) -->
+ <skip />
+ <!-- no translation found for new_notification_image_content_description (6017506886810813123) -->
+ <skip />
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"讀取電池計量器時發生問題"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"輕觸即可瞭解詳情"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未設定鬧鐘"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index cb6aa0e..54facec 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Cashisa"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Thinta inzwa yesigxivizo zeminwe"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Isithonjana sezigxivizo zeminwe"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ayibazi ubuso. Sebenzisa izigxivizo zeminwe kunalokho."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Sebenzisa izigxivizo zakho zeminwe ukuze uqhubeke"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Ayizazi izigxivizo zeminwe. Sebenzisa ukukhiya isikrini kunalokho."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Kufunwa wena…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Isithonjana sobuso"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Inkinobho evumelekile yokusondeza"</string>
@@ -660,13 +657,12 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"I-Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"I-alamu"</string>
<string name="wallet_title" msgid="5369767670735827105">"I-wallet"</string>
- <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
- <skip />
- <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
- <skip />
- <string name="wallet_secondary_label" msgid="2017028770884957543">"Isikulungele"</string>
- <!-- no translation found for wallet_error_generic (257704570182963611) -->
- <skip />
+ <string name="wallet_button_label_device_unlocked" msgid="4653372304880486681">"Bonisa konke"</string>
+ <string name="wallet_button_label_device_locked" msgid="4418473374652969487">"Vula ukuze ukhokhele"</string>
+ <string name="wallet_secondary_label_active" msgid="4909706168969888137">"Isikulungele"</string>
+ <string name="wallet_secondary_label_no_card" msgid="1750103386908123401">"Setha inkokhelo"</string>
+ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Vula ukuze usebenzise"</string>
+ <string name="wallet_error_generic" msgid="257704570182963611">"Kube khona inkinga yokuthola amakhadi akho, sicela uzame futhi ngemuva kwesikhathi"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Iphrofayela yomsebenzi"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Imodi yendiza"</string>
<string name="add_tile" msgid="6239678623873086686">"Engeza ithayili"</string>
@@ -735,9 +731,9 @@
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Isimo:</b> Sehliselwe Kokuthulile"</string>
<string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>Isimo:</b> Silinganiselwe phezulu"</string>
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Isimo:</b> Silinganiselwe phansi"</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Iboniswa ngenhla kwesigaba sengxoxo, ivela njengebhamuza elintantayo, ibonisa isithombe sephrofayela kukukhiya isikrini"</string>
+ <string name="notification_channel_summary_priority" msgid="4592979359953954258">"Iboniswa phezulu njalo ezazisweni zakho, ngisho nalapho kuvulwe imodi Ebalulekile"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Izilungiselelo"</string>
- <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string>
+ <string name="notification_priority_title" msgid="5256226572739882190">"Izingxoxo ezibalulekile"</string>
<string name="no_shortcut" msgid="8257177117568230126">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli izici zengxoxo"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Leli qembu lezaziso alikwazi ukulungiselelwa lapha"</string>
@@ -957,7 +953,7 @@
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> esebenzayo"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"Uhlelo lokusebenza luvulwe ngaphndle kokufakwa."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"Uhlelo lokusebenza luvulwe ngaphandle kokufakwa. Thepha ukuze ufunde kabanzi."</string>
- <string name="app_info" msgid="5153758994129963243">"Ulwazi lohlelo lokusebenza"</string>
+ <string name="app_info" msgid="5153758994129963243">"Ulwazi nge-app"</string>
<string name="go_to_web" msgid="636673528981366511">"Iya kusiphequluli"</string>
<string name="mobile_data" msgid="4564407557775397216">"Idatha yeselula"</string>
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
@@ -1011,10 +1007,10 @@
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string>
<string name="priority_onboarding_title" msgid="2893070698479227616">"Izingxoxo zisethwe kweziza kuqala"</string>
- <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Izingxoxo eziza kuqala zizo:"</string>
- <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kubonakala esigabeni esiphezulu sengxoxo"</string>
- <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kubonakala esithombeni sephrofayela esikrinini esikhiyiwe"</string>
- <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kubonakala njengebhamuza elintantayo phezu kwezinhlelo zokusebenza"</string>
+ <string name="priority_onboarding_behavior" msgid="636826237468953117">"Izingxoxo ezibalulekile"</string>
+ <string name="priority_onboarding_show_at_top_text" msgid="3861580571311518785">"Lezi zingxoxo ziboniswe phezulu ohlwini lwakho futhi zingafinyelela kuwe njalo lapho imodi Ebalulekile ivuliwe"</string>
+ <string name="priority_onboarding_show_avatar_text" msgid="1781653813573865071">"Izithombe zephrofayela ziboniswe esikrinini esikhiyiwe"</string>
+ <string name="priority_onboarding_appear_as_bubble_text" msgid="4359924720680083057">"Ungathola lezi zingxoxo kalula emabhamuzeni esikrinini sakho Sasekhaya"</string>
<string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Thikameza Ukungaphazamisi"</string>
<string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ngiyezwa"</string>
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Amasethingi"</string>
@@ -1032,6 +1028,12 @@
<string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Iswishi"</string>
<string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"Inkinobho yokufinyeleleka ishintshaniswe ngokuthinta kokufinyeleleka\n\n"<annotation id="link">"Buka amasethingi"</annotation></string>
<string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Hambisa inkinobho onqenqemeni ukuze uyifihle okwesikhashana"</string>
+ <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Hamba phezulu kwesokunxele"</string>
+ <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"Hamba phezulu ngakwesokudla"</string>
+ <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"Hamba phansi ngakwesokunxele"</string>
+ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Hamba phansi ngakwesokudla"</string>
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Hamba onqenqemeni ufihle"</string>
+ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Phuma onqenqemeni ubonise"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zezinsiza"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engeza izilawuli zedivayisi yakho exhunyiwe"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Setha izilawuli zezinsiza"</string>
@@ -1102,31 +1104,35 @@
<string name="basic_status" msgid="2315371112182658176">"Vula ingxoxo"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Amawijethi wengxoxo"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Thepha ingxoxo ukuyengeza Kusikrini sakho sasekhaya"</string>
- <!-- no translation found for no_conversations_text (7362374212649891057) -->
- <skip />
- <!-- no translation found for priority_conversations (3967482288896653039) -->
- <skip />
- <!-- no translation found for recent_conversations (8531874684782574622) -->
- <skip />
- <!-- no translation found for okay (6490552955618608554) -->
- <skip />
+ <string name="no_conversations_text" msgid="7362374212649891057">"Phinda uhlole futhi lapho uthola imilayezo ethile"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Izingxoxo ezibalulekile"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Izingxoxo zakamuva"</string>
+ <string name="okay" msgid="6490552955618608554">"Kulungile"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Ngaphansi kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ngaphezu kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
<string name="birthday_status" msgid="2596961629465396761">"Usuku lokuzalwa"</string>
+ <string name="birthday_status_content_description" msgid="7677415209545817153">"Usuku lokuzalwa luka-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="upcoming_birthday_status" msgid="2005452239256870351">"Usuku lokuzalwa maduze"</string>
+ <string name="upcoming_birthday_status_content_description" msgid="1210885672210845293">"Wusuku lokuzalwa luka-<xliff:g id="NAME">%1$s</xliff:g> maduze"</string>
<string name="anniversary_status" msgid="1790034157507590838">"Usuku olugujwa minyaka yonke"</string>
+ <string name="anniversary_status_content_description" msgid="6214503393960662875">"Wusuko lwesikhumbuzo luka-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="location_status" msgid="1294990572202541812">"Ukwabelana ngendawo"</string>
+ <string name="location_status_content_description" msgid="2982386178160071305">"U-<xliff:g id="NAME">%1$s</xliff:g> wabelana ngendawo"</string>
<string name="new_story_status" msgid="9012195158584846525">"Indaba entsha"</string>
+ <string name="new_story_status_content_description" msgid="4963137422622516708">"U-<xliff:g id="NAME">%1$s</xliff:g> wabelene ngendaba entsha"</string>
<string name="video_status" msgid="4548544654316843225">"Ababukele"</string>
<string name="audio_status" msgid="4237055636967709208">"Ilalele"</string>
<string name="game_status" msgid="1340694320630973259">"Iyadlala"</string>
<string name="empty_user_name" msgid="3389155775773578300">"Abangane"</string>
<string name="empty_status" msgid="5938893404951307749">"Asixoxe namuhla ebusuku!"</string>
+ <string name="status_before_loading" msgid="1500477307859631381">"Okuqukethwe kuzoboniswa maduze"</string>
<string name="missed_call" msgid="4228016077700161689">"Ikholi ephuthiwe"</string>
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Bona imiyalezo yakamuva, amakholi akuphuthile, nezibuyekezo zesimo"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Ingxoxo"</string>
+ <string name="new_notification_text_content_description" msgid="5574393603145263727">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele umlayezo"</string>
+ <string name="new_notification_image_content_description" msgid="6017506886810813123">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele isithombe"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kube khona inkinga ngokufunda imitha yakho yebhethri"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Thepha ukuze uthole olunye ulwazi"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Akukho alamu esethiwe"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index 886f98e..e4bdbf3 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -126,6 +126,8 @@
<attr name="wallpaperTextColorSecondary" format="reference|color" />
<attr name="wallpaperTextColorAccent" format="reference|color" />
<attr name="backgroundProtectedStyle" format="reference" />
+ <attr name="offStateColor" format="reference|color" />
+ <attr name="underSurfaceColor" format="reference|color" />
<declare-styleable name="SmartReplyView">
<attr name="spacing" format="dimension" />
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index bc7fcde..f699198 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -35,7 +35,6 @@
<color name="status_bar_clock_color">#FFFFFFFF</color>
<color name="qs_user_detail_icon_muted">#FFFFFFFF</color> <!-- not so muted after all -->
<color name="qs_tile_disabled_color">#9E9E9E</color> <!-- 38% black -->
- <color name="qs_customize_decoration">@color/GM2_grey_300</color>
<color name="qs_footer_action_border">#2E312C</color>
<!-- The color of the background in the separated list of the Global Actions menu -->
@@ -158,7 +157,7 @@
<color name="minimize_dock_shadow_end">#00000000</color>
<color name="default_remote_input_background">@*android:color/notification_default_color</color>
- <color name="notif_pill_background">@android:color/system_neutral2_100</color>
+ <color name="notif_pill_background">@*android:color/surface_light</color>
<color name="notif_pill_text">@android:color/system_neutral1_900</color>
<color name="remote_input_accent">?android:attr/colorAccent</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index e834f3f..a19d128 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -19,7 +19,7 @@
<!-- Recommended minimum clickable element dimension -->
<dimen name="min_clickable_item_size">48dp</dimen>
- <dimen name="remote_input_view_text_stroke">3dp</dimen>
+ <dimen name="remote_input_view_text_stroke">2dp</dimen>
<!-- Amount to offset bottom of notification peek window from top of status bar. -->
<dimen name="peek_window_y_offset">-12dp</dimen>
@@ -426,6 +426,11 @@
<!-- The padding between the notifications and the quick settings container -->
<dimen name="qs_notification_padding">@dimen/notification_side_paddings</dimen>
+ <!-- In split shade mode notifications should be aligned to QS header so the value should be
+ adjusted to qs header height and height of centered content inside of it:
+ (quick_qs_offset_height (60dp) - ongoing_appops_chip_height (24dp) ) / 2 -->
+ <dimen name="notifications_top_padding_split_shade">18dp</dimen>
+
<!-- Height of the status bar header bar when expanded -->
<dimen name="status_bar_header_height_expanded">124dp</dimen>
@@ -860,9 +865,12 @@
+ 8dp. -->
<dimen name="assist_orb_navbar_scrim_height">56dp</dimen>
- <!-- The width/height of the phone/camera icon view on keyguard. -->
- <dimen name="keyguard_affordance_height">56dp</dimen>
- <dimen name="keyguard_affordance_width">56dp</dimen>
+ <!-- The width/height of the keyguard bottom area icon view on keyguard. -->
+ <dimen name="keyguard_affordance_height">48dp</dimen>
+ <dimen name="keyguard_affordance_width">48dp</dimen>
+ <dimen name="keyguard_affordance_horizontal_offset">32dp</dimen>
+ <dimen name="keyguard_affordance_vertical_offset">32dp</dimen>
+
<!-- The width/height of the unlock icon view on keyguard. -->
<dimen name="keyguard_lock_height">42dp</dimen>
@@ -1086,8 +1094,9 @@
burn-in on AOD. -->
<dimen name="burn_in_prevention_offset_y_large_clock">42dp</dimen>
- <!-- Large clock maximum font size (dp is intentional, to prevent any further scaling) -->
+ <!-- Clock maximum font size (dp is intentional, to prevent any further scaling) -->
<dimen name="large_clock_text_size">150dp</dimen>
+ <dimen name="clock_text_size">86dp</dimen>
<!-- The maximum offset in either direction that icons move to prevent burn-in on AOD. -->
<dimen name="default_burn_in_prevention_offset">15dp</dimen>
@@ -1213,8 +1222,6 @@
<!-- Radius of Ongoing App Ops chip corners -->
<dimen name="ongoing_appops_chip_bg_corner_radius">16dp</dimen>
- <dimen name="ongoing_appops_dialog_bg_corner_radius">@dimen/notification_corner_radius</dimen>
-
<dimen name="ongoing_appops_dialog_side_margins">@dimen/notification_shade_content_margin_horizontal</dimen>
<dimen name="ongoing_appops_dialog_circle_size">32dp</dimen>
@@ -1232,6 +1239,7 @@
<dimen name="qs_media_padding">16dp</dimen>
<dimen name="qs_media_panel_outer_padding">16dp</dimen>
<dimen name="qs_media_album_size">120dp</dimen>
+ <dimen name="qs_media_album_radius">14dp</dimen>
<dimen name="qs_media_icon_size">16dp</dimen>
<dimen name="qs_center_guideline_padding">10dp</dimen>
<dimen name="qs_seamless_icon_size">@dimen/qs_media_icon_size</dimen>
@@ -1244,6 +1252,11 @@
<dimen name="qs_media_enabled_seekbar_vertical_padding">15dp</dimen>
<dimen name="qs_media_disabled_seekbar_vertical_padding">16dp</dimen>
+ <!-- Size of Smartspace media recommendations cards in the QSPanel carousel -->
+ <dimen name="qs_aa_media_rec_album_size">80dp</dimen>
+ <dimen name="qs_aa_media_rec_icon_size">20dp</dimen>
+
+
<!-- Window magnification -->
<dimen name="magnification_border_drag_size">35dp</dimen>
<dimen name="magnification_outer_border_margin">15dp</dimen>
@@ -1442,6 +1455,8 @@
<dimen name="wallet_empty_state_corner_radius">24dp</dimen>
<dimen name="wallet_tile_card_view_height">32dp</dimen>
<dimen name="wallet_tile_card_view_width">50dp</dimen>
+ <dimen name="wallet_button_horizontal_padding">24dp</dimen>
+ <dimen name="wallet_button_vertical_padding">8dp</dimen>
<!-- Ongoing call chip -->
<dimen name="ongoing_call_chip_side_padding">12dp</dimen>
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 834b482..bbf2048 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -50,4 +50,6 @@
<bool name="flag_charging_ripple">false</bool>
<bool name="flag_ongoing_call_status_bar_chip">true</bool>
+
+ <bool name="flag_smartspace">false</bool>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 269fdc5..4ae1c936 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -245,10 +245,14 @@
<string name="screenshot_dismiss_description">Dismiss screenshot</string>
<!-- Content description indicating that the view is a preview of the screenshot that was just taken [CHAR LIMIT=NONE] -->
<string name="screenshot_preview_description">Screenshot preview</string>
- <!-- Content description for the top boundary of the screenshot being cropped [CHAR LIMIT=NONE] -->
- <string name="screenshot_top_boundary">Top boundary</string>
- <!-- Content description for the bottom boundary of the screenshot being cropped [CHAR LIMIT=NONE] -->
- <string name="screenshot_bottom_boundary">Bottom boundary</string>
+ <!-- Content description for the top boundary of the screenshot being cropped, with the current position as a percentage. [CHAR LIMIT=NONE] -->
+ <string name="screenshot_top_boundary_pct">Top boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>
+ <!-- Content description for the bottom boundary of the screenshot being cropped, with the current position as a percentage. [CHAR LIMIT=NONE] -->
+ <string name="screenshot_bottom_boundary_pct">Bottom boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>
+ <!-- Content description for the left boundary of the screenshot being cropped, with the current position as a percentage. [CHAR LIMIT=NONE] -->
+ <string name="screenshot_left_boundary_pct">Left boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>
+ <!-- Content description for the right boundary of the screenshot being cropped, with the current position as a percentage. [CHAR LIMIT=NONE] -->
+ <string name="screenshot_right_boundary_pct">Right boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>
<!-- Notification title displayed for screen recording [CHAR LIMIT=50]-->
<string name="screenrecord_name">Screen Recorder</string>
@@ -1646,10 +1650,10 @@
<!-- Wallet strings -->
<!-- Wallet empty state, title [CHAR LIMIT=32] -->
<string name="wallet_title">Wallet</string>
- <!-- Label of the button underneath the card carousel when device is unlocked. [CHAR LIMIT=NONE] -->
- <string name="wallet_button_label_device_unlocked">Show all</string>
- <!-- Label of the button underneath the card carousel when device is locked. [CHAR LIMIT=NONE] -->
- <string name="wallet_button_label_device_locked">Unlock to pay</string>
+ <!-- Label of the button at the bottom prompting user enter wallet app. [CHAR LIMIT=NONE] -->
+ <string name="wallet_app_button_label">Show all</string>
+ <!-- Label of the button underneath the card carousel prompting user unlock device. [CHAR LIMIT=NONE] -->
+ <string name="wallet_action_button_label_unlock">Unlock to pay</string>
<!-- Secondary label of the quick access wallet tile if active. [CHAR LIMIT=32] -->
<string name="wallet_secondary_label_active">Ready</string>
<!-- Secondary label of the quick access wallet tile if no card. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index ba07829..ce8c0c2 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -382,6 +382,17 @@
<item name="android:colorError">@*android:color/error_color_material_dark</item>
<item name="android:windowIsFloating">true</item>
<item name="android:homeAsUpIndicator">@drawable/ic_arrow_back</item>
+ <item name="offStateColor">@android:color/system_neutral1_800</item>
+ <item name="underSurfaceColor">@android:color/system_neutral1_1000</item>
+ <item name="android:colorBackground">@android:color/system_neutral1_900</item>
+ </style>
+
+ <style name="Theme.SystemUI.QuickSettings.BrightnessDialog" parent="@android:style/Theme.DeviceDefault.Dialog">
+ <item name="android:dialogCornerRadius">8dp</item>
+ </style>
+
+ <style name="Theme.SystemUI.QuickSettings.Dialog" parent="@android:style/Theme.DeviceDefault.Dialog">
+ <item name="android:dialogCornerRadius">@dimen/notification_corner_radius</item>
</style>
<!-- Overridden by values-television/styles.xml with tv-specific settings -->
@@ -588,10 +599,6 @@
<item name="android:elevation">10dp</item>
</style>
- <style name="Theme.SystemUI.QuickSettings.Edit">
- <item name="android:colorBackground">?android:attr/colorSecondary</item>
- </style>
-
<style name="MediaPlayer.Button" parent="@android:style/Widget.Material.Button.Borderless.Small">
<item name="android:background">@drawable/qs_media_light_source</item>
<item name="android:tint">?android:attr/textColorPrimary</item>
@@ -628,7 +635,12 @@
</style>
<!-- Privacy dialog -->
- <style name="PrivacyDialog" parent="ScreenRecord">
+ <style name="PrivacyDialog" parent="Theme.SystemUI.QuickSettings.Dialog">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:backgroundDimEnabled">true</item>
+ <item name="android:windowCloseOnTouchOutside">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
</style>
diff --git a/packages/SystemUI/res/xml/media_recommendation.xml b/packages/SystemUI/res/xml/media_recommendation.xml
new file mode 100644
index 0000000..a1bd231
--- /dev/null
+++ b/packages/SystemUI/res/xml/media_recommendation.xml
@@ -0,0 +1,97 @@
+<?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
+ -->
+<ConstraintSet
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <Constraint
+ android:id="@+id/media_cover1"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@id/media_cover2"
+ app:layout_constraintHorizontal_weight="1"
+ android:visibility="gone"/>
+
+ <Constraint
+ android:id="@+id/media_logo1"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size"
+ app:layout_constraintEnd_toEndOf="@+id/media_cover1"
+ app:layout_constraintBottom_toBottomOf="@+id/media_cover1"
+ android:visibility="gone" />
+
+ <Constraint
+ android:id="@+id/media_cover2"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/media_cover1"
+ app:layout_constraintEnd_toStartOf="@id/media_cover3"
+ app:layout_constraintHorizontal_weight="1"
+ android:visibility="gone"/>
+
+ <Constraint
+ android:id="@+id/media_logo2"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size"
+ app:layout_constraintEnd_toEndOf="@+id/media_cover2"
+ app:layout_constraintBottom_toBottomOf="@+id/media_cover2"
+ android:visibility="gone" />
+
+ <Constraint
+ android:id="@+id/media_cover3"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/media_cover2"
+ app:layout_constraintEnd_toStartOf="@id/media_cover4"
+ app:layout_constraintHorizontal_weight="1"
+ android:visibility="gone"/>
+
+ <Constraint
+ android:id="@+id/media_logo3"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size"
+ app:layout_constraintEnd_toEndOf="@+id/media_cover3"
+ app:layout_constraintBottom_toBottomOf="@+id/media_cover3"
+ android:visibility="gone" />
+
+ <Constraint
+ android:id="@+id/media_cover4"
+ android:layout_width="@dimen/qs_aa_media_rec_album_size"
+ android:layout_height="@dimen/qs_aa_media_rec_album_size"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/media_cover3"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_weight="1"
+ android:visibility="gone"/>
+
+ <Constraint
+ android:id="@+id/media_logo4"
+ android:layout_width="@dimen/qs_aa_media_rec_icon_size"
+ android:layout_height="@dimen/qs_aa_media_rec_icon_size"
+ app:layout_constraintEnd_toEndOf="@+id/media_cover4"
+ app:layout_constraintBottom_toBottomOf="@+id/media_cover4"
+ android:visibility="gone" />
+
+</ConstraintSet>
diff --git a/packages/SystemUI/res/xml/people_space_widget_info.xml b/packages/SystemUI/res/xml/people_space_widget_info.xml
index b2bf6da..e386147 100644
--- a/packages/SystemUI/res/xml/people_space_widget_info.xml
+++ b/packages/SystemUI/res/xml/people_space_widget_info.xml
@@ -15,12 +15,13 @@
-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="120dp"
- android:minHeight="50dp"
+ android:minWidth="136dp"
+ android:minHeight="55dp"
android:minResizeWidth="60dp"
android:minResizeHeight="50dp"
android:maxResizeHeight="207dp"
android:updatePeriodMillis="60000"
+ android:widgetFeatures="reconfigurable"
android:description="@string/people_tile_description"
android:previewLayout="@layout/people_space_placeholder_layout"
android:resizeMode="horizontal|vertical"
diff --git a/packages/SystemUI/shared/lint-baseline.xml b/packages/SystemUI/shared/lint-baseline.xml
new file mode 100644
index 0000000..ec9d8fd
--- /dev/null
+++ b/packages/SystemUI/shared/lint-baseline.xml
@@ -0,0 +1,675 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.os.RemoteException#rethrowFromSystemServer`"
+ errorLine1=" throw e.rethrowFromSystemServer();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java"
+ line="90"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.Bitmap#getHardwareBuffer`"
+ errorLine1=" mBuffer != null ? mBuffer.getHardwareBuffer() : null, mRect);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/AppTransitionAnimationSpecCompat.java"
+ line="39"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `new android.graphics.ParcelableColorSpace`"
+ errorLine1=" ? new ParcelableColorSpace(ColorSpace.get(ColorSpace.Named.SRGB))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="57"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `new android.graphics.ParcelableColorSpace`"
+ errorLine1=" : new ParcelableColorSpace(bitmap.getColorSpace());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="58"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.Bitmap#getHardwareBuffer`"
+ errorLine1=" bundle.putParcelable(KEY_BUFFER, bitmap.getHardwareBuffer());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="61"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `ParcelableColorSpace` to `Parcelable` requires API level 31 (current min is 26)"
+ errorLine1=" bundle.putParcelable(KEY_COLOR_SPACE, colorSpace);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="62"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.graphics.Bitmap#wrapHardwareBuffer`"
+ errorLine1=" return Bitmap.wrapHardwareBuffer(Objects.requireNonNull(buffer),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="84"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.graphics.ParcelableColorSpace#getColorSpace`"
+ errorLine1=" colorSpace.getColorSpace());"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java"
+ line="85"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java"
+ line="122"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.util.ArraySet`"
+ errorLine1=" mPluginActions = new ArraySet<>(mSharedPrefs.getStringSet(PLUGIN_ACTIONS, null));"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginPrefs.java"
+ line="41"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.util.ArraySet`"
+ errorLine1=" return new ArraySet<>(mPluginActions);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginPrefs.java"
+ line="45"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 28 (current min is 26): `android.graphics.Bitmap#createBitmap`"
+ errorLine1=" return Bitmap.createBitmap(picture);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/RecentsTransition.java"
+ line="113"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Builder`"
+ errorLine1=" mSurface = new SurfaceControl.Builder()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="116"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
+ errorLine1=" .setName("Transition Unrotate")"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="117"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
+ errorLine1=" .setParent(parent)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="119"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
+ errorLine1=" .build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="120"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(child, mSurface);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="137"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="143"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
+ errorLine1=" t.reparent(mRotateChildren.get(i), rootLeash);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="145"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="148"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(counterLauncher.mSurface, launcherLayer);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="200"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(counterLauncher.mSurface, info.getChanges().size() * 3);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="206"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(leash, info.getChanges().size() * 3 - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="216"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(wallpapersCompat[i].leash.getSurfaceControl(), 1.f);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="223"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(counterWallpaper.mSurface, -1);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="233"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java"
+ line="238"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" taskId = change.getTaskInfo() != null ? change.getTaskInfo().taskId : -1;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java"
+ line="101"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#isRunning`"
+ errorLine1=" isNotInRecents = !change.getTaskInfo().isRunning;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java"
+ line="116"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#release`"
+ errorLine1=" leash.mSurfaceControl.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java"
+ line="159"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#release`"
+ errorLine1=" mStartLeash.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java"
+ line="161"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(change.getLeash(), info.getChanges().size() * 3 - i);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java"
+ line="97"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(wallpapers[i].leash.mSurfaceControl, 1);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java"
+ line="105"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java"
+ line="107"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
+ errorLine1=" return mSurfaceControl != null && mSurfaceControl.isValid();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceControlCompat.java"
+ line="41"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
+ errorLine1=" mSurfaceControlViewHost.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java"
+ line="61"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level R (current min is 26): `android.view.SurfaceView#getHostToken`"
+ errorLine1=" bundle.putBinder(KEY_HOST_TOKEN, surfaceView.getHostToken());"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java"
+ line="34"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
+ errorLine1=" bundle.putParcelable(KEY_SURFACE_CONTROL, surfaceView.getSurfaceControl());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java"
+ line="35"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Cast from `SurfaceControl` to `Parcelable` requires API level 29 (current min is 26)"
+ errorLine1=" bundle.putParcelable(KEY_SURFACE_CONTROL, surfaceView.getSurfaceControl());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java"
+ line="35"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
+ errorLine1=" if (mBarrierSurfaceControl == null || !mBarrierSurfaceControl.isValid()) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java"
+ line="107"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" Transaction t = new Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java"
+ line="113"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java"
+ line="122"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" t.setAlpha(surface, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java"
+ line="361"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" t.setLayer(surface, layer);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java"
+ line="364"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#origActivity`"
+ errorLine1=" ComponentName sourceComponent = t.origActivity != null"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="73"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#origActivity`"
+ errorLine1=" ? t.origActivity"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="75"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
+ errorLine1=" this.id = t.taskId;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="78"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#baseIntent`"
+ errorLine1=" this.baseIntent = t.baseIntent;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="80"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskDescription`"
+ errorLine1=" ActivityManager.TaskDescription td = taskInfo.taskDescription;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="242"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" taskInfo.supportsSplitScreenMultiWindow, isLocked, td, taskInfo.topActivity);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java"
+ line="246"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
+ errorLine1=" return info.topActivity;"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java"
+ line="49"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskDescription`"
+ errorLine1=" return info.taskDescription;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java"
+ line="53"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
+ errorLine1=" onTaskMovedToFront(taskInfo.taskId);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java"
+ line="70"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.graphics.Bitmap#wrapHardwareBuffer`"
+ errorLine1=" thumbnail = Bitmap.wrapHardwareBuffer(buffer, snapshot.getColorSpace());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java"
+ line="69"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 26): `android.app.WallpaperColors#getColorHints`"
+ errorLine1=" (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TonalCompat.java"
+ line="42"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
+ errorLine1=" mTransaction = new Transaction();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java"
+ line="31"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" mTransaction.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java"
+ line="35"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setBufferSize`"
+ errorLine1=" mTransaction.setBufferSize(surfaceControl.mSurfaceControl, w, h);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java"
+ line="54"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
+ errorLine1=" mTransaction.setLayer(surfaceControl.mSurfaceControl, z);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java"
+ line="59"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
+ errorLine1=" mTransaction.setAlpha(surfaceControl.mSurfaceControl, alpha);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java"
+ line="64"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
+ errorLine1=" t.apply();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java"
+ line="64"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
+ errorLine1=" .getFloat(Resources.getSystem().getIdentifier("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperManagerCompat.java"
+ line="46"
+ column="18"/>
+ </issue>
+
+</issues>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index 4f3f86a..26ef145 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -42,6 +42,8 @@
import com.android.internal.util.DataClass;
import com.android.systemui.shared.recents.model.ThumbnailData;
+import java.util.concurrent.Executor;
+
/**
* Wrapper to expose RemoteTransition (shell transitions) to Launcher.
*
@@ -59,7 +61,8 @@
mTransition = transition;
}
- public RemoteTransitionCompat(RemoteTransitionRunner runner) {
+ public RemoteTransitionCompat(@NonNull RemoteTransitionRunner runner,
+ @NonNull Executor executor) {
mTransition = new IRemoteTransition.Stub() {
@Override
public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
@@ -71,7 +74,7 @@
Log.e(TAG, "Failed to call transition finished callback", e);
}
};
- runner.startAnimation(info, t, finishAdapter);
+ executor.execute(() -> runner.startAnimation(info, t, finishAdapter));
}
};
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
index fa2f32f..dc42a53 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
@@ -92,23 +92,11 @@
return this;
}
- public TransactionCompat deferTransactionUntil(SurfaceControlCompat surfaceControl,
- SurfaceControl barrier, long frameNumber) {
- mTransaction.deferTransactionUntil(surfaceControl.mSurfaceControl, barrier,
- frameNumber);
- return this;
- }
-
public TransactionCompat setColor(SurfaceControlCompat surfaceControl, float[] color) {
mTransaction.setColor(surfaceControl.mSurfaceControl, color);
return this;
}
- public static void deferTransactionUntil(Transaction t, SurfaceControl surfaceControl,
- SurfaceControl barrier, long frameNumber) {
- t.deferTransactionUntil(surfaceControl, barrier, frameNumber);
- }
-
public static void setRelativeLayer(Transaction t, SurfaceControl surfaceControl,
SurfaceControl relativeTo, int z) {
t.setRelativeLayer(surfaceControl, relativeTo, z);
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index ab219f3..60b677a 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -27,6 +27,7 @@
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.ViewController;
import java.util.Locale;
@@ -45,6 +46,7 @@
private int mLockScreenColor;
private boolean mIsDozing;
+ private boolean mIsCharging;
private float mDozeAmount;
private Locale mLocale;
@@ -56,7 +58,8 @@
public AnimatableClockController(
AnimatableClockView view,
StatusBarStateController statusBarStateController,
- BroadcastDispatcher broadcastDispatcher) {
+ BroadcastDispatcher broadcastDispatcher,
+ BatteryController batteryController) {
super(view);
mStatusBarStateController = statusBarStateController;
mIsDozing = mStatusBarStateController.isDozing();
@@ -68,6 +71,16 @@
R.dimen.keyguard_clock_line_spacing_scale_burmese);
mDefaultLineSpacing = getContext().getResources().getFloat(
R.dimen.keyguard_clock_line_spacing_scale);
+
+ batteryController.addCallback(new BatteryController.BatteryStateChangeCallback() {
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+ if (!mIsCharging && charging) {
+ mView.animateCharge(mIsDozing);
+ }
+ mIsCharging = charging;
+ }
+ });
}
private BroadcastReceiver mLocaleBroadcastReceiver = new BroadcastReceiver() {
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
index c918d98..0d6f64f 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
@@ -42,7 +42,9 @@
private static final CharSequence DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm";
private static final CharSequence SINGLE_LINE_FORMAT_12_HOUR = "h:mm";
private static final CharSequence SINGLE_LINE_FORMAT_24_HOUR = "H:mm";
- private static final long ANIM_DURATION = 300;
+ private static final long DOZE_ANIM_DURATION = 300;
+ private static final long CHARGE_ANIM_DURATION_PHASE_0 = 500;
+ private static final long CHARGE_ANIM_DURATION_PHASE_1 = 1000;
private final Calendar mTime = Calendar.getInstance();
@@ -53,6 +55,7 @@
private int mDozingColor;
private int mLockScreenColor;
private float mLineSpacingScale = 1f;
+ private int mChargeAnimationDelay = 0;
private TextAnimator mTextAnimator = null;
private Runnable mOnTextAnimatorInitialized;
@@ -79,6 +82,8 @@
try {
mDozingWeight = ta.getInt(R.styleable.AnimatableClockView_dozeWeight, 100);
mLockScreenWeight = ta.getInt(R.styleable.AnimatableClockView_lockScreenWeight, 300);
+ mChargeAnimationDelay = ta.getInt(
+ R.styleable.AnimatableClockView_chargeAnimationDelay, 200);
} finally {
ta.recycle();
}
@@ -150,11 +155,36 @@
mLockScreenColor = lockScreenColor;
}
+ void animateCharge(boolean isDozing) {
+ if (mTextAnimator == null || mTextAnimator.isRunning()) {
+ // Skip charge animation if dozing animation is already playing.
+ return;
+ }
+ Runnable startAnimPhase2 = () -> setTextStyle(
+ isDozing ? mDozingWeight : mLockScreenWeight/* weight */,
+ -1,
+ null,
+ true /* animate */,
+ CHARGE_ANIM_DURATION_PHASE_1,
+ 0 /* delay */,
+ null /* onAnimationEnd */);
+ setTextStyle(isDozing ? mLockScreenWeight : mDozingWeight/* weight */,
+ -1,
+ null,
+ true /* animate */,
+ CHARGE_ANIM_DURATION_PHASE_0,
+ mChargeAnimationDelay,
+ startAnimPhase2);
+ }
+
void animateDoze(boolean isDozing, boolean animate) {
setTextStyle(isDozing ? mDozingWeight : mLockScreenWeight /* weight */,
-1,
isDozing ? mDozingColor : mLockScreenColor,
- animate);
+ animate,
+ DOZE_ANIM_DURATION,
+ 0 /* delay */,
+ null /* onAnimationEnd */);
}
/**
@@ -170,15 +200,20 @@
private void setTextStyle(
@IntRange(from = 0, to = 1000) int weight,
@FloatRange(from = 0) float textSize,
- int color,
- boolean animate) {
+ Integer color,
+ boolean animate,
+ long duration,
+ long delay,
+ Runnable onAnimationEnd) {
if (mTextAnimator != null) {
- mTextAnimator.setTextStyle(weight, textSize, color, animate, ANIM_DURATION, null);
+ mTextAnimator.setTextStyle(weight, textSize, color, animate, duration, null,
+ delay, onAnimationEnd);
} else {
// when the text animator is set, update its start values
mOnTextAnimatorInitialized =
() -> mTextAnimator.setTextStyle(
- weight, textSize, color, false, ANIM_DURATION, null);
+ weight, textSize, color, false, duration, null,
+ delay, onAnimationEnd);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 13a84fb..407146f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -4,35 +4,21 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Paint.Style;
-import android.os.Build;
-import android.transition.Fade;
-import android.transition.Transition;
-import android.transition.TransitionListenerAdapter;
-import android.transition.TransitionManager;
-import android.transition.TransitionSet;
-import android.transition.TransitionValues;
import android.util.AttributeSet;
-import android.util.Log;
-import android.util.MathUtils;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
-import android.widget.TextClock;
-import android.widget.TextView;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.dagger.KeyguardStatusViewScope;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.ClockPlugin;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -47,53 +33,21 @@
private static final String TAG = "KeyguardClockSwitch";
- /**
- * Animation fraction when text is transitioned to/from bold.
- */
- private static final float TO_BOLD_TRANSITION_FRACTION = 0.7f;
-
private static final long CLOCK_OUT_MILLIS = 150;
private static final long CLOCK_IN_MILLIS = 200;
/**
- * Layout transition that scales the default clock face.
- */
- private final Transition mTransition;
-
- private final ClockVisibilityTransition mClockTransition;
- private final ClockVisibilityTransition mBoldClockTransition;
-
- /**
* Optional/alternative clock injected via plugin.
*/
private ClockPlugin mClockPlugin;
/**
- * Default clock.
+ * Frame for small/large clocks
*/
- private TextClock mClockView;
-
- /**
- * Default clock, bold version.
- * Used to transition to bold when shrinking the default clock.
- */
- private TextClock mClockViewBold;
-
- /**
- * Frame for clock when mode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL.
- */
- private FrameLayout mNewLockscreenClockFrame;
- private FrameLayout mNewLockscreenLargeClockFrame;
-
- /**
- * Frame for default and custom clock.
- */
- private FrameLayout mSmallClockFrame;
-
- /**
- * Container for big custom clock.
- */
- private ViewGroup mBigClockContainer;
+ private FrameLayout mClockFrame;
+ private FrameLayout mLargeClockFrame;
+ private AnimatableClockView mClockView;
+ private AnimatableClockView mLargeClockView;
/**
* Status area (date and other stuff) shown below the clock. Plugin can decide whether or not to
@@ -117,40 +71,23 @@
/**
* If the Keyguard Slice has a header (big center-aligned text.)
*/
- private boolean mShowingHeader;
private boolean mSupportsDarkText;
private int[] mColorPalette;
- private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
private int mClockSwitchYAmount;
public KeyguardClockSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
-
- mClockTransition = new ClockVisibilityTransition().setCutoff(
- 1 - TO_BOLD_TRANSITION_FRACTION);
- mClockTransition.addTarget(R.id.default_clock_view);
- mBoldClockTransition = new ClockVisibilityTransition().setCutoff(
- TO_BOLD_TRANSITION_FRACTION);
- mBoldClockTransition.addTarget(R.id.default_clock_view_bold);
- mTransition = new TransitionSet()
- .setOrdering(TransitionSet.ORDERING_TOGETHER)
- .addTransition(mClockTransition)
- .addTransition(mBoldClockTransition)
- .setDuration(KeyguardSliceView.DEFAULT_ANIM_DURATION / 2)
- .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
}
/**
* Apply dp changes on font/scale change
*/
public void onDensityOrFontScaleChanged() {
- setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.getResources()
- .getDimensionPixelSize(R.dimen.widget_big_font_size));
-
- ((TextView) mNewLockscreenLargeClockFrame.getChildAt(0))
- .setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.getResources()
- .getDimensionPixelSize(R.dimen.large_clock_text_size));
+ mLargeClockView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.getResources()
+ .getDimensionPixelSize(R.dimen.large_clock_text_size));
+ mClockView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.getResources()
+ .getDimensionPixelSize(R.dimen.clock_text_size));
mClockSwitchYAmount = mContext.getResources().getDimensionPixelSize(
R.dimen.keyguard_clock_switch_y_shift);
@@ -163,44 +100,14 @@
return mClockPlugin != null;
}
- /**
- * Update lock screen mode for testing different layouts
- */
- public void updateLockScreenMode(int mode) {
- mLockScreenMode = mode;
- RelativeLayout.LayoutParams statusAreaLP = (RelativeLayout.LayoutParams)
- mKeyguardStatusArea.getLayoutParams();
-
- if (mode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
- final int startEndPadding = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP,
- 32,
- getResources().getDisplayMetrics());
- setPaddingRelative(startEndPadding, 0, startEndPadding, 0);
- mSmallClockFrame.setVisibility(GONE);
- mNewLockscreenClockFrame.setVisibility(VISIBLE);
- statusAreaLP.addRule(RelativeLayout.BELOW, R.id.new_lockscreen_clock_view);
- statusAreaLP.addRule(RelativeLayout.ALIGN_PARENT_START);
- } else {
- setPaddingRelative(0, 0, 0, 0);
- mSmallClockFrame.setVisibility(VISIBLE);
- mNewLockscreenClockFrame.setVisibility(GONE);
-
- statusAreaLP.removeRule(RelativeLayout.ALIGN_PARENT_START);
- statusAreaLP.addRule(RelativeLayout.BELOW, R.id.clock_view);
- }
-
- requestLayout();
- }
-
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mClockView = findViewById(R.id.default_clock_view);
- mClockViewBold = findViewById(R.id.default_clock_view_bold);
- mNewLockscreenClockFrame = findViewById(R.id.new_lockscreen_clock_view);
- mNewLockscreenLargeClockFrame = findViewById(R.id.new_lockscreen_clock_view_large);
- mSmallClockFrame = findViewById(R.id.clock_view);
+
+ mClockFrame = findViewById(R.id.lockscreen_clock_view);
+ mClockView = findViewById(R.id.animatable_clock_view);
+ mLargeClockFrame = findViewById(R.id.lockscreen_clock_view_large);
+ mLargeClockView = findViewById(R.id.animatable_clock_view_large);
mKeyguardStatusArea = findViewById(R.id.keyguard_status_area);
onDensityOrFontScaleChanged();
@@ -210,45 +117,35 @@
// Disconnect from existing plugin.
if (mClockPlugin != null) {
View smallClockView = mClockPlugin.getView();
- if (smallClockView != null && smallClockView.getParent() == mSmallClockFrame) {
- mSmallClockFrame.removeView(smallClockView);
+ if (smallClockView != null && smallClockView.getParent() == mClockFrame) {
+ mClockFrame.removeView(smallClockView);
}
- if (mBigClockContainer != null) {
- mBigClockContainer.removeAllViews();
- updateBigClockVisibility(statusBarState);
+ View bigClockView = mClockPlugin.getBigClockView();
+ if (bigClockView != null && bigClockView.getParent() == mLargeClockFrame) {
+ mLargeClockFrame.removeView(bigClockView);
}
mClockPlugin.onDestroyView();
mClockPlugin = null;
}
if (plugin == null) {
- if (mShowingHeader) {
- mClockView.setVisibility(View.GONE);
- mClockViewBold.setVisibility(View.VISIBLE);
- } else {
- mClockView.setVisibility(View.VISIBLE);
- mClockViewBold.setVisibility(View.INVISIBLE);
- }
- mKeyguardStatusArea.setVisibility(View.VISIBLE);
+ mClockView.setVisibility(View.VISIBLE);
+ mLargeClockView.setVisibility(View.VISIBLE);
return;
}
// Attach small and big clock views to hierarchy.
View smallClockView = plugin.getView();
if (smallClockView != null) {
- mSmallClockFrame.addView(smallClockView, -1,
+ mClockFrame.addView(smallClockView, -1,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mClockView.setVisibility(View.GONE);
- mClockViewBold.setVisibility(View.GONE);
}
View bigClockView = plugin.getBigClockView();
- if (bigClockView != null && mBigClockContainer != null) {
- mBigClockContainer.addView(bigClockView);
- updateBigClockVisibility(statusBarState);
+ if (bigClockView != null) {
+ mLargeClockFrame.addView(bigClockView);
+ mLargeClockView.setVisibility(View.GONE);
}
- // Hide default clock.
- if (!plugin.shouldShowStatusArea()) {
- mKeyguardStatusArea.setVisibility(View.GONE);
- }
+
// Initialize plugin parameters.
mClockPlugin = plugin;
mClockPlugin.setStyle(getPaint().getStyle());
@@ -259,31 +156,10 @@
}
}
- float getClockTextTopPadding() {
- Paint.FontMetrics fm = mClockView.getPaint().getFontMetrics();
- return fm.ascent - fm.top;
- }
-
- /**
- * Set container for big clock face appearing behind NSSL and KeyguardStatusView.
- */
- public void setBigClockContainer(ViewGroup container, int statusBarState) {
- if (mClockPlugin != null && container != null) {
- View bigClockView = mClockPlugin.getBigClockView();
- if (bigClockView != null) {
- container.addView(bigClockView);
- }
- }
- mBigClockContainer = container;
- updateBigClockVisibility(statusBarState);
- }
-
/**
* It will also update plugin setStyle if plugin is connected.
*/
public void setStyle(Style style) {
- mClockView.getPaint().setStyle(style);
- mClockViewBold.getPaint().setStyle(style);
if (mClockPlugin != null) {
mClockPlugin.setStyle(style);
}
@@ -293,48 +169,25 @@
* It will also update plugin setTextColor if plugin is connected.
*/
public void setTextColor(int color) {
- mClockView.setTextColor(color);
- mClockViewBold.setTextColor(color);
if (mClockPlugin != null) {
mClockPlugin.setTextColor(color);
}
}
- public void setShowCurrentUserTime(boolean showCurrentUserTime) {
- mClockView.setShowCurrentUserTime(showCurrentUserTime);
- mClockViewBold.setShowCurrentUserTime(showCurrentUserTime);
- }
-
- public void setTextSize(int unit, float size) {
- mClockView.setTextSize(unit, size);
- }
-
- public void setFormat12Hour(CharSequence format) {
- mClockView.setFormat12Hour(format);
- mClockViewBold.setFormat12Hour(format);
- }
-
- public void setFormat24Hour(CharSequence format) {
- mClockView.setFormat24Hour(format);
- mClockViewBold.setFormat24Hour(format);
- }
-
private void animateClockChange(boolean useLargeClock) {
- if (mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) return;
-
if (mClockInAnim != null) mClockInAnim.cancel();
if (mClockOutAnim != null) mClockOutAnim.cancel();
View in, out;
int direction = 1;
if (useLargeClock) {
- out = mNewLockscreenClockFrame;
- in = mNewLockscreenLargeClockFrame;
+ out = mClockFrame;
+ in = mLargeClockFrame;
if (indexOfChild(in) == -1) addView(in);
direction = -1;
} else {
- in = mNewLockscreenClockFrame;
- out = mNewLockscreenLargeClockFrame;
+ in = mClockFrame;
+ out = mLargeClockFrame;
// Must remove in order for notifications to appear in the proper place
removeView(out);
@@ -381,7 +234,6 @@
if (mClockPlugin != null) {
mClockPlugin.setDarkAmount(darkAmount);
}
- updateBigClockAlpha();
}
/**
@@ -394,13 +246,6 @@
animateClockChange(!hasVisibleNotifications);
mHasVisibleNotifications = hasVisibleNotifications;
- if (mDarkAmount == 0f && mBigClockContainer != null) {
- // Starting a fade transition since the visibility of the big clock will change.
- TransitionManager.beginDelayedTransition(mBigClockContainer,
- new Fade().setDuration(KeyguardSliceView.DEFAULT_ANIM_DURATION / 2).addTarget(
- mBigClockContainer));
- }
- updateBigClockAlpha();
}
public Paint getPaint() {
@@ -433,15 +278,9 @@
* Refresh the time of the clock, due to either time tick broadcast or doze time tick alarm.
*/
public void refresh() {
- mClockView.refreshTime();
- mClockViewBold.refreshTime();
if (mClockPlugin != null) {
mClockPlugin.onTimeTick();
}
- if (Build.IS_DEBUGGABLE) {
- // Log for debugging b/130888082 (sysui waking up, but clock not updating)
- Log.d(TAG, "Updating clock: " + mClockView.getText());
- }
}
/**
@@ -472,240 +311,14 @@
}
}
- void updateBigClockVisibility(int statusBarState) {
- if (mBigClockContainer == null) {
- return;
- }
- final boolean inDisplayState = statusBarState == StatusBarState.KEYGUARD
- || statusBarState == StatusBarState.SHADE_LOCKED;
- final int visibility = !mShowingHeader && inDisplayState
- && mBigClockContainer.getChildCount() != 0 ? View.VISIBLE : View.GONE;
- if (mBigClockContainer.getVisibility() != visibility) {
- mBigClockContainer.setVisibility(visibility);
- }
- }
-
- private void updateBigClockAlpha() {
- if (mBigClockContainer != null) {
- final float alpha = mHasVisibleNotifications ? mDarkAmount : 1f;
- mBigClockContainer.setAlpha(alpha);
- if (alpha == 0f) {
- mBigClockContainer.setVisibility(INVISIBLE);
- } else if (mBigClockContainer.getVisibility() == INVISIBLE) {
- mBigClockContainer.setVisibility(VISIBLE);
- }
- }
- }
-
- /**
- * Sets if the keyguard slice is showing a center-aligned header. We need a smaller clock in
- * these cases.
- */
- void setKeyguardShowingHeader(boolean hasHeader) {
- if (mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL) {
- hasHeader = false;
- }
-
- if (mShowingHeader == hasHeader) {
- return;
- }
- mShowingHeader = hasHeader;
- if (hasCustomClock()) {
- return;
- }
-
- float smallFontSize = mContext.getResources().getDimensionPixelSize(
- R.dimen.widget_small_font_size);
- float bigFontSize = mContext.getResources().getDimensionPixelSize(
- R.dimen.widget_big_font_size);
- mClockTransition.setScale(smallFontSize / bigFontSize);
- mBoldClockTransition.setScale(bigFontSize / smallFontSize);
-
- // End any current transitions before starting a new transition so that the new transition
- // starts from a good state instead of a potentially bad intermediate state arrived at
- // during a transition animation.
- TransitionManager.endTransitions((ViewGroup) mClockView.getParent());
-
- if (hasHeader) {
- // After the transition, make the default clock GONE so that it doesn't make the
- // KeyguardStatusView appear taller in KeyguardClockPositionAlgorithm and elsewhere.
- mTransition.addListener(new TransitionListenerAdapter() {
- @Override
- public void onTransitionEnd(Transition transition) {
- super.onTransitionEnd(transition);
- // Check that header is actually showing. I saw issues where this event was
- // fired after the big clock transitioned back to visible, which causes the time
- // to completely disappear.
- if (mShowingHeader) {
- mClockView.setVisibility(View.GONE);
- }
- transition.removeListener(this);
- }
- });
- }
-
- TransitionManager.beginDelayedTransition((ViewGroup) mClockView.getParent(), mTransition);
- mClockView.setVisibility(hasHeader ? View.INVISIBLE : View.VISIBLE);
- mClockViewBold.setVisibility(hasHeader ? View.VISIBLE : View.INVISIBLE);
- int paddingBottom = mContext.getResources().getDimensionPixelSize(hasHeader
- ? R.dimen.widget_vertical_padding_clock : R.dimen.title_clock_padding);
- mClockView.setPadding(mClockView.getPaddingLeft(), mClockView.getPaddingTop(),
- mClockView.getPaddingRight(), paddingBottom);
- mClockViewBold.setPadding(mClockViewBold.getPaddingLeft(), mClockViewBold.getPaddingTop(),
- mClockViewBold.getPaddingRight(), paddingBottom);
- }
-
- /**
- * Hide big clock if the keyguard slice is showing a header, need to reduce visual clutter in
- * these cases.
- */
- public void setKeyguardHidingBigClock(boolean hasHeader) {
- if (mBigClockContainer != null) {
- mBigClockContainer.setVisibility(hasHeader ? View.GONE : View.VISIBLE);
- }
- }
-
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardClockSwitch:");
pw.println(" mClockPlugin: " + mClockPlugin);
- pw.println(" mClockView: " + mClockView);
- pw.println(" mClockViewBold: " + mClockViewBold);
- pw.println(" mSmallClockFrame: " + mSmallClockFrame);
- pw.println(" mBigClockContainer: " + mBigClockContainer);
+ pw.println(" mClockFrame: " + mClockFrame);
+ pw.println(" mLargeClockFrame: " + mLargeClockFrame);
pw.println(" mKeyguardStatusArea: " + mKeyguardStatusArea);
pw.println(" mDarkAmount: " + mDarkAmount);
- pw.println(" mShowingHeader: " + mShowingHeader);
pw.println(" mSupportsDarkText: " + mSupportsDarkText);
pw.println(" mColorPalette: " + Arrays.toString(mColorPalette));
}
-
- /**
- * {@link Visibility} transformation that scales the view while it is disappearing/appearing and
- * transitions suddenly at a cutoff fraction during the animation.
- */
- private class ClockVisibilityTransition extends android.transition.Visibility {
-
- private static final String PROPNAME_VISIBILITY = "systemui:keyguard:visibility";
-
- private float mCutoff;
- private float mScale;
-
- /**
- * Constructs a transition that switches between visible/invisible at a cutoff and scales in
- * size while appearing/disappearing.
- */
- ClockVisibilityTransition() {
- setCutoff(1f);
- setScale(1f);
- }
-
- /**
- * Sets the transition point between visible/invisible.
- *
- * @param cutoff The fraction in [0, 1] when the view switches between visible/invisible.
- * @return This transition object
- */
- public ClockVisibilityTransition setCutoff(float cutoff) {
- mCutoff = cutoff;
- return this;
- }
-
- /**
- * Sets the scale factor applied while appearing/disappearing.
- *
- * @param scale Scale factor applied while appearing/disappearing. When factor is less than
- * one, the view will shrink while disappearing. When it is greater than one,
- * the view will expand while disappearing.
- * @return This transition object
- */
- public ClockVisibilityTransition setScale(float scale) {
- mScale = scale;
- return this;
- }
-
- @Override
- public void captureStartValues(TransitionValues transitionValues) {
- super.captureStartValues(transitionValues);
- captureVisibility(transitionValues);
- }
-
- @Override
- public void captureEndValues(TransitionValues transitionValues) {
- super.captureStartValues(transitionValues);
- captureVisibility(transitionValues);
- }
-
- private void captureVisibility(TransitionValues transitionValues) {
- transitionValues.values.put(PROPNAME_VISIBILITY,
- transitionValues.view.getVisibility());
- }
-
- @Override
- public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
- TransitionValues endValues) {
- if (!sceneRoot.isShown()) {
- return null;
- }
- final float cutoff = mCutoff;
- final int startVisibility = View.INVISIBLE;
- final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);
- final float startScale = mScale;
- final float endScale = 1f;
- return createAnimator(view, cutoff, startVisibility, endVisibility, startScale,
- endScale);
- }
-
- @Override
- public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
- TransitionValues endValues) {
- if (!sceneRoot.isShown()) {
- return null;
- }
- final float cutoff = 1f - mCutoff;
- final int startVisibility = View.VISIBLE;
- final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);
- final float startScale = 1f;
- final float endScale = mScale;
- return createAnimator(view, cutoff, startVisibility, endVisibility, startScale,
- endScale);
- }
-
- private Animator createAnimator(View view, float cutoff, int startVisibility,
- int endVisibility, float startScale, float endScale) {
- view.setPivotY(view.getHeight() - view.getPaddingBottom());
- ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
- animator.addUpdateListener(animation -> {
- final float fraction = animation.getAnimatedFraction();
- if (fraction > cutoff) {
- view.setVisibility(endVisibility);
- }
- final float scale = MathUtils.lerp(startScale, endScale, fraction);
- view.setScaleX(scale);
- view.setScaleY(scale);
- });
- animator.addListener(new KeepAwakeAnimationListener(getContext()) {
- @Override
- public void onAnimationStart(Animator animation) {
- super.onAnimationStart(animation);
- view.setVisibility(startVisibility);
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- animation.removeListener(this);
- }
- });
- addListener(new TransitionListenerAdapter() {
- @Override
- public void onTransitionEnd(Transition transition) {
- view.setVisibility(endVisibility);
- view.setScaleX(1f);
- view.setScaleY(1f);
- transition.removeListener(this);
- }
- });
- return animator;
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index 0675200..032ed7d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -16,15 +16,21 @@
package com.android.keyguard;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
import android.app.WallpaperManager;
+import android.app.smartspace.SmartspaceConfig;
+import android.app.smartspace.SmartspaceManager;
+import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.res.Resources;
-import android.provider.Settings;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
@@ -32,17 +38,23 @@
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
+import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.ViewController;
import java.util.Locale;
import java.util.TimeZone;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -59,24 +71,22 @@
private final KeyguardSliceViewController mKeyguardSliceViewController;
private final NotificationIconAreaController mNotificationIconAreaController;
private final BroadcastDispatcher mBroadcastDispatcher;
+ private final BatteryController mBatteryController;
/**
- * Gradient clock for usage when mode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL.
+ * Clock for both small and large sizes
*/
- private AnimatableClockController mNewLockScreenClockViewController;
- private FrameLayout mNewLockScreenClockFrame;
- private AnimatableClockController mNewLockScreenLargeClockViewController;
- private FrameLayout mNewLockScreenLargeClockFrame;
+ private AnimatableClockController mClockViewController;
+ private FrameLayout mClockFrame;
+ private AnimatableClockController mLargeClockViewController;
+ private FrameLayout mLargeClockFrame;
- private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
-
- private final StatusBarStateController.StateListener mStateListener =
- new StatusBarStateController.StateListener() {
- @Override
- public void onStateChanged(int newState) {
- mView.updateBigClockVisibility(newState);
- }
- };
+ private PluginManager mPluginManager;
+ private boolean mIsSmartspaceEnabled;
+ PluginListener mPluginListener;
+ private Executor mUiExecutor;
+ private SmartspaceSession mSmartspaceSession;
+ private SmartspaceSession.Callback mSmartspaceCallback;
/**
* Listener for changes to the color palette.
@@ -94,7 +104,9 @@
};
private ClockManager.ClockChangedListener mClockChangedListener = this::setClockPlugin;
- private String mTimeFormat;
+
+ // If set, will replace keyguard_status_area
+ private BcSmartspaceDataPlugin.SmartspaceView mSmartspaceView;
@Inject
public KeyguardClockSwitchController(
@@ -105,7 +117,11 @@
KeyguardSliceViewController keyguardSliceViewController,
NotificationIconAreaController notificationIconAreaController,
ContentResolver contentResolver,
- BroadcastDispatcher broadcastDispatcher) {
+ BroadcastDispatcher broadcastDispatcher,
+ PluginManager pluginManager,
+ FeatureFlags featureFlags,
+ @Main Executor uiExecutor,
+ BatteryController batteryController) {
super(keyguardClockSwitch);
mResources = resources;
mStatusBarStateController = statusBarStateController;
@@ -114,7 +130,10 @@
mKeyguardSliceViewController = keyguardSliceViewController;
mNotificationIconAreaController = notificationIconAreaController;
mBroadcastDispatcher = broadcastDispatcher;
- mTimeFormat = Settings.System.getString(contentResolver, Settings.System.TIME_12_24);
+ mPluginManager = pluginManager;
+ mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled();
+ mUiExecutor = uiExecutor;
+ mBatteryController = batteryController;
}
/**
@@ -130,13 +149,90 @@
if (CUSTOM_CLOCKS_ENABLED) {
mClockManager.addOnClockChangedListener(mClockChangedListener);
}
- refreshFormat();
- mStatusBarStateController.addCallback(mStateListener);
mColorExtractor.addOnColorsChangedListener(mColorsListener);
mView.updateColors(getGradientColors());
updateAodIcons();
- mNewLockScreenClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view);
- mNewLockScreenLargeClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view_large);
+
+ mClockFrame = mView.findViewById(R.id.lockscreen_clock_view);
+ mLargeClockFrame = mView.findViewById(R.id.lockscreen_clock_view_large);
+
+ mClockViewController =
+ new AnimatableClockController(
+ mView.findViewById(R.id.animatable_clock_view),
+ mStatusBarStateController,
+ mBroadcastDispatcher,
+ mBatteryController);
+ mClockViewController.init();
+
+ mLargeClockViewController =
+ new AnimatableClockController(
+ mView.findViewById(R.id.animatable_clock_view_large),
+ mStatusBarStateController,
+ mBroadcastDispatcher,
+ mBatteryController);
+ mLargeClockViewController.init();
+
+ // If a smartspace plugin is detected, replace the existing smartspace
+ // (keyguard_status_area), and initialize a new session
+ mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() {
+
+ @Override
+ public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) {
+ if (!mIsSmartspaceEnabled) return;
+
+ View ksa = mView.findViewById(R.id.keyguard_status_area);
+ int ksaIndex = mView.indexOfChild(ksa);
+ ksa.setVisibility(View.GONE);
+
+ mSmartspaceView = plugin.getView(mView);
+ mSmartspaceView.registerDataProvider(plugin);
+ View asView = (View) mSmartspaceView;
+
+ RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
+ MATCH_PARENT, WRAP_CONTENT);
+ lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view);
+
+ mView.addView(asView, ksaIndex, lp);
+ int padding = getContext().getResources()
+ .getDimensionPixelSize(R.dimen.below_clock_padding_start);
+ asView.setPadding(padding, 0, padding, 0);
+
+ View nic = mView.findViewById(
+ com.android.systemui.R.id.left_aligned_notification_icon_container);
+ lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
+ lp.addRule(RelativeLayout.BELOW, asView.getId());
+ nic.setLayoutParams(lp);
+
+ createSmartspaceSession(plugin);
+ }
+
+ @Override
+ public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) {
+ if (!mIsSmartspaceEnabled) return;
+
+ mView.removeView((View) mSmartspaceView);
+ mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE);
+
+ View nic = mView.findViewById(
+ com.android.systemui.R.id.left_aligned_notification_icon_container);
+ RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)
+ nic.getLayoutParams();
+ lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area);
+ nic.setLayoutParams(lp);
+
+ mSmartspaceView = null;
+ }
+
+ private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) {
+ mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
+ .createSmartspaceSession(
+ new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
+ mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets);
+ mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
+ mSmartspaceSession.requestSmartspaceUpdate();
+ }
+ };
+ mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false);
}
@Override
@@ -144,9 +240,15 @@
if (CUSTOM_CLOCKS_ENABLED) {
mClockManager.removeOnClockChangedListener(mClockChangedListener);
}
- mStatusBarStateController.removeCallback(mStateListener);
mColorExtractor.removeOnColorsChangedListener(mColorsListener);
mView.setClockPlugin(null, mStatusBarStateController.getState());
+
+ if (mSmartspaceSession != null) {
+ mSmartspaceSession.unregisterSmartspaceUpdates(mSmartspaceCallback);
+ mSmartspaceSession.destroy();
+ mSmartspaceSession = null;
+ }
+ mPluginManager.removePluginListener(mPluginListener);
}
/**
@@ -157,13 +259,6 @@
}
/**
- * Set container for big clock face appearing behind NSSL and KeyguardStatusView.
- */
- public void setBigClockContainer(ViewGroup bigClockContainer) {
- mView.setBigClockContainer(bigClockContainer, mStatusBarStateController.getState());
- }
-
- /**
* Set whether or not the lock screen is showing notifications.
*/
public void setHasVisibleNotifications(boolean hasVisibleNotifications) {
@@ -198,9 +293,9 @@
* Refresh clock. Called in response to TIME_TICK broadcasts.
*/
void refresh() {
- if (mNewLockScreenClockViewController != null) {
- mNewLockScreenClockViewController.refreshTime();
- mNewLockScreenLargeClockViewController.refreshTime();
+ if (mClockViewController != null) {
+ mClockViewController.refreshTime();
+ mLargeClockViewController.refreshTime();
}
mView.refresh();
@@ -214,81 +309,45 @@
*/
void updatePosition(int x, float scale, AnimationProperties props, boolean animate) {
x = getCurrentLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? -x : x;
- if (mNewLockScreenClockFrame != null) {
- PropertyAnimator.setProperty(mNewLockScreenClockFrame, AnimatableProperty.TRANSLATION_X,
+
+ PropertyAnimator.setProperty(mClockFrame, AnimatableProperty.TRANSLATION_X,
+ x, props, animate);
+ PropertyAnimator.setProperty(mLargeClockFrame, AnimatableProperty.SCALE_X,
+ scale, props, animate);
+ PropertyAnimator.setProperty(mLargeClockFrame, AnimatableProperty.SCALE_Y,
+ scale, props, animate);
+
+ if (mSmartspaceView != null) {
+ PropertyAnimator.setProperty((View) mSmartspaceView, AnimatableProperty.TRANSLATION_X,
x, props, animate);
- PropertyAnimator.setProperty(mNewLockScreenLargeClockFrame, AnimatableProperty.SCALE_X,
- scale, props, animate);
- PropertyAnimator.setProperty(mNewLockScreenLargeClockFrame, AnimatableProperty.SCALE_Y,
- scale, props, animate);
}
+
mKeyguardSliceViewController.updatePosition(x, props, animate);
mNotificationIconAreaController.updatePosition(x, props, animate);
}
- /**
- * Update lockscreen mode that may change clock display.
- */
- void updateLockScreenMode(int mode) {
- mLockScreenMode = mode;
- if (mode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
- if (mNewLockScreenClockViewController == null) {
- mNewLockScreenClockViewController =
- new AnimatableClockController(
- mView.findViewById(R.id.animatable_clock_view),
- mStatusBarStateController,
- mBroadcastDispatcher);
- mNewLockScreenClockViewController.init();
- mNewLockScreenLargeClockViewController =
- new AnimatableClockController(
- mView.findViewById(R.id.animatable_clock_view_large),
- mStatusBarStateController,
- mBroadcastDispatcher);
- mNewLockScreenLargeClockViewController.init();
- }
- } else {
- mNewLockScreenClockViewController = null;
- mNewLockScreenLargeClockViewController = null;
- }
- mView.updateLockScreenMode(mLockScreenMode);
- updateAodIcons();
- }
-
void updateTimeZone(TimeZone timeZone) {
mView.onTimeZoneChanged(timeZone);
- if (mNewLockScreenClockViewController != null) {
- mNewLockScreenClockViewController.onTimeZoneChanged(timeZone);
- mNewLockScreenLargeClockViewController.onTimeZoneChanged(timeZone);
+ if (mClockViewController != null) {
+ mClockViewController.onTimeZoneChanged(timeZone);
+ mLargeClockViewController.onTimeZoneChanged(timeZone);
}
}
void refreshFormat(String timeFormat) {
- mTimeFormat = timeFormat;
- Patterns.update(mResources);
- mView.setFormat12Hour(Patterns.sClockView12);
- mView.setFormat24Hour(Patterns.sClockView24);
- mView.onTimeFormatChanged(mTimeFormat);
- if (mNewLockScreenClockViewController != null) {
- mNewLockScreenClockViewController.refreshFormat();
- mNewLockScreenLargeClockViewController.refreshFormat();
+ if (mClockViewController != null) {
+ mClockViewController.refreshFormat();
+ mLargeClockViewController.refreshFormat();
}
}
- void refreshFormat() {
- refreshFormat(mTimeFormat);
- }
-
private void updateAodIcons() {
NotificationIconContainer nic = (NotificationIconContainer)
mView.findViewById(
com.android.systemui.R.id.left_aligned_notification_icon_container);
- if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
- // alt icon area is set in KeyguardClockSwitchController
- mNotificationIconAreaController.setupAodIcons(nic, mLockScreenMode);
- } else {
- nic.setVisibility(View.GONE);
- }
+ // alt icon area is set in KeyguardClockSwitchController
+ mNotificationIconAreaController.setupAodIcons(nic);
}
private void setClockPlugin(ClockPlugin plugin) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index cd9627f..90c1e40 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -43,8 +43,8 @@
import com.android.internal.widget.LockscreenCredential;
import com.android.internal.widget.TextViewInputDisabler;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
/**
* Displays an alphanumeric (latin-1) key entry for the user to enter
* an unlock password
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 7ed6337..54ecf95 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -53,8 +53,8 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.Gefingerpoken;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import java.util.ArrayList;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 96e69ad..428006e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -49,8 +49,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
import java.io.FileDescriptor;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 5db4f9e..9df7734 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -44,7 +44,6 @@
* - keyguard clock
* - logout button (on certain managed devices)
* - owner information (if set)
- * - notification icons (shown on AOD)
*/
public class KeyguardStatusView extends GridLayout {
private static final boolean DEBUG = KeyguardConstants.DEBUG;
@@ -59,7 +58,6 @@
private TextView mOwnerInfo;
private boolean mCanShowOwnerInfo = true; // by default, try to show the owner information here
private KeyguardSliceView mKeyguardSlice;
- private View mNotificationIcons;
private Runnable mPendingMarqueeStart;
private Handler mHandler;
@@ -132,13 +130,11 @@
protected void onFinishInflate() {
super.onFinishInflate();
mLogoutView = findViewById(R.id.logout);
- mNotificationIcons = findViewById(R.id.clock_notification_icon_container);
if (mLogoutView != null) {
mLogoutView.setOnClickListener(this::onLogoutClicked);
}
mClockView = findViewById(R.id.keyguard_clock_container);
- mClockView.setShowCurrentUserTime(true);
if (KeyguardClockAccessibilityDelegate.isNeeded(mContext)) {
mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
}
@@ -161,22 +157,10 @@
*/
private void onSliceContentChanged() {
final boolean hasHeader = mKeyguardSlice.hasHeader();
- mClockView.setKeyguardShowingHeader(hasHeader);
if (mShowingHeader == hasHeader) {
return;
}
mShowingHeader = hasHeader;
- if (mNotificationIcons != null) {
- // Update top margin since header has appeared/disappeared.
- MarginLayoutParams params = (MarginLayoutParams) mNotificationIcons.getLayoutParams();
- params.setMargins(params.leftMargin,
- hasHeader ? mIconTopMarginWithHeader : mIconTopMargin,
- params.rightMargin,
- params.bottomMargin);
- mNotificationIcons.setLayoutParams(params);
- }
-
- mClockView.setKeyguardHidingBigClock(hasHeader);
}
@Override
@@ -293,13 +277,6 @@
int expanded = mOwnerInfo.getBottom() + mOwnerInfo.getPaddingBottom();
int toRemove = (int) ((expanded - collapsed) * ratio);
setBottom(getMeasuredHeight() - toRemove);
- if (mNotificationIcons != null) {
- // We're using scrolling in order not to overload the translation which is used
- // when appearing the icons
- mNotificationIcons.setScrollY(toRemove);
- }
- } else if (mNotificationIcons != null){
- mNotificationIcons.setScrollY(0);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index 31ec003..fc80dbe 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -18,15 +18,12 @@
import android.os.UserHandle;
import android.util.Slog;
-import android.view.View;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.NotificationIconAreaController;
-import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.ViewController;
@@ -49,7 +46,6 @@
private final KeyguardClockSwitchController mKeyguardClockSwitchController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final ConfigurationController mConfigurationController;
- private final NotificationIconAreaController mNotificationIconAreaController;
private final DozeParameters mDozeParameters;
private final KeyguardVisibilityHelper mKeyguardVisibilityHelper;
@@ -63,14 +59,12 @@
KeyguardStateController keyguardStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
ConfigurationController configurationController,
- NotificationIconAreaController notificationIconAreaController,
DozeParameters dozeParameters) {
super(keyguardStatusView);
mKeyguardSliceViewController = keyguardSliceViewController;
mKeyguardClockSwitchController = keyguardClockSwitchController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mConfigurationController = configurationController;
- mNotificationIconAreaController = notificationIconAreaController;
mDozeParameters = dozeParameters;
mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView, keyguardStateController,
dozeParameters);
@@ -87,7 +81,6 @@
protected void onViewAttached() {
mKeyguardUpdateMonitor.registerCallback(mInfoCallback);
mConfigurationController.addCallback(mConfigurationListener);
- updateAodIcons();
}
@Override
@@ -237,17 +230,6 @@
mKeyguardClockSwitchController.refresh();
}
- private void updateAodIcons() {
- NotificationIconContainer nic = (NotificationIconContainer)
- mView.findViewById(com.android.systemui.R.id.clock_notification_icon_container);
- if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL) {
- // alternate icon area is set in KeyguardClockSwitchController
- mNotificationIconAreaController.setupAodIcons(nic, mLockScreenMode);
- } else {
- nic.setVisibility(View.GONE);
- }
- }
-
private boolean shouldShowLogout() {
return mKeyguardUpdateMonitor.isLogoutEnabled()
&& KeyguardUpdateMonitor.getCurrentUser() != UserHandle.USER_SYSTEM;
@@ -271,16 +253,9 @@
@Override
public void onLockScreenModeChanged(int mode) {
mLockScreenMode = mode;
- mKeyguardClockSwitchController.updateLockScreenMode(mode);
mKeyguardSliceViewController.updateLockScreenMode(mode);
- if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
- mView.setCanShowOwnerInfo(false);
- mView.updateLogoutView(false);
- } else {
- mView.setCanShowOwnerInfo(true);
- mView.updateLogoutView(false);
- }
- updateAodIcons();
+ mView.setCanShowOwnerInfo(false);
+ mView.updateLogoutView(false);
}
@Override
@@ -294,11 +269,6 @@
}
@Override
- public void onTimeFormatChanged(String timeFormat) {
- mKeyguardClockSwitchController.refreshFormat(timeFormat);
- }
-
- @Override
public void onKeyguardVisibilityChanged(boolean showing) {
if (showing) {
if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing);
@@ -320,7 +290,6 @@
@Override
public void onUserSwitchComplete(int userId) {
- mKeyguardClockSwitchController.refreshFormat();
mView.updateOwnerInfo();
mView.updateLogoutView(shouldShowLogout());
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 3d6815c..67ee1f4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -360,10 +360,12 @@
@Override
public void onChanged(BiometricSourceType type, boolean enabled, int userId)
throws RemoteException {
- if (type == BiometricSourceType.FACE) {
- mFaceSettingEnabledForUser.put(userId, enabled);
- updateFaceListeningState();
- }
+ mHandler.post(() -> {
+ if (type == BiometricSourceType.FACE) {
+ mFaceSettingEnabledForUser.put(userId, enabled);
+ updateFaceListeningState();
+ }
+ });
}
};
@@ -2114,6 +2116,11 @@
* If face auth is allows to scan on this exact moment.
*/
public boolean shouldListenForFace() {
+ if (mFaceManager == null) {
+ // Device does not have face auth
+ return false;
+ }
+
final boolean statusBarShadeLocked = mStatusBarState == StatusBarState.SHADE_LOCKED;
final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep
&& !statusBarShadeLocked;
@@ -2135,8 +2142,15 @@
// Scan even when encrypted or timeout to show a preemptive bouncer when bypassing.
// Lock-down mode shouldn't scan, since it is more explicit.
- boolean strongAuthAllowsScanning = (!isEncryptedOrTimedOut || canBypass && !mBouncer)
- && !isLockDown;
+ boolean strongAuthAllowsScanning = (!isEncryptedOrTimedOut || canBypass && !mBouncer);
+
+ // If the device supports face detection (without authentication), allow it to happen
+ // if the device is in lockdown mode. Otherwise, prevent scanning.
+ boolean supportsDetectOnly = !mFaceSensorProperties.isEmpty()
+ && mFaceSensorProperties.get(0).supportsFaceDetection;
+ if (isLockDown && !supportsDetectOnly) {
+ strongAuthAllowsScanning = false;
+ }
// Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
// instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
@@ -2237,8 +2251,11 @@
if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING) {
setFaceRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING);
return;
+ } else if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
+ // Waiting for ERROR_CANCELED before requesting auth again
+ return;
}
- if (DEBUG) Log.v(TAG, "startListeningForFace()");
+ if (DEBUG) Log.v(TAG, "startListeningForFace(): " + mFaceRunningState);
int userId = getCurrentUser();
if (isUnlockWithFacePossible(userId)) {
if (mFaceCancelSignal != null) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
index 724e1f6..947f141 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
@@ -20,7 +20,7 @@
import android.view.View;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 7329071..66ea2ad 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -199,14 +199,14 @@
}
private void updateVisibility() {
- if (!mIsKeyguardShowing) {
+ if (!mIsKeyguardShowing || (!mUdfpsEnrolled && !mFaceAuthEnrolled)) {
mView.setVisibility(View.INVISIBLE);
return;
}
// these three states are mutually exclusive:
mShowButton = mUdfpsEnrolled && !mCanDismissLockScreen && !mRunningFPS && isLockScreen();
- mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
+ mShowUnlockIcon = mFaceAuthEnrolled & mCanDismissLockScreen && isLockScreen();
mShowLockIcon = !mUdfpsEnrolled && !mCanDismissLockScreen && isLockScreen()
&& mFaceAuthEnrolled;
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
index 6cee4a4..570854e 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
@@ -27,8 +27,8 @@
import androidx.annotation.StyleRes;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
/**
* Provides background color and radius animations for key pad buttons.
diff --git a/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt
index 5735a4f..cdb39ef 100644
--- a/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt
+++ b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt
@@ -65,7 +65,9 @@
invalidateCallback()
}
addListener(object : AnimatorListenerAdapter() {
- override fun onAnimationEnd(animation: Animator?) = textInterpolator.rebase()
+ override fun onAnimationEnd(animation: Animator?) {
+ textInterpolator.rebase()
+ }
override fun onAnimationCancel(animation: Animator?) = textInterpolator.rebase()
})
}
@@ -74,6 +76,10 @@
textInterpolator.layout = layout
}
+ fun isRunning(): Boolean {
+ return animator.isRunning
+ }
+
fun draw(c: Canvas) = textInterpolator.draw(c)
/**
@@ -101,7 +107,9 @@
color: Int? = null,
animate: Boolean = true,
duration: Long = -1L,
- interpolator: TimeInterpolator? = null
+ interpolator: TimeInterpolator? = null,
+ delay: Long = 0,
+ onAnimationEnd: Runnable? = null
) {
if (animate) {
animator.cancel()
@@ -120,12 +128,25 @@
textInterpolator.onTargetPaintModified()
if (animate) {
+ animator.startDelay = delay
animator.duration = if (duration == -1L) {
DEFAULT_ANIMATION_DURATION
} else {
duration
}
interpolator?.let { animator.interpolator = it }
+ if (onAnimationEnd != null) {
+ val listener = object : AnimatorListenerAdapter() {
+ override fun onAnimationEnd(animation: Animator?) {
+ onAnimationEnd.run()
+ animator.removeListener(this)
+ }
+ override fun onAnimationCancel(animation: Animator?) {
+ animator.removeListener(this)
+ }
+ }
+ animator.addListener(listener)
+ }
animator.start()
} else {
// No animation is requested, thus set base and target state to the same state.
diff --git a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
index 5507ffa..983b1bb 100644
--- a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
@@ -20,9 +20,9 @@
import androidx.annotation.Nullable;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.statusbar.phone.StatusBar;
import java.util.Optional;
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index ac99f73..54e78cf 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -50,6 +50,7 @@
import androidx.annotation.StyleRes;
import com.android.settingslib.graph.ThemedBatteryDrawable;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 721b758..c8e6741 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -198,8 +198,8 @@
}
mImgHeight = b.getHeight();
mImgWidth = b.getWidth();
- mMiniBitmap = Bitmap.createScaledBitmap(b, Math.round(scale * b.getWidth()),
- Math.round(scale * b.getHeight()), false);
+ mMiniBitmap = Bitmap.createScaledBitmap(b, (int) Math.ceil(scale * b.getWidth()),
+ (int) Math.ceil(scale * b.getHeight()), false);
computeAndNotifyLocalColors(mLocalColorsToAdd, mMiniBitmap);
mLocalColorsToAdd.clear();
});
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index d3ac9ac..5fa98bc 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -82,6 +82,7 @@
import com.android.internal.util.Preconditions;
import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index fba34e0..b0f4da2 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -36,6 +36,7 @@
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 9d00262..cc167b9 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -46,6 +46,7 @@
private GlobalRootComponent mRootComponent;
private WMComponent mWMComponent;
private SysUIComponent mSysUIComponent;
+ private boolean mInitializeComponents;
public static <T extends SystemUIFactory> T getInstance() {
return (T) mFactory;
@@ -88,13 +89,13 @@
public void init(Context context, boolean fromTest)
throws ExecutionException, InterruptedException {
// Only initialize components for the main system ui process running as the primary user
- final boolean initializeComponents = !fromTest
+ mInitializeComponents = !fromTest
&& android.os.Process.myUserHandle().isSystem()
&& ActivityThread.currentProcessName().equals(ActivityThread.currentPackageName());
mRootComponent = buildGlobalRootComponent(context);
// Stand up WMComponent
mWMComponent = mRootComponent.getWMComponentBuilder().build();
- if (initializeComponents) {
+ if (mInitializeComponents) {
// Only initialize when not starting from tests since this currently initializes some
// components that shouldn't be run in the test environment
mWMComponent.init();
@@ -102,7 +103,7 @@
// And finally, retrieve whatever SysUI needs from WMShell and build SysUI.
SysUIComponent.Builder builder = mRootComponent.getSysUIComponent();
- if (initializeComponents) {
+ if (mInitializeComponents) {
// Only initialize when not starting from tests since this currently initializes some
// components that shouldn't be run in the test environment
builder = prepareSysUIComponentBuilder(builder, mWMComponent)
@@ -134,7 +135,7 @@
.setStartingSurface(Optional.ofNullable(null));
}
mSysUIComponent = builder.build();
- if (initializeComponents) {
+ if (mInitializeComponents) {
mSysUIComponent.init();
}
@@ -160,6 +161,9 @@
.build();
}
+ protected boolean shouldInitializeComponents() {
+ return mInitializeComponents;
+ }
public GlobalRootComponent getRootComponent() {
return mRootComponent;
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
index 5532a04..d6f0b59 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
@@ -32,8 +32,8 @@
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
/**
* Visually discloses that contextual data was provided to an assistant.
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java
index fe48c26..95b9e81 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java
@@ -22,8 +22,8 @@
import android.view.View;
import android.widget.FrameLayout;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
public class AssistOrbContainer extends FrameLayout {
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java
index 1d032e8..16d9c84 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java
@@ -32,8 +32,8 @@
import android.widget.FrameLayout;
import android.widget.ImageView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
public class AssistOrbView extends FrameLayout {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 1c0aa06..72db6cd 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -48,8 +48,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import java.lang.annotation.Retention;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
index b44ff29..0fb1295 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
@@ -45,8 +45,8 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/HbmTypes.java b/packages/SystemUI/src/com/android/systemui/biometrics/HbmTypes.java
index 96ee0f7..f798005 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/HbmTypes.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/HbmTypes.java
@@ -17,6 +17,7 @@
package com.android.systemui.biometrics;
import android.annotation.IntDef;
+import android.hardware.fingerprint.IUdfpsHbmListener;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -26,10 +27,10 @@
*/
public final class HbmTypes {
/** HBM that applies to the whole screen. */
- public static final int GLOBAL_HBM = 0;
+ public static final int GLOBAL_HBM = IUdfpsHbmListener.GLOBAL_HBM;
/** HBM that only applies to a portion of the screen. */
- public static final int LOCAL_HBM = 1;
+ public static final int LOCAL_HBM = IUdfpsHbmListener.LOCAL_HBM;
@Retention(RetentionPolicy.SOURCE)
@IntDef({GLOBAL_HBM, LOCAL_HBM})
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
index 71ed3f8..6f7e6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
@@ -28,8 +28,8 @@
import com.android.internal.graphics.ColorUtils;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.doze.DozeReceiver;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index fc906f2..565e65f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -30,8 +30,8 @@
import androidx.annotation.Nullable;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.StatusBarState;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java
index fb7fabb..1e86cf1 100644
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java
@@ -120,10 +120,7 @@
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
params.setFitInsetsTypes(0 /* ignore all system bar insets */);
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_DIM_BEHIND;
-
- params.dimAmount = .3f;
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
if (looper == null) {
// Use Looper.myLooper() if looper is not specified.
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
index 5cc8299..38ffec1 100644
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
@@ -21,18 +21,18 @@
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.PointF;
-import android.graphics.drawable.Animatable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
+import android.view.View;
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.charging.ChargingRippleView;
import java.text.NumberFormat;
@@ -78,10 +78,6 @@
inflate(new ContextThemeWrapper(context, style), R.layout.wireless_charging_layout, this);
- // where the circle animation occurs:
- final ImageView chargingView = findViewById(R.id.wireless_charging_view);
- final Animatable chargingAnimation = (Animatable) chargingView.getDrawable();
-
// amount of battery:
final TextView percentage = findViewById(R.id.wireless_charging_percentage);
@@ -126,9 +122,20 @@
animatorSet.playTogether(textSizeAnimator, textOpacityAnimator, textFadeAnimator);
mRippleView = findViewById(R.id.wireless_charging_ripple);
+ OnAttachStateChangeListener listener = new OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(View view) {
+ mRippleView.setDuration(RIPPLE_ANIMATION_DURATION);
+ mRippleView.startRipple();
+ mRippleView.removeOnAttachStateChangeListener(this);
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View view) {}
+ };
+ mRippleView.addOnAttachStateChangeListener(listener);
if (!showTransmittingBatteryLevel) {
- chargingAnimation.start();
animatorSet.start();
return;
}
@@ -197,7 +204,6 @@
AnimatorSet animatorSetIcon = new AnimatorSet();
animatorSetIcon.playTogether(textOpacityAnimatorIcon, textFadeAnimatorIcon);
- chargingAnimation.start();
animatorSet.start();
animatorSetTransmitting.start();
animatorSetIcon.start();
@@ -213,8 +219,6 @@
android.R.attr.colorAccent).getDefaultColor());
mRippleView.setOrigin(new PointF(width / 2, height / 2));
mRippleView.setRadius(Math.max(width, height) * 0.5f);
- mRippleView.setDuration(RIPPLE_ANIMATION_DURATION);
- mRippleView.startRipple();
}
super.onLayout(changed, left, top, right, bottom);
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index aaea9ce..88748f9 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -24,10 +24,12 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.SystemClock;
@@ -50,6 +52,7 @@
private final ProximitySensor mProximitySensor;
private final StatusBarStateController mStatusBarStateController;
private final KeyguardStateController mKeyguardStateController;
+ private final DelayableExecutor mMainExecutor;
private final SystemClock mSystemClock;
private int mState;
@@ -89,7 +92,8 @@
FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager,
KeyguardUpdateMonitor keyguardUpdateMonitor, HistoryTracker historyTracker,
ProximitySensor proximitySensor, StatusBarStateController statusBarStateController,
- KeyguardStateController keyguardStateController, SystemClock systemClock) {
+ KeyguardStateController keyguardStateController,
+ @Main DelayableExecutor mainExecutor, SystemClock systemClock) {
mFalsingDataProvider = falsingDataProvider;
mFalsingManager = falsingManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
@@ -97,6 +101,7 @@
mProximitySensor = proximitySensor;
mStatusBarStateController = statusBarStateController;
mKeyguardStateController = keyguardStateController;
+ mMainExecutor = mainExecutor;
mSystemClock = systemClock;
@@ -276,7 +281,7 @@
@Override
public void onMotionEventComplete() {
- mFalsingDataProvider.onMotionEventComplete();
+ mMainExecutor.executeDelayed(mFalsingDataProvider::onMotionEventComplete , 50);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt
index 1ea1d97..4aa597e 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt
@@ -22,21 +22,17 @@
import android.animation.ObjectAnimator
import android.annotation.IdRes
import android.content.Intent
-
import android.transition.Transition
import android.transition.TransitionValues
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.view.Window
-
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
-
-import com.android.systemui.Interpolators
import com.android.systemui.R
-
+import com.android.systemui.animation.Interpolators
import com.android.systemui.controls.ui.ControlsUiController
object ControlsAnimations {
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 3e02890..43607dd 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -47,8 +47,8 @@
import android.widget.ImageView
import android.widget.TextView
import com.android.internal.graphics.ColorUtils
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.util.concurrency.DelayableExecutor
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
index a3a937a..fa36eee 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
@@ -37,8 +37,8 @@
import android.view.ViewGroup
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityNodeInfo
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
import com.android.systemui.controls.ui.ControlViewHolder.Companion.MAX_LEVEL
import com.android.systemui.controls.ui.ControlViewHolder.Companion.MIN_LEVEL
import java.util.IllegalFormatException
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index ab1de95..a83b13c 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -61,7 +61,7 @@
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.view.RotationPolicy;
import com.android.internal.widget.LockPatternUtils;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Background;
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index 47ae145..e44e305 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -107,9 +107,9 @@
import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.util.ScreenshotHelper;
import com.android.internal.widget.LockPatternUtils;
-import com.android.systemui.Interpolators;
import com.android.systemui.MultiListLayout;
import com.android.systemui.MultiListLayout.MultiListAdapter;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Background;
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
index 127128d..bec4ce6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import android.content.res.ColorStateList;
import android.graphics.Color;
+import android.text.TextUtils;
import android.view.View;
import androidx.annotation.IntDef;
@@ -69,8 +70,7 @@
public KeyguardIndicationRotateTextViewController(
KeyguardIndicationTextView view,
@Main DelayableExecutor executor,
- StatusBarStateController statusBarStateController,
- int lockScreenMode
+ StatusBarStateController statusBarStateController
) {
super(view);
mMaxAlpha = view.getAlpha();
@@ -78,7 +78,6 @@
mInitialTextColorState = mView != null
? mView.getTextColors() : ColorStateList.valueOf(Color.WHITE);
mStatusBarStateController = statusBarStateController;
- mView.setLockScreenMode(lockScreenMode);
init();
}
@@ -102,7 +101,7 @@
* the IndicationQueue comes around.
*/
public void updateIndication(@IndicationType int type, KeyguardIndication newIndication,
- boolean showImmediately) {
+ boolean updateImmediately) {
if (type == INDICATION_TYPE_NOW_PLAYING
|| type == INDICATION_TYPE_REVERSE_CHARGING) {
// temporarily don't show here, instead use AmbientContainer b/181049781
@@ -125,7 +124,7 @@
return;
}
- final boolean showNow = showImmediately
+ final boolean showNow = updateImmediately
|| mCurrIndicationType == INDICATION_TYPE_NONE
|| mCurrIndicationType == type;
if (hasNewIndication) {
@@ -139,7 +138,7 @@
if (mCurrIndicationType == type
&& !hasNewIndication
- && showImmediately) {
+ && updateImmediately) {
if (mShowNextIndicationRunnable != null) {
mShowNextIndicationRunnable.runImmediately();
} else {
@@ -154,6 +153,10 @@
* If the current indication is of this type, immediately stops showing the message.
*/
public void hideIndication(@IndicationType int type) {
+ if (!mIndicationMessages.containsKey(type)
+ || TextUtils.isEmpty(mIndicationMessages.get(type).getMessage())) {
+ return;
+ }
updateIndication(type, null, true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index b227c7d..70459df 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -94,8 +94,8 @@
import com.android.keyguard.KeyguardViewController;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
import com.android.systemui.SystemUI;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.qualifiers.UiBackground;
diff --git a/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
index bc45113..121ddd4 100644
--- a/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
@@ -36,8 +36,8 @@
import androidx.annotation.Keep
import com.android.internal.graphics.ColorUtils
import com.android.internal.graphics.ColorUtils.blendARGB
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
import org.xmlpull.v1.XmlPullParser
private const val BACKGROUND_ANIM_DURATION = 370L
diff --git a/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt
index e6035f3..711cb36 100644
--- a/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt
@@ -36,8 +36,8 @@
import android.util.MathUtils.lerp
import androidx.annotation.Keep
import com.android.internal.graphics.ColorUtils
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
import org.xmlpull.v1.XmlPullParser
private const val RIPPLE_ANIM_DURATION = 800L
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index a3ff375..2ecd405 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -1,6 +1,7 @@
package com.android.systemui.media
import android.animation.ArgbEvaluator
+import android.app.smartspace.SmartspaceTarget
import android.content.Context
import android.content.Intent
import android.content.res.ColorStateList
@@ -201,9 +202,19 @@
}
}
+ override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
+ Log.d(TAG, "My Smartspace media update is here")
+ addSmartspaceMediaRecommendations(key, data)
+ }
+
override fun onMediaDataRemoved(key: String) {
removePlayer(key)
}
+
+ override fun onSmartspaceMediaDataRemoved(key: String) {
+ Log.d(TAG, "My Smartspace media removal request is received")
+ removePlayer(key)
+ }
})
mediaFrame.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
// The pageIndicator is not laid out yet when we get the current state update,
@@ -246,8 +257,10 @@
private fun reorderAllPlayers() {
mediaContent.removeAllViews()
for (mediaPlayer in MediaPlayerData.players()) {
- mediaPlayer.view?.let {
+ mediaPlayer.playerViewHolder?.let {
mediaContent.addView(it.player)
+ } ?: mediaPlayer.recommendationViewHolder?.let {
+ mediaContent.addView(it.recommendations)
}
}
mediaCarouselScrollHandler.onPlayersChanged()
@@ -262,18 +275,19 @@
val existingPlayer = MediaPlayerData.getMediaPlayer(key, oldKey)
if (existingPlayer == null) {
var newPlayer = mediaControlPanelFactory.get()
- newPlayer.attach(PlayerViewHolder.create(LayoutInflater.from(context), mediaContent))
+ newPlayer.attachPlayer(
+ PlayerViewHolder.create(LayoutInflater.from(context), mediaContent))
newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
- newPlayer.view?.player?.setLayoutParams(lp)
- newPlayer.bind(dataCopy, key)
+ newPlayer.playerViewHolder?.player?.setLayoutParams(lp)
+ newPlayer.bindPlayer(dataCopy, key)
newPlayer.setListening(currentlyExpanded)
MediaPlayerData.addMediaPlayer(key, dataCopy, newPlayer)
updatePlayerToState(newPlayer, noAnimation = true)
reorderAllPlayers()
} else {
- existingPlayer.bind(dataCopy, key)
+ existingPlayer.bindPlayer(dataCopy, key)
MediaPlayerData.addMediaPlayer(key, dataCopy, existingPlayer)
if (visualStabilityManager.isReorderingAllowed) {
reorderAllPlayers()
@@ -291,11 +305,43 @@
}
}
- private fun removePlayer(key: String, dismissMediaData: Boolean = true) {
+ private fun addSmartspaceMediaRecommendations(key: String, data: SmartspaceTarget) {
+ Log.d(TAG, "Updating smartspace target in carousel")
+ if (MediaPlayerData.getMediaPlayer(key, null) != null) {
+ Log.w(TAG, "Skip adding smartspace target in carousel")
+ return
+ }
+
+ var newRecs = mediaControlPanelFactory.get()
+ newRecs.attachRecommendation(
+ RecommendationViewHolder.create(LayoutInflater.from(context), mediaContent))
+ newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
+ val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT)
+ newRecs.recommendationViewHolder?.recommendations?.setLayoutParams(lp)
+ newRecs.bindRecommendation(data, bgColor, { v -> removePlayer(key) })
+ MediaPlayerData.addMediaPlayer(key, newRecs)
+ updatePlayerToState(newRecs, noAnimation = true)
+ reorderAllPlayers()
+ updatePageIndicator()
+ mediaCarousel.requiresRemeasuring = true
+ // Check postcondition: mediaContent should have the same number of children as there are
+ // elements in mediaPlayers.
+ if (MediaPlayerData.players().size != mediaContent.childCount) {
+ Log.wtf(TAG, "Size of players list and number of views in carousel are out of sync")
+ }
+ }
+
+ private fun removePlayer(
+ key: String,
+ dismissMediaData: Boolean = true,
+ dismissRecommendation: Boolean = true
+ ) {
val removed = MediaPlayerData.removeMediaPlayer(key)
removed?.apply {
mediaCarouselScrollHandler.onPrePlayerRemoved(removed)
- mediaContent.removeView(removed.view?.player)
+ mediaContent.removeView(removed.playerViewHolder?.player)
+ mediaContent.removeView(removed.recommendationViewHolder?.recommendations)
removed.onDestroy()
mediaCarouselScrollHandler.onPlayersChanged()
updatePageIndicator()
@@ -304,6 +350,10 @@
// Inform the media manager of a potentially late dismissal
mediaManager.dismissMediaData(key, 0L)
}
+ if (dismissRecommendation) {
+ // Inform the media manager of a potentially late dismissal
+ mediaManager.dismissSmartspaceRecommendation()
+ }
}
}
@@ -525,23 +575,37 @@
@VisibleForTesting
internal object MediaPlayerData {
+ private val EMPTY = MediaData(-1, false, 0, null, null, null, null, null,
+ emptyList(), emptyList(), "INVALID", null, null, null, true, null)
+
private data class MediaSortKey(
+ // Is Smartspace media recommendation. When the Smartspace media is present, it should
+ // always be the first card in carousel.
+ val isSsMediaRec: Boolean,
val data: MediaData,
val updateTime: Long = 0
)
private val comparator =
- compareByDescending<MediaSortKey> { it.data.isPlaying }
- .thenByDescending { it.data.isLocalSession }
- .thenByDescending { !it.data.resumption }
- .thenByDescending { it.updateTime }
+ compareByDescending<MediaSortKey> { it.isSsMediaRec }
+ .thenByDescending { it.data.isPlaying }
+ .thenByDescending { it.data.isLocalSession }
+ .thenByDescending { !it.data.resumption }
+ .thenByDescending { it.updateTime }
private val mediaPlayers = TreeMap<MediaSortKey, MediaControlPanel>(comparator)
private val mediaData: MutableMap<String, MediaSortKey> = mutableMapOf()
fun addMediaPlayer(key: String, data: MediaData, player: MediaControlPanel) {
removeMediaPlayer(key)
- val sortKey = MediaSortKey(data, System.currentTimeMillis())
+ val sortKey = MediaSortKey(isSsMediaRec = false, data, System.currentTimeMillis())
+ mediaData.put(key, sortKey)
+ mediaPlayers.put(sortKey, player)
+ }
+
+ fun addMediaPlayer(key: String, player: MediaControlPanel) {
+ removeMediaPlayer(key)
+ val sortKey = MediaSortKey(isSsMediaRec = true, EMPTY, System.currentTimeMillis())
mediaData.put(key, sortKey)
mediaPlayers.put(sortKey, player)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
index bb6fbfa..f0b78dd 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
@@ -510,7 +510,7 @@
* where it was and update our scroll position.
*/
fun onPrePlayerRemoved(removed: MediaControlPanel) {
- val removedIndex = mediaContent.indexOfChild(removed.view?.player)
+ val removedIndex = mediaContent.indexOfChild(removed.playerViewHolder?.player)
// If the removed index is less than the activeMediaIndex, then we need to decrement it.
// RTL has no effect on this, because indices are always relative (start-to-end).
// Update the index 'manually' since we won't always get a call to onMediaScrollingChanged
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 4fd8fe7..495461e 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -16,12 +16,14 @@
package com.android.systemui.media;
-import static android.app.Notification.safeCharSequence;
import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS;
import android.app.PendingIntent;
+import android.app.smartspace.SmartspaceAction;
+import android.app.smartspace.SmartspaceTarget;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.graphics.Outline;
import android.graphics.Rect;
@@ -30,6 +32,7 @@
import android.media.session.MediaController;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
+import android.os.Bundle;
import android.os.SystemProperties;
import android.util.Log;
import android.view.View;
@@ -46,11 +49,11 @@
import com.android.settingslib.Utils;
import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.GhostedViewLaunchAnimatorController;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
-import com.android.systemui.plugins.animation.GhostedViewLaunchAnimatorController;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import com.android.systemui.util.animation.TransitionLayout;
@@ -67,6 +70,9 @@
public class MediaControlPanel {
private static final String TAG = "MediaControlPanel";
private static final float DISABLED_ALPHA = 0.38f;
+ private static final String EXTRAS_MEDIA_SOURCE_LOGO = "media_source_logo";
+ private static final String EXTRAS_MEDIA_SOURCE_PACKAGE_NAME = "package_name";
+ private static final int MEDIA_RECOMMENDATION_MAX_NUM = 4;
private final boolean mShowAppName = SystemProperties.getBoolean(
"persist.sysui.qs_media_show_app_name", false);
@@ -90,7 +96,8 @@
private final ActivityStarter mActivityStarter;
private Context mContext;
- private PlayerViewHolder mViewHolder;
+ private PlayerViewHolder mPlayerViewHolder;
+ private RecommendationViewHolder mRecommendationViewHolder;
private String mKey;
private MediaViewController mMediaViewController;
private MediaSession.Token mToken;
@@ -149,13 +156,22 @@
}
/**
- * Get the view holder used to display media controls
+ * Get the player view holder used to display media controls.
*
- * @return the view holder
+ * @return the player view holder
*/
@Nullable
- public PlayerViewHolder getView() {
- return mViewHolder;
+ public PlayerViewHolder getPlayerViewHolder() {
+ return mPlayerViewHolder;
+ }
+
+ /**
+ * Get the recommendation view holder used to display Smartspace media recs.
+ * @return the recommendation view holder
+ */
+ @Nullable
+ public RecommendationViewHolder getRecommendationViewHolder() {
+ return mRecommendationViewHolder;
}
/**
@@ -189,9 +205,9 @@
return mContext;
}
- /** Attaches the player to the view holder. */
- public void attach(PlayerViewHolder vh) {
- mViewHolder = vh;
+ /** Attaches the player to the player view holder. */
+ public void attachPlayer(PlayerViewHolder vh) {
+ mPlayerViewHolder = vh;
TransitionLayout player = vh.getPlayer();
ImageView albumView = vh.getAlbumView();
@@ -201,9 +217,9 @@
mSeekBarObserver = new SeekBarObserver(vh);
mSeekBarViewModel.getProgress().observeForever(mSeekBarObserver);
mSeekBarViewModel.attachTouchHandlers(vh.getSeekBar());
- mMediaViewController.attach(player);
+ mMediaViewController.attach(player, MediaViewController.TYPE.PLAYER);
- mViewHolder.getPlayer().setOnLongClickListener(v -> {
+ mPlayerViewHolder.getPlayer().setOnLongClickListener(v -> {
if (!mMediaViewController.isGutsVisible()) {
mMediaViewController.openGuts();
return true;
@@ -211,19 +227,25 @@
return false;
}
});
- mViewHolder.getCancel().setOnClickListener(v -> {
+ mPlayerViewHolder.getCancel().setOnClickListener(v -> {
closeGuts();
});
- mViewHolder.getSettings().setOnClickListener(v -> {
+ mPlayerViewHolder.getSettings().setOnClickListener(v -> {
mActivityStarter.startActivity(SETTINGS_INTENT, true /* dismissShade */);
});
}
- /**
- * Bind this view based on the data given
- */
- public void bind(@NonNull MediaData data, String key) {
- if (mViewHolder == null) {
+ /** Attaches the recommendations to the recommendation view holder. */
+ public void attachRecommendation(RecommendationViewHolder vh) {
+ mRecommendationViewHolder = vh;
+ TransitionLayout recommendations = vh.getRecommendations();
+
+ mMediaViewController.attach(recommendations, MediaViewController.TYPE.RECOMMENDATION);
+ }
+
+ /** Bind this player view based on the data given. */
+ public void bindPlayer(@NonNull MediaData data, String key) {
+ if (mPlayerViewHolder == null) {
return;
}
mKey = key;
@@ -242,20 +264,20 @@
ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout();
- mViewHolder.getPlayer().setBackgroundTintList(
+ mPlayerViewHolder.getPlayer().setBackgroundTintList(
ColorStateList.valueOf(mBackgroundColor));
// Click action
PendingIntent clickIntent = data.getClickIntent();
if (clickIntent != null) {
- mViewHolder.getPlayer().setOnClickListener(v -> {
+ mPlayerViewHolder.getPlayer().setOnClickListener(v -> {
if (mMediaViewController.isGutsVisible()) return;
mActivityStarter.postStartActivityDismissingKeyguard(clickIntent,
- buildLaunchAnimatorController(mViewHolder.getPlayer()));
+ buildLaunchAnimatorController(mPlayerViewHolder.getPlayer()));
});
}
- ImageView albumView = mViewHolder.getAlbumView();
+ ImageView albumView = mPlayerViewHolder.getAlbumView();
boolean hasArtwork = data.getArtwork() != null;
if (hasArtwork) {
Drawable artwork = scaleDrawable(data.getArtwork());
@@ -265,7 +287,7 @@
setVisibleAndAlpha(expandedSet, R.id.album_art, hasArtwork);
// App icon
- ImageView appIcon = mViewHolder.getAppIcon();
+ ImageView appIcon = mPlayerViewHolder.getAppIcon();
if (data.getAppIcon() != null) {
appIcon.setImageIcon(data.getAppIcon());
} else {
@@ -273,52 +295,53 @@
}
// Song name
- TextView titleText = mViewHolder.getTitleText();
- titleText.setText(safeCharSequence(data.getSong()));
+
+ TextView titleText = mPlayerViewHolder.getTitleText();
+ titleText.setText(data.getSong());
// App title
- TextView appName = mViewHolder.getAppName();
+ TextView appName = mPlayerViewHolder.getAppName();
appName.setText(data.getApp());
appName.setVisibility(mShowAppName ? View.VISIBLE : View.GONE);
setVisibleAndAlpha(collapsedSet, R.id.app_name, mShowAppName);
setVisibleAndAlpha(expandedSet, R.id.app_name, mShowAppName);
// Artist name
- TextView artistText = mViewHolder.getArtistText();
- artistText.setText(safeCharSequence(data.getArtist()));
+ TextView artistText = mPlayerViewHolder.getArtistText();
+ artistText.setText(data.getArtist());
// Transfer chip
- mViewHolder.getSeamless().setVisibility(View.VISIBLE);
+ mPlayerViewHolder.getSeamless().setVisibility(View.VISIBLE);
setVisibleAndAlpha(collapsedSet, R.id.media_seamless, true /*visible */);
setVisibleAndAlpha(expandedSet, R.id.media_seamless, true /*visible */);
- mViewHolder.getSeamless().setOnClickListener(v -> {
+ mPlayerViewHolder.getSeamless().setOnClickListener(v -> {
mMediaOutputDialogFactory.create(data.getPackageName(), true);
});
- TextView mDeviceName = mViewHolder.getSeamlessText();
+ TextView mDeviceName = mPlayerViewHolder.getSeamlessText();
mDeviceName.setVisibility(mShowDeviceName ? View.VISIBLE : View.GONE);
setVisibleAndAlpha(collapsedSet, R.id.media_seamless_text, mShowDeviceName);
setVisibleAndAlpha(expandedSet, R.id.media_seamless_text, mShowDeviceName);
- ImageView iconView = mViewHolder.getSeamlessIcon();
- TextView deviceName = mViewHolder.getSeamlessText();
+ ImageView iconView = mPlayerViewHolder.getSeamlessIcon();
+ TextView deviceName = mPlayerViewHolder.getSeamlessText();
final MediaDeviceData device = data.getDevice();
- final int seamlessId = mViewHolder.getSeamless().getId();
- final int seamlessFallbackId = mViewHolder.getSeamlessFallback().getId();
+ final int seamlessId = mPlayerViewHolder.getSeamless().getId();
+ final int seamlessFallbackId = mPlayerViewHolder.getSeamlessFallback().getId();
final boolean showFallback = device != null && !device.getEnabled();
final int seamlessFallbackVisibility = showFallback ? View.VISIBLE : View.GONE;
- mViewHolder.getSeamlessFallback().setVisibility(seamlessFallbackVisibility);
+ mPlayerViewHolder.getSeamlessFallback().setVisibility(seamlessFallbackVisibility);
expandedSet.setVisibility(seamlessFallbackId, seamlessFallbackVisibility);
collapsedSet.setVisibility(seamlessFallbackId, seamlessFallbackVisibility);
final int seamlessVisibility = showFallback ? View.GONE : View.VISIBLE;
- mViewHolder.getSeamless().setVisibility(seamlessVisibility);
+ mPlayerViewHolder.getSeamless().setVisibility(seamlessVisibility);
expandedSet.setVisibility(seamlessId, seamlessVisibility);
collapsedSet.setVisibility(seamlessId, seamlessVisibility);
final float seamlessAlpha = data.getResumption() ? DISABLED_ALPHA : 1.0f;
expandedSet.setAlpha(seamlessId, seamlessAlpha);
collapsedSet.setAlpha(seamlessId, seamlessAlpha);
// Disable clicking on output switcher for resumption controls.
- mViewHolder.getSeamless().setEnabled(!data.getResumption());
+ mPlayerViewHolder.getSeamless().setEnabled(!data.getResumption());
if (showFallback) {
iconView.setImageDrawable(null);
deviceName.setText(null);
@@ -346,7 +369,7 @@
List<MediaAction> actionIcons = data.getActions();
for (; i < actionIcons.size() && i < ACTION_IDS.length; i++) {
int actionId = ACTION_IDS[i];
- final ImageButton button = mViewHolder.getAction(actionId);
+ final ImageButton button = mPlayerViewHolder.getAction(actionId);
MediaAction mediaAction = actionIcons.get(i);
button.setImageIcon(mediaAction.getIcon());
button.setContentDescription(mediaAction.getContentDescription());
@@ -377,14 +400,14 @@
// Guts label
boolean isDismissible = data.isClearable();
- mViewHolder.getSettingsText().setText(isDismissible
+ mPlayerViewHolder.getSettingsText().setText(isDismissible
? R.string.controls_media_close_session
: R.string.controls_media_active_session);
// Dismiss
- mViewHolder.getDismissLabel().setAlpha(isDismissible ? 1 : DISABLED_ALPHA);
- mViewHolder.getDismiss().setEnabled(isDismissible);
- mViewHolder.getDismiss().setOnClickListener(v -> {
+ mPlayerViewHolder.getDismissLabel().setAlpha(isDismissible ? 1 : DISABLED_ALPHA);
+ mPlayerViewHolder.getDismiss().setEnabled(isDismissible);
+ mPlayerViewHolder.getDismiss().setOnClickListener(v -> {
if (mKey != null) {
closeGuts();
mKeyguardDismissUtil.executeWhenUnlocked(() -> {
@@ -436,6 +459,78 @@
};
}
+ /** Bind this recommendation view based on the data given. */
+ public void bindRecommendation(
+ @NonNull SmartspaceTarget target,
+ @NonNull int backgroundColor,
+ @Nullable View.OnClickListener callback) {
+ if (mRecommendationViewHolder == null) {
+ return;
+ }
+
+ mRecommendationViewHolder.getRecommendations()
+ .setBackgroundTintList(ColorStateList.valueOf(backgroundColor));
+ mBackgroundColor = backgroundColor;
+
+ List<SmartspaceAction> mediaRecommendationList = target.getIconGrid();
+ if (mediaRecommendationList == null || mediaRecommendationList.isEmpty()) {
+ Log.w(TAG, "Empty media recommendations");
+ return;
+ }
+
+ List<ImageView> mediaCoverItems = mRecommendationViewHolder.getMediaCoverItems();
+ List<ImageView> mediaLogoItems = mRecommendationViewHolder.getMediaLogoItems();
+ List<Integer> mediaCoverItemsResIds = mRecommendationViewHolder.getMediaCoverItemsResIds();
+ List<Integer> mediaLogoItemsResIds = mRecommendationViewHolder.getMediaLogoItemsResIds();
+ ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
+ ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout();
+ int mediaRecommendationNum = Math.min(mediaRecommendationList.size(),
+ MEDIA_RECOMMENDATION_MAX_NUM);
+ for (int i = 0; i < mediaRecommendationNum; i++) {
+ SmartspaceAction recommendation = mediaRecommendationList.get(i);
+ if (recommendation.getIcon() == null) {
+ Log.w(TAG, "No media cover is provided. Skipping this item...");
+ continue;
+ }
+
+ // Get media source app's logo.
+ Bundle extras = recommendation.getExtras();
+ Drawable icon = null;
+ if (extras != null && extras.getString(EXTRAS_MEDIA_SOURCE_PACKAGE_NAME) != null) {
+ // Get the logo from app's package name when applicable.
+ String packageName = extras.getString(EXTRAS_MEDIA_SOURCE_PACKAGE_NAME);
+ try {
+ icon = mContext.getPackageManager().getApplicationIcon(
+ packageName);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "No media source icon can be fetched via package name", e);
+ }
+ } else {
+ Log.w(TAG, "No media source icon is provided. Skipping this item...");
+ continue;
+ }
+
+ // Set up media source app's logo.
+ ImageView mediaSourceLogoImageView = mediaLogoItems.get(i);
+ mediaSourceLogoImageView.setImageDrawable(icon);
+
+ // Set up media item cover.
+ ImageView mediaCoverImageView = mediaCoverItems.get(i);
+ mediaCoverImageView.setImageIcon(recommendation.getIcon());
+
+ // Set up the click listener if applicable.
+ setSmartspaceOnClickListener(mediaCoverImageView, recommendation, callback);
+
+ setVisibleAndAlpha(expandedSet, mediaCoverItemsResIds.get(i), true);
+ setVisibleAndAlpha(expandedSet, mediaLogoItemsResIds.get(i), true);
+ setVisibleAndAlpha(collapsedSet, mediaCoverItemsResIds.get(i), true);
+ setVisibleAndAlpha(collapsedSet, mediaLogoItemsResIds.get(i), true);
+ }
+
+ mController = null;
+ mMediaViewController.refreshState();
+ }
+
/**
* Close the guts for this player.
*
@@ -515,4 +610,24 @@
set.setVisibility(actionId, visible ? ConstraintSet.VISIBLE : ConstraintSet.GONE);
set.setAlpha(actionId, visible ? 1.0f : 0.0f);
}
+
+ private void setSmartspaceOnClickListener(
+ @NonNull View view,
+ @NonNull SmartspaceAction action,
+ @Nullable View.OnClickListener callback) {
+ if (view == null || action == null || action.getIntent() == null) {
+ Log.e(TAG, "No tap action can be set up");
+ return;
+ }
+
+ view.setOnClickListener(v -> {
+ mActivityStarter.postStartActivityDismissingKeyguard(
+ action.getIntent(),
+ 0 /* delay */,
+ buildLaunchAnimatorController(mRecommendationViewHolder.getRecommendations()));
+ if (callback != null) {
+ callback.onClick(v);
+ }
+ });
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt
index aa3699e..2c094b8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt
@@ -16,6 +16,7 @@
package com.android.systemui.media
+import android.app.smartspace.SmartspaceTarget
import javax.inject.Inject
/**
@@ -37,10 +38,18 @@
}
}
+ override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
+ listeners.toSet().forEach { it.onSmartspaceMediaDataLoaded(key, data) }
+ }
+
override fun onMediaDataRemoved(key: String) {
remove(key)
}
+ override fun onSmartspaceMediaDataRemoved(key: String) {
+ listeners.toSet().forEach { it.onSmartspaceMediaDataRemoved(key) }
+ }
+
override fun onMediaDeviceChanged(
key: String,
oldKey: String?,
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
index 1f580a9..a274eab 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
@@ -16,6 +16,7 @@
package com.android.systemui.media
+import android.app.smartspace.SmartspaceTarget
import android.util.Log
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.broadcast.BroadcastDispatcher
@@ -50,6 +51,7 @@
private val allEntries: LinkedHashMap<String, MediaData> = LinkedHashMap()
// The filtered userEntries, which will be a subset of all userEntries in MediaDataManager
private val userEntries: LinkedHashMap<String, MediaData> = LinkedHashMap()
+ private var hasSmartspace: Boolean = false
init {
userTracker = object : CurrentUserTracker(broadcastDispatcher) {
@@ -82,6 +84,11 @@
}
}
+ override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
+ hasSmartspace = true
+ listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data) }
+ }
+
override fun onMediaDataRemoved(key: String) {
allEntries.remove(key)
userEntries.remove(key)?.let {
@@ -92,6 +99,11 @@
}
}
+ override fun onSmartspaceMediaDataRemoved(key: String) {
+ hasSmartspace = false
+ listeners.forEach { it.onSmartspaceMediaDataRemoved(key) }
+ }
+
@VisibleForTesting
internal fun handleUserSwitched(id: Int) {
// If the user changes, remove all current MediaData objects and inform listeners
@@ -127,17 +139,20 @@
mediaKeys.forEach {
mediaDataManager.setTimedOut(it, timedOut = true)
}
+ if (hasSmartspace) {
+ mediaDataManager.dismissSmartspaceRecommendation()
+ }
}
/**
* Are there any media notifications active?
*/
- fun hasActiveMedia() = userEntries.any { it.value.active }
+ fun hasActiveMedia() = userEntries.any { it.value.active } || hasSmartspace
/**
* Are there any media entries we should display?
*/
- fun hasAnyMedia() = userEntries.isNotEmpty()
+ fun hasAnyMedia() = userEntries.isNotEmpty() || hasSmartspace
/**
* Add a listener for filtered [MediaData] changes
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
index 41c9dae..574ce0d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
@@ -18,6 +18,10 @@
import android.app.Notification
import android.app.PendingIntent
+import android.app.smartspace.SmartspaceConfig
+import android.app.smartspace.SmartspaceManager
+import android.app.smartspace.SmartspaceSession
+import android.app.smartspace.SmartspaceTarget
import android.content.BroadcastReceiver
import android.content.ContentResolver
import android.content.Context
@@ -33,6 +37,7 @@
import android.media.session.MediaController
import android.media.session.MediaSession
import android.net.Uri
+import android.os.Parcelable
import android.os.UserHandle
import android.service.notification.StatusBarNotification
import android.text.TextUtils
@@ -45,6 +50,7 @@
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState
import com.android.systemui.statusbar.notification.row.HybridGroupManager
import com.android.systemui.util.Assert
@@ -54,6 +60,7 @@
import java.io.IOException
import java.io.PrintWriter
import java.util.concurrent.Executor
+import java.util.concurrent.Executors
import javax.inject.Inject
// URI fields to try loading album art from
@@ -99,9 +106,16 @@
mediaDataCombineLatest: MediaDataCombineLatest,
private val mediaDataFilter: MediaDataFilter,
private val activityStarter: ActivityStarter,
+ private val smartspaceMediaDataProvider: SmartspaceMediaDataProvider,
private var useMediaResumption: Boolean,
private val useQsMediaPlayer: Boolean
-) : Dumpable {
+) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener {
+
+ companion object {
+ // UI surface label for subscribing Smartspace updates.
+ @JvmField
+ val SMARTSPACE_UI_SURFACE_LABEL = "media_data_manager"
+ }
private val themeText = com.android.settingslib.Utils.getColorAttr(context,
com.android.internal.R.attr.textColorPrimary).defaultColor
@@ -117,6 +131,8 @@
// TODO(b/159539991#comment5): Move internal listeners to separate package.
private val internalListeners: MutableSet<Listener> = mutableSetOf()
private val mediaEntries: LinkedHashMap<String, MediaData> = LinkedHashMap()
+ // There should ONLY be at most one Smartspace media recommendation.
+ private var smartspaceMediaTarget: SmartspaceTarget? = null
internal var appsBlockedFromResume: MutableSet<String> = Utils.getBlockedMediaApps(context)
set(value) {
// Update list
@@ -128,6 +144,7 @@
removeAllForPackage(it)
}
}
+ private var smartspaceSession: SmartspaceSession? = null
@Inject
constructor(
@@ -143,11 +160,13 @@
mediaDeviceManager: MediaDeviceManager,
mediaDataCombineLatest: MediaDataCombineLatest,
mediaDataFilter: MediaDataFilter,
- activityStarter: ActivityStarter
+ activityStarter: ActivityStarter,
+ smartspaceMediaDataProvider: SmartspaceMediaDataProvider
) : this(context, backgroundExecutor, foregroundExecutor, mediaControllerFactory,
broadcastDispatcher, dumpManager, mediaTimeoutListener, mediaResumeListener,
mediaSessionBasedFilter, mediaDeviceManager, mediaDataCombineLatest, mediaDataFilter,
- activityStarter, Utils.useMediaResumption(context), Utils.useQsMediaPlayer(context))
+ activityStarter, smartspaceMediaDataProvider, Utils.useMediaResumption(context),
+ Utils.useQsMediaPlayer(context))
private val appChangeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
@@ -200,9 +219,31 @@
}
// BroadcastDispatcher does not allow filters with data schemes
context.registerReceiver(appChangeReceiver, uninstallFilter)
+
+ // Register for Smartspace data updates.
+ smartspaceMediaDataProvider.registerListener(this)
+ val smartspaceManager: SmartspaceManager =
+ context.getSystemService(SmartspaceManager::class.java)
+ smartspaceSession = smartspaceManager.createSmartspaceSession(
+ SmartspaceConfig.Builder(context, SMARTSPACE_UI_SURFACE_LABEL).build())
+ smartspaceSession?.let {
+ it.registerSmartspaceUpdates(
+ // Use a new thread listening to Smartspace updates instead of using the existing
+ // backgroundExecutor. SmartspaceSession has scheduled routine updates which can be
+ // unpredictable on test simulators, using the backgroundExecutor makes it's hard to
+ // test the threads numbers.
+ // Switch to use backgroundExecutor when SmartspaceSession has a good way to be
+ // mocked.
+ Executors.newCachedThreadPool(),
+ SmartspaceSession.Callback { targets ->
+ smartspaceMediaDataProvider.onTargetsAvailable(targets)
+ })
+ }
+ smartspaceSession?.let { it.requestSmartspaceUpdate() }
}
fun destroy() {
+ smartspaceMediaDataProvider.unregisterListener(this)
context.unregisterReceiver(appChangeReceiver)
}
@@ -309,7 +350,7 @@
private fun addInternalListener(listener: Listener) = internalListeners.add(listener)
/**
- * Notify internal listeners of loaded event.
+ * Notify internal listeners of media loaded event.
*
* External listeners registered with [addListener] will be notified after the event propagates
* through the internal listener pipeline.
@@ -319,7 +360,17 @@
}
/**
- * Notify internal listeners of removed event.
+ * Notify internal listeners of Smartspace media loaded event.
+ *
+ * External listeners registered with [addListener] will be notified after the event propagates
+ * through the internal listener pipeline.
+ */
+ private fun notifySmartspaceMediaDataLoaded(key: String, info: SmartspaceTarget) {
+ internalListeners.forEach { it.onSmartspaceMediaDataLoaded(key, info) }
+ }
+
+ /**
+ * Notify internal listeners of media removed event.
*
* External listeners registered with [addListener] will be notified after the event propagates
* through the internal listener pipeline.
@@ -329,6 +380,16 @@
}
/**
+ * Notify internal listeners of Smartspace media removed event.
+ *
+ * External listeners registered with [addListener] will be notified after the event propagates
+ * through the internal listener pipeline.
+ */
+ private fun notifySmartspaceMediaDataRemoved(key: String) {
+ internalListeners.forEach { it.onSmartspaceMediaDataRemoved(key) }
+ }
+
+ /**
* Called whenever the player has been paused or stopped for a while, or swiped from QQS.
* This will make the player not active anymore, hiding it from QQS and Keyguard.
* @see MediaData.active
@@ -363,6 +424,20 @@
foregroundExecutor.executeDelayed({ removeEntry(key) }, delay)
}
+ /**
+ * Called whenever the recommendation has been expired, or swiped from QQS.
+ * This will make the recommendation view to not be shown anymore during this headphone
+ * connection session.
+ */
+ fun dismissSmartspaceRecommendation() {
+ Log.d(TAG, "Dismissing Smartspace media target")
+ // Do not set smartspaceMediaTarget to null. So the instance is preserved during the entire
+ // headphone connection, and will ONLY be set to null when headphones are disconnected.
+ smartspaceMediaTarget?.let {
+ notifySmartspaceMediaDataRemoved(it.smartspaceTargetId)
+ }
+ }
+
private fun loadMediaDataInBgForResumption(
userId: Int,
desc: MediaDescription,
@@ -601,6 +676,50 @@
}
}
+ override fun onSmartspaceTargetsUpdated(targets: List<Parcelable>) {
+ Log.d(TAG, "My Smartspace media updates are here")
+ val mediaTargets = targets.filterIsInstance<SmartspaceTarget>()
+ when (mediaTargets.size) {
+ 0 -> {
+ Log.d(TAG, "Empty Smartspace media target")
+ smartspaceMediaTarget?.let {
+ Log.d(TAG, "Setting Smartspace media target to null")
+ notifySmartspaceMediaDataRemoved(it.smartspaceTargetId)
+ }
+ smartspaceMediaTarget = null
+ }
+ 1 -> {
+ // TODO(b/182811956): Reactivate the resumable media sessions whose last active
+ // time is within 3 hours.
+ // TODO(b/182813365): Wire this up with MediaTimeoutListener so the session can be
+ // expired after 30 seconds.
+ val newMediaTarget = mediaTargets.get(0)
+ if (smartspaceMediaTarget != null &&
+ smartspaceMediaTarget!!.smartspaceTargetId ==
+ newMediaTarget.smartspaceTargetId) {
+ // The same Smartspace updates can be received. Only send the first one.
+ Log.d(TAG, "Same Smartspace media update exists. Skip loading data.")
+ } else {
+ smartspaceMediaTarget?.let {
+ notifySmartspaceMediaDataRemoved(it.smartspaceTargetId)
+ }
+ notifySmartspaceMediaDataLoaded(
+ newMediaTarget.smartspaceTargetId, newMediaTarget)
+ smartspaceMediaTarget = newMediaTarget
+ }
+ }
+ else -> {
+ // There should NOT be more than 1 Smartspace media update. When it happens, it
+ // indicates a bad state or an error. Reset the status accordingly.
+ Log.wtf(TAG, "More than 1 Smartspace Media Update. Resetting the status...")
+ smartspaceMediaTarget?.let {
+ notifySmartspaceMediaDataRemoved(it.smartspaceTargetId)
+ }
+ smartspaceMediaTarget = null
+ }
+ }
+ }
+
fun onNotificationRemoved(key: String) {
Assert.isMainThread()
val removed = mediaEntries.remove(key)
@@ -685,10 +804,16 @@
*/
fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) {}
+ /** Called whenever there's new Smartspace media data loaded. */
+ fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {}
+
/**
* Called whenever a previously existing Media notification was removed
*/
fun onMediaDataRemoved(key: String) {}
+
+ /** Called whenever a previously existing Smartspace media data was removed. */
+ fun onSmartspaceMediaDataRemoved(key: String) {}
}
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
index 5475a00..30bc8c1 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
@@ -26,7 +26,7 @@
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroupOverlay
-import com.android.systemui.Interpolators
+import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.plugins.statusbar.StatusBarStateController
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
index b74ca28..8c12a30 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
@@ -1,5 +1,6 @@
package com.android.systemui.media
+import android.app.smartspace.SmartspaceTarget
import android.graphics.Rect
import android.util.ArraySet
import android.view.View
@@ -53,9 +54,17 @@
updateViewVisibility()
}
+ override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
+ updateViewVisibility()
+ }
+
override fun onMediaDataRemoved(key: String) {
updateViewVisibility()
}
+
+ override fun onSmartspaceMediaDataRemoved(key: String) {
+ updateViewVisibility()
+ }
}
fun addVisibilityChangeListener(listener: (Boolean) -> Unit) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt
index f695622..d973478 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt
@@ -16,6 +16,7 @@
package com.android.systemui.media
+import android.app.smartspace.SmartspaceTarget
import android.content.ComponentName
import android.content.Context
import android.media.session.MediaController
@@ -134,6 +135,12 @@
}
}
+ override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
+ backgroundExecutor.execute {
+ dispatchSmartspaceMediaDataLoaded(key, data)
+ }
+ }
+
override fun onMediaDataRemoved(key: String) {
// Queue on background thread to ensure ordering of loaded and removed events is maintained.
backgroundExecutor.execute {
@@ -142,6 +149,12 @@
}
}
+ override fun onSmartspaceMediaDataRemoved(key: String) {
+ backgroundExecutor.execute {
+ dispatchSmartspaceMediaDataRemoved(key)
+ }
+ }
+
private fun dispatchMediaDataLoaded(key: String, oldKey: String?, info: MediaData) {
foregroundExecutor.execute {
listeners.toSet().forEach { it.onMediaDataLoaded(key, oldKey, info) }
@@ -154,6 +167,18 @@
}
}
+ private fun dispatchSmartspaceMediaDataLoaded(key: String, info: SmartspaceTarget) {
+ foregroundExecutor.execute {
+ listeners.toSet().forEach { it.onSmartspaceMediaDataLoaded(key, info) }
+ }
+ }
+
+ private fun dispatchSmartspaceMediaDataRemoved(key: String) {
+ foregroundExecutor.execute {
+ listeners.toSet().forEach { it.onSmartspaceMediaDataRemoved(key) }
+ }
+ }
+
private fun handleControllersChanged(controllers: List<MediaController>) {
packageControllers.clear()
controllers.forEach {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
index 92eeed4..7cfe4c4 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
@@ -32,11 +32,16 @@
* with the view instance and keeping the media view states up to date.
*/
class MediaViewController @Inject constructor(
- context: Context,
+ private val context: Context,
private val configurationController: ConfigurationController,
private val mediaHostStatesManager: MediaHostStatesManager
) {
+ /** Indicating the media view controller is for a player or recommendation. */
+ enum class TYPE {
+ PLAYER, RECOMMENDATION
+ }
+
companion object {
@JvmField
val GUTS_ANIMATION_DURATION = 500L
@@ -53,6 +58,7 @@
private var animationDuration: Long = 0
private var animateNextStateChange: Boolean = false
private val measurement = MeasurementOutput(0, 0)
+ private var type: TYPE = TYPE.PLAYER
/**
* A map containing all viewStates for all locations of this mediaState
@@ -181,8 +187,6 @@
private set
init {
- collapsedLayout.load(context, R.xml.media_collapsed)
- expandedLayout.load(context, R.xml.media_expanded)
mediaHostStatesManager.addController(this)
layoutController.sizeChangedListener = { width: Int, height: Int ->
currentWidth = width
@@ -313,7 +317,11 @@
return result
}
- private fun getKey(state: MediaHostState, guts: Boolean, result: CacheKey): CacheKey {
+ private fun getKey(
+ state: MediaHostState,
+ guts: Boolean,
+ result: CacheKey
+ ): CacheKey {
result.apply {
heightMeasureSpec = state.measurementInput?.heightMeasureSpec ?: 0
widthMeasureSpec = state.measurementInput?.widthMeasureSpec ?: 0
@@ -327,7 +335,8 @@
* Attach a view to this controller. This may perform measurements if it's not available yet
* and should therefore be done carefully.
*/
- fun attach(transitionLayout: TransitionLayout) {
+ fun attach(transitionLayout: TransitionLayout, type: TYPE) {
+ updateMediaViewControllerType(type)
this.transitionLayout = transitionLayout
layoutController.attach(transitionLayout)
if (currentEndLocation == -1) {
@@ -426,7 +435,7 @@
viewState: TransitionViewState?,
location: Int,
outState: TransitionViewState
- ) : TransitionViewState? {
+ ): TransitionViewState? {
val result = viewState?.copy(outState) ?: return null
val overrideSize = mediaHostStatesManager.carouselSizes[location]
overrideSize?.let {
@@ -438,6 +447,18 @@
return result
}
+ private fun updateMediaViewControllerType(type: TYPE) {
+ this.type = type
+ if (type == TYPE.PLAYER) {
+ collapsedLayout.load(context, R.xml.media_collapsed)
+ expandedLayout.load(context, R.xml.media_expanded)
+ } else {
+ collapsedLayout.load(context, R.xml.media_recommendation)
+ expandedLayout.load(context, R.xml.media_recommendation)
+ }
+ refreshState()
+ }
+
/**
* Retrieves the [TransitionViewState] and [MediaHostState] of a [@MediaLocation].
* In the event of [location] not being visible, [locationWhenHidden] will be used instead.
diff --git a/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt
new file mode 100644
index 0000000..ac201a8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt
@@ -0,0 +1,80 @@
+/*
+ * 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.media
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.annotation.IntegerRes
+import com.android.systemui.R
+import com.android.systemui.util.animation.TransitionLayout
+
+/** ViewHolder for a Smartspace media recommendation. */
+class RecommendationViewHolder private constructor(itemView: View) {
+
+ val recommendations = itemView as TransitionLayout
+ val mediaCoverItems = listOf<ImageView>(
+ itemView.requireViewById(R.id.media_cover1),
+ itemView.requireViewById(R.id.media_cover2),
+ itemView.requireViewById(R.id.media_cover3),
+ itemView.requireViewById(R.id.media_cover4))
+ val mediaLogoItems = listOf<ImageView>(
+ itemView.requireViewById(R.id.media_logo1),
+ itemView.requireViewById(R.id.media_logo2),
+ itemView.requireViewById(R.id.media_logo3),
+ itemView.requireViewById(R.id.media_logo4))
+ val mediaCoverItemsResIds = listOf<@IntegerRes Int>(
+ R.id.media_cover1,
+ R.id.media_cover2,
+ R.id.media_cover3,
+ R.id.media_cover4)
+ val mediaLogoItemsResIds = listOf<@IntegerRes Int>(
+ R.id.media_logo1,
+ R.id.media_logo2,
+ R.id.media_logo3,
+ R.id.media_logo4)
+
+ init {
+ (recommendations.background as IlluminationDrawable).let { background ->
+ mediaCoverItems.forEach { background.registerLightSource(it) }
+ mediaLogoItems.forEach { background.registerLightSource(it) }
+ }
+ }
+
+ companion object {
+ /**
+ * Creates a PlayerViewHolder.
+ *
+ * @param inflater LayoutInflater to use to inflate the layout.
+ * @param parent Parent of inflated view.
+ */
+ @JvmStatic fun create(inflater: LayoutInflater, parent: ViewGroup):
+ RecommendationViewHolder {
+ val itemView =
+ inflater.inflate(
+ R.layout.media_smartspace_recommendations,
+ parent,
+ false /* attachToRoot */)
+ // Because this media view (a TransitionLayout) is used to measure and layout the views
+ // in various states before being attached to its parent, we can't depend on the default
+ // LAYOUT_DIRECTION_INHERIT to correctly resolve the ltr direction.
+ itemView.layoutDirection = View.LAYOUT_DIRECTION_LOCALE
+ return RecommendationViewHolder(itemView)
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaDataProvider.kt b/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaDataProvider.kt
new file mode 100644
index 0000000..b6c2ef1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaDataProvider.kt
@@ -0,0 +1,39 @@
+package com.android.systemui.media
+
+import android.app.smartspace.SmartspaceTarget
+import com.android.systemui.plugins.BcSmartspaceDataPlugin
+import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener
+import javax.inject.Inject
+
+/** Provides SmartspaceTargets of media types for SystemUI media control. */
+class SmartspaceMediaDataProvider @Inject constructor() : BcSmartspaceDataPlugin {
+
+ private val smartspaceMediaTargetListeners: MutableList<SmartspaceTargetListener> =
+ mutableListOf()
+ private var smartspaceMediaTargets: List<SmartspaceTarget> = listOf()
+
+ override fun registerListener(smartspaceTargetListener: SmartspaceTargetListener) {
+ smartspaceMediaTargetListeners.add(smartspaceTargetListener)
+ }
+
+ override fun unregisterListener(smartspaceTargetListener: SmartspaceTargetListener?) {
+ smartspaceMediaTargetListeners.remove(smartspaceTargetListener)
+ }
+
+ /** Updates Smartspace data and propagates it to any listeners. */
+ override fun onTargetsAvailable(targets: List<SmartspaceTarget>) {
+ // Filter out non-media targets.
+ val mediaTargets = mutableListOf<SmartspaceTarget>()
+ for (target in targets) {
+ val smartspaceTarget = target
+ if (smartspaceTarget.featureType == SmartspaceTarget.FEATURE_MEDIA) {
+ mediaTargets.add(smartspaceTarget)
+ }
+ }
+
+ smartspaceMediaTargets = mediaTargets
+ smartspaceMediaTargetListeners.forEach {
+ it.onSmartspaceTargetsUpdated(smartspaceMediaTargets)
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
index f1d4804..c6373f5 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
@@ -41,8 +41,8 @@
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.media.MediaDevice;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
/**
* Base adapter for media output dialog.
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 339331b..a8c4d6e 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -67,8 +67,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
import com.android.systemui.navigationbar.buttons.ContextualButton;
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java
index 33d1807..4bcb019 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java
@@ -44,8 +44,8 @@
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.navigationbar.buttons.KeyButtonDrawable;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
index a4f5548..4d25079 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
@@ -16,7 +16,7 @@
package com.android.systemui.navigationbar.buttons;
-import static com.android.systemui.Interpolators.LINEAR;
+import static com.android.systemui.animation.Interpolators.LINEAR;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
index cf45f52e..e3e2367 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
@@ -34,8 +34,8 @@
import android.view.ViewConfiguration;
import android.view.animation.Interpolator;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import java.util.ArrayList;
import java.util.HashSet;
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
index ac9f183..9c82989 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
@@ -51,8 +51,8 @@
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.NavigationEdgeBackPlugin;
import com.android.systemui.statusbar.VibratorHelper;
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index 02c12f6..a0b5521 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -29,7 +29,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
-import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Outline;
@@ -60,7 +59,6 @@
private IPeopleManager mPeopleManager;
private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
private INotificationManager mNotificationManager;
- private PackageManager mPackageManager;
private LauncherApps mLauncherApps;
private Context mContext;
private NotificationEntryManager mNotificationEntryManager;
@@ -81,7 +79,6 @@
mContext = getApplicationContext();
mNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- mPackageManager = getPackageManager();
mPeopleManager = IPeopleManager.Stub.asInterface(
ServiceManager.getService(Context.PEOPLE_SERVICE));
mLauncherApps = mContext.getSystemService(LauncherApps.class);
@@ -112,7 +109,7 @@
LinearLayout item = findViewById(R.id.item);
GradientDrawable shape = (GradientDrawable) item.getBackground();
final TypedArray ta = mContext.obtainStyledAttributes(
- new int[] {android.R.attr.colorBackgroundFloating});
+ new int[]{android.R.attr.colorBackgroundFloating});
shape.setColor(ta.getColor(0, Color.WHITE));
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index 3bc91bc..51af47d 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -33,6 +33,7 @@
import static com.android.systemui.people.PeopleSpaceUtils.convertDrawableToBitmap;
import static com.android.systemui.people.PeopleSpaceUtils.getUserId;
+import android.annotation.ColorInt;
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.people.ConversationStatus;
@@ -40,6 +41,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
+import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
@@ -48,12 +50,13 @@
import android.text.TextUtils;
import android.util.IconDrawableFactory;
import android.util.Log;
-import android.util.TypedValue;
+import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.people.widget.LaunchConversationActivity;
import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
@@ -344,10 +347,11 @@
setMaxLines(views);
CharSequence content = mTile.getNotificationContent();
views = setPunctuationRemoteViewsFields(views, content);
- TypedValue typedValue = new TypedValue();
- mContext.getTheme().resolveAttribute(android.R.attr.textColorPrimary, typedValue, true);
- int primaryTextColor = mContext.getColor(typedValue.resourceId);
- views.setInt(R.id.text_content, "setTextColor", primaryTextColor);
+ // TODO(b/184931139): Update to RemoteViews wrapper to set via attribute once available
+ @ColorInt int color = Utils.getColorAttr(mContext,
+ android.R.attr.textColorPrimary).getDefaultColor();
+ views.setInt(R.id.text_content, "setTextColor", color);
+
views.setTextViewText(R.id.text_content, mTile.getNotificationContent());
views.setViewVisibility(R.id.image, View.GONE);
views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_message);
@@ -394,10 +398,9 @@
views.setViewVisibility(R.id.messages_count, View.GONE);
setMaxLines(views);
// Secondary text color for statuses.
- TypedValue typedValue = new TypedValue();
- mContext.getTheme().resolveAttribute(android.R.attr.textColorSecondary, typedValue, true);
- int secondaryTextColor = mContext.getColor(typedValue.resourceId);
- views.setInt(R.id.text_content, "setTextColor", secondaryTextColor);
+ @ColorInt int secondaryColor = Utils.getColorAttr(mContext,
+ android.R.attr.textColorSecondary).getDefaultColor();
+ views.setInt(R.id.text_content, "setTextColor", secondaryColor);
views.setTextViewText(R.id.text_content, statusText);
Icon statusIcon = status.getIcon();
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 117be47..d63dc4a 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -95,6 +95,7 @@
private PeopleManager mPeopleManager;
private NotificationEntryManager mNotificationEntryManager;
private PackageManager mPackageManager;
+ private PeopleSpaceWidgetProvider mPeopleSpaceWidgetProvider;
public UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
@GuardedBy("mLock")
public static Map<PeopleTileKey, PeopleSpaceWidgetProvider.TileConversationListener>
@@ -119,6 +120,7 @@
mPeopleManager = mContext.getSystemService(PeopleManager.class);
mNotificationEntryManager = Dependency.get(NotificationEntryManager.class);
mPackageManager = mContext.getPackageManager();
+ mPeopleSpaceWidgetProvider = new PeopleSpaceWidgetProvider();
}
/**
@@ -129,7 +131,7 @@
AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
PeopleManager peopleManager, LauncherApps launcherApps,
NotificationEntryManager notificationEntryManager, PackageManager packageManager,
- boolean isForTesting) {
+ boolean isForTesting, PeopleSpaceWidgetProvider peopleSpaceWidgetProvider) {
mAppWidgetManager = appWidgetManager;
mIPeopleManager = iPeopleManager;
mPeopleManager = peopleManager;
@@ -137,6 +139,7 @@
mNotificationEntryManager = notificationEntryManager;
mPackageManager = packageManager;
mIsForTesting = isForTesting;
+ mPeopleSpaceWidgetProvider = peopleSpaceWidgetProvider;
}
/**
@@ -616,7 +619,20 @@
return;
}
- mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_ADDED);
+ PeopleTileKey existingKeyIfStored;
+ synchronized (mLock) {
+ existingKeyIfStored = getKeyFromStorageByWidgetId(appWidgetId);
+ }
+ // Delete previous storage if the widget already existed and is just reconfigured.
+ if (existingKeyIfStored.isValid()) {
+ if (DEBUG) Log.d(TAG, "Remove previous storage for widget: " + appWidgetId);
+ deleteWidgets(new int[]{appWidgetId});
+ } else {
+ // Widget newly added.
+ mUiEventLogger.log(
+ PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_ADDED);
+ }
+
synchronized (mLock) {
if (DEBUG) Log.d(TAG, "Add storage for : " + tile.getId());
PeopleTileKey key = new PeopleTileKey(tile);
@@ -634,8 +650,7 @@
PeopleSpaceUtils.updateAppWidgetOptionsAndView(
mAppWidgetManager, mContext, appWidgetId, tile);
- PeopleSpaceWidgetProvider provider = new PeopleSpaceWidgetProvider();
- provider.onUpdate(mContext, mAppWidgetManager, new int[]{appWidgetId});
+ mPeopleSpaceWidgetProvider.onUpdate(mContext, mAppWidgetManager, new int[]{appWidgetId});
}
/** Registers a conversation listener for {@code appWidgetId} if not already registered. */
@@ -644,12 +659,7 @@
// Retrieve storage needed for registration.
PeopleTileKey key;
synchronized (mLock) {
- SharedPreferences widgetSp = mContext.getSharedPreferences(String.valueOf(widgetId),
- Context.MODE_PRIVATE);
- key = new PeopleTileKey(
- widgetSp.getString(SHORTCUT_ID, EMPTY_STRING),
- widgetSp.getInt(USER_ID, INVALID_USER_ID),
- widgetSp.getString(PACKAGE_NAME, EMPTY_STRING));
+ key = getKeyFromStorageByWidgetId(widgetId);
if (!key.isValid()) {
if (DEBUG) Log.w(TAG, "Could not register listener for widget: " + widgetId);
return;
@@ -669,6 +679,20 @@
mContext.getMainExecutor());
}
+ /**
+ * Attempts to get a key from storage for {@code widgetId}, returning null if an invalid key is
+ * found.
+ */
+ private PeopleTileKey getKeyFromStorageByWidgetId(int widgetId) {
+ SharedPreferences widgetSp = mContext.getSharedPreferences(String.valueOf(widgetId),
+ Context.MODE_PRIVATE);
+ PeopleTileKey key = new PeopleTileKey(
+ widgetSp.getString(SHORTCUT_ID, EMPTY_STRING),
+ widgetSp.getInt(USER_ID, INVALID_USER_ID),
+ widgetSp.getString(PACKAGE_NAME, EMPTY_STRING));
+ return key;
+ }
+
/** Deletes all storage, listeners, and caching for {@code appWidgetIds}. */
public void deleteWidgets(int[] appWidgetIds) {
for (int widgetId : appWidgetIds) {
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
index 8ec9b68..dc22dc1 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
@@ -128,9 +128,14 @@
)
} ?: firstLine
newView.requireViewById<TextView>(R.id.text).text = finalText
+ if (element.phoneCall) {
+ newView.requireViewById<View>(R.id.chevron).visibility = View.GONE
+ }
newView.apply {
setTag(element)
- setOnClickListener(clickListener)
+ if (!element.phoneCall) {
+ setOnClickListener(clickListener)
+ }
}
return newView
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 5256bc4..586176f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -24,6 +24,7 @@
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
+import android.view.WindowInsets;
import android.widget.FrameLayout;
import androidx.dynamicanimation.animation.FloatPropertyCompat;
@@ -70,6 +71,7 @@
private boolean mBackgroundVisible;
private int mContentPadding = -1;
private boolean mAnimateBottomOnNextLayout;
+ private int mNavBarInset = 0;
public QSContainerImpl(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -137,6 +139,12 @@
}
@Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ mNavBarInset = insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
+ return super.onApplyWindowInsets(insets);
+ }
+
+ @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// QSPanel will show as many rows as it can (up to TileLayout.MAX_ROWS) such that the
// bottom and footer are inside the screen.
@@ -146,7 +154,7 @@
// subtract its height. We do not care if the collapsed notifications fit in the screen.
int maxQs = getDisplayHeight() - layoutParams.topMargin - layoutParams.bottomMargin
- getPaddingBottom();
-
+ maxQs -= mNavBarInset;
int padding = mPaddingLeft + mPaddingRight + layoutParams.leftMargin
+ layoutParams.rightMargin;
final int qsPanelWidthSpec = getChildMeasureSpec(widthMeasureSpec, padding,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index cb58eff..b95194a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -36,8 +36,8 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 2c5dbcd..670475f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -36,7 +36,6 @@
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Log;
-import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -89,7 +88,7 @@
private Drawable mPrimaryFooterIconDrawable;
@Inject
- QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context,
+ QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView,
UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter,
SecurityController securityController, @Background Looper bgLooper) {
mRootView = rootView;
@@ -98,7 +97,7 @@
mFooterIcon = mRootView.findViewById(R.id.footer_icon);
mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon);
mFooterIconId = R.drawable.ic_info_outline;
- mContext = context;
+ mContext = rootView.getContext();
mMainHandler = mainHandler;
mActivityStarter = activityStarter;
mSecurityController = securityController;
@@ -308,7 +307,7 @@
}
private void createDialog() {
- mDialog = new SystemUIDialog(mContext);
+ mDialog = new SystemUIDialog(mContext, 0); // Use mContext theme
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getNegativeButton(), this);
@@ -344,8 +343,7 @@
final String vpnNameWorkProfile = mSecurityController.getWorkProfileVpnName();
- View dialogView = LayoutInflater.from(
- new ContextThemeWrapper(mContext, R.style.Theme_SystemUI_Dialog))
+ View dialogView = LayoutInflater.from(mContext)
.inflate(R.layout.quick_settings_footer_dialog, null, false);
// device management section
@@ -420,8 +418,7 @@
}
private View createParentalControlsDialogView() {
- View dialogView = LayoutInflater.from(
- new ContextThemeWrapper(mContext, R.style.Theme_SystemUI_Dialog))
+ View dialogView = LayoutInflater.from(mContext)
.inflate(R.layout.quick_settings_footer_dialog_parental_controls, null, false);
DeviceAdminInfo info = mSecurityController.getDeviceAdminInfo();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index b661e2b..3f06312 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -35,8 +35,8 @@
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.qs.QSDetail.Callback;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 6f789d3..30a08c6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -22,7 +22,6 @@
import android.content.res.Configuration;
import android.util.AttributeSet;
import android.util.TypedValue;
-import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
@@ -63,7 +62,7 @@
private boolean mIsShowingNavBackdrop;
public QSCustomizer(Context context, AttributeSet attrs) {
- super(new ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Edit), attrs);
+ super(context, attrs);
LayoutInflater.from(getContext()).inflate(R.layout.qs_customize_panel_content, this);
mClipper = new QSDetailClipper(findViewById(R.id.customize_container));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index 08aa599..006b230 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -52,6 +52,7 @@
import com.android.systemui.qs.customize.TileQueryHelper.TileInfo;
import com.android.systemui.qs.customize.TileQueryHelper.TileStateListener;
import com.android.systemui.qs.dagger.QSScope;
+import com.android.systemui.qs.dagger.QSThemedContext;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.tileimpl.QSIconViewImpl;
import com.android.systemui.qs.tileimpl.QSTileView;
@@ -89,7 +90,7 @@
private final Handler mHandler = new Handler();
private final List<TileInfo> mTiles = new ArrayList<>();
private final ItemTouchHelper mItemTouchHelper;
- private final ItemDecoration mDecoration;
+ private ItemDecoration mDecoration;
private final MarginTileDecoration mMarginDecoration;
private final int mMinNumTiles;
private final QSTileHost mHost;
@@ -112,8 +113,12 @@
private final boolean mUseHorizontalTiles;
@Inject
- public TileAdapter(Context context, QSTileHost qsHost, UiEventLogger uiEventLogger,
- @Named(QS_LABELS_FLAG) boolean useHorizontalTiles) {
+ public TileAdapter(
+ @QSThemedContext Context context,
+ QSTileHost qsHost,
+ UiEventLogger uiEventLogger,
+ @Named(QS_LABELS_FLAG) boolean useHorizontalTiles
+ ) {
mContext = context;
mHost = qsHost;
mUiEventLogger = uiEventLogger;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
index 2363aa4..3a5adce 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
@@ -49,6 +49,22 @@
String QS_SECURITY_FOOTER_VIEW = "qs_security_footer";
String QS_USING_MEDIA_PLAYER = "qs_using_media_player";
+ /**
+ * Provide a context themed using the QS theme
+ */
+ @Provides
+ @QSThemedContext
+ static Context provideThemedContext(@RootView View view) {
+ return view.getContext();
+ }
+
+ /** */
+ @Provides
+ @QSThemedContext
+ static LayoutInflater provideThemedLayoutInflater(@QSThemedContext Context context) {
+ return LayoutInflater.from(context);
+ }
+
/** */
@Provides
@RootView
@@ -109,7 +125,10 @@
@Provides
@QSScope
@Named(QS_SECURITY_FOOTER_VIEW)
- static View providesQSSecurityFooterView(LayoutInflater layoutInflater, QSPanel qsPanel) {
+ static View providesQSSecurityFooterView(
+ @QSThemedContext LayoutInflater layoutInflater,
+ QSPanel qsPanel
+ ) {
return layoutInflater.inflate(R.layout.quick_settings_footer, qsPanel, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
index 75a7e8e..de3be78 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
@@ -34,6 +34,7 @@
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DeviceControlsController;
import com.android.systemui.statusbar.policy.HotspotController;
+import com.android.systemui.statusbar.policy.WalletController;
import com.android.systemui.util.settings.SecureSettings;
import javax.inject.Named;
@@ -63,6 +64,7 @@
CastController castController,
ReduceBrightColorsController reduceBrightColorsController,
DeviceControlsController deviceControlsController,
+ WalletController walletController,
@Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) {
AutoTileManager manager = new AutoTileManager(
context,
@@ -77,6 +79,7 @@
castController,
reduceBrightColorsController,
deviceControlsController,
+ walletController,
isReduceBrightColorsAvailable
);
manager.init();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSThemedContext.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSThemedContext.java
new file mode 100644
index 0000000..a878d4c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSThemedContext.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.dagger;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+
+import javax.inject.Qualifier;
+
+/**
+ * Annotation for themed context in QS
+ */
+@Documented
+@Retention(RUNTIME)
+@Qualifier
+public @interface QSThemedContext {}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index abe3219..7e72f1a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -72,7 +72,6 @@
protected final ImageView mBg;
private final int mColorActive;
private final int mColorInactive;
- private final int mColorDisabled;
private int mCircleColor;
private int mBgSize;
@@ -131,10 +130,9 @@
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
- mColorActive = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent);
- mColorDisabled = Utils.getDisabled(context,
- Utils.getColorAttrDefaultColor(context, android.R.attr.colorControlActivated));
- mColorInactive = Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
+ mColorActive = Utils.getColorAttrDefaultColor(context,
+ com.android.internal.R.attr.colorAccentPrimary);
+ mColorInactive = Utils.getColorAttrDefaultColor(context, R.attr.offStateColor);
setPadding(0, 0, 0, 0);
setClipChildren(false);
@@ -324,7 +322,7 @@
return mColorActive;
case Tile.STATE_INACTIVE:
case Tile.STATE_UNAVAILABLE:
- return mColorDisabled;
+ return mColorInactive;
default:
Log.e(TAG, "Invalid state " + state);
return 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 375c79f..aa8ce85 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -58,9 +58,9 @@
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.Utils;
import com.android.systemui.Dumpable;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
index 78ee896..9e11451 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
@@ -28,21 +28,26 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
-import android.util.IntArray;
import android.util.Log;
import android.util.MathUtils;
import android.util.Range;
+import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.SeekBar;
import androidx.annotation.Nullable;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.customview.widget.ExploreByTouchHelper;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
-import com.android.internal.widget.ExploreByTouchHelper;
import com.android.systemui.R;
+import java.util.List;
+
/**
* CropView has top and bottom draggable crop handles, with a scrim to darken the areas being
* cropped out.
@@ -66,6 +71,7 @@
private int mImageWidth;
private CropBoundary mCurrentDraggingBoundary = CropBoundary.NONE;
+ private int mActivePointerId;
// The starting value of mCurrentDraggingBoundary's crop, used to compute touch deltas.
private float mMovementStartValue;
private float mStartingY; // y coordinate of ACTION_DOWN
@@ -74,6 +80,7 @@
private Range<Float> mMotionRange;
private CropInteractionListener mCropInteractionListener;
+ private final ExploreByTouchHelper mExploreByTouchHelper;
public CropView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
@@ -94,7 +101,8 @@
// 48 dp touchable region around each handle.
mCropTouchMargin = 24 * getResources().getDisplayMetrics().density;
- setAccessibilityDelegate(new AccessibilityHelper());
+ mExploreByTouchHelper = new AccessibilityHelper();
+ ViewCompat.setAccessibilityDelegate(this, mExploreByTouchHelper);
}
@Override
@@ -131,64 +139,88 @@
public boolean onTouchEvent(MotionEvent event) {
int topPx = fractionToVerticalPixels(mCrop.top);
int bottomPx = fractionToVerticalPixels(mCrop.bottom);
- switch (event.getAction()) {
+ switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mCurrentDraggingBoundary = nearestBoundary(event, topPx, bottomPx,
fractionToHorizontalPixels(mCrop.left),
fractionToHorizontalPixels(mCrop.right));
if (mCurrentDraggingBoundary != CropBoundary.NONE) {
+ mActivePointerId = event.getPointerId(0);
mStartingY = event.getY();
mStartingX = event.getX();
mMovementStartValue = getBoundaryPosition(mCurrentDraggingBoundary);
- updateListener(event);
- switch (mCurrentDraggingBoundary) {
- case TOP:
- mMotionRange = new Range<>(0f,
- mCrop.bottom - pixelDistanceToFraction(mCropTouchMargin,
- CropBoundary.BOTTOM));
- break;
- case BOTTOM:
- mMotionRange = new Range<>(
- mCrop.top + pixelDistanceToFraction(mCropTouchMargin,
- CropBoundary.TOP), 1f);
- break;
- case LEFT:
- mMotionRange = new Range<>(0f,
- mCrop.right - pixelDistanceToFraction(mCropTouchMargin,
- CropBoundary.RIGHT));
- break;
- case RIGHT:
- mMotionRange = new Range<>(
- mCrop.left + pixelDistanceToFraction(mCropTouchMargin,
- CropBoundary.LEFT), 1f);
- break;
- }
+ updateListener(MotionEvent.ACTION_DOWN, event.getX());
+ mMotionRange = getAllowedValues(mCurrentDraggingBoundary);
}
return true;
case MotionEvent.ACTION_MOVE:
if (mCurrentDraggingBoundary != CropBoundary.NONE) {
- float deltaPx = isVertical(mCurrentDraggingBoundary) ? event.getY() - mStartingY
- : event.getX() - mStartingX;
- float delta = pixelDistanceToFraction((int) deltaPx, mCurrentDraggingBoundary);
- setBoundaryPosition(mCurrentDraggingBoundary,
- mMotionRange.clamp(mMovementStartValue + delta));
- updateListener(event);
- invalidate();
+ int pointerIndex = event.findPointerIndex(mActivePointerId);
+ if (pointerIndex >= 0) {
+ // Original pointer still active, do the move.
+ float deltaPx = isVertical(mCurrentDraggingBoundary)
+ ? event.getY(pointerIndex) - mStartingY
+ : event.getX(pointerIndex) - mStartingX;
+ float delta = pixelDistanceToFraction((int) deltaPx,
+ mCurrentDraggingBoundary);
+ setBoundaryPosition(mCurrentDraggingBoundary,
+ mMotionRange.clamp(mMovementStartValue + delta));
+ updateListener(MotionEvent.ACTION_MOVE, event.getX(pointerIndex));
+ invalidate();
+ }
return true;
}
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN:
+ if (mActivePointerId == event.getPointerId(event.getActionIndex())
+ && mCurrentDraggingBoundary != CropBoundary.NONE) {
+ updateListener(MotionEvent.ACTION_DOWN, event.getX(event.getActionIndex()));
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_UP:
+ if (mActivePointerId == event.getPointerId(event.getActionIndex())
+ && mCurrentDraggingBoundary != CropBoundary.NONE) {
+ updateListener(MotionEvent.ACTION_UP, event.getX(event.getActionIndex()));
+ return true;
+ }
+ break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
- if (mCurrentDraggingBoundary != CropBoundary.NONE) {
- updateListener(event);
+ if (mCurrentDraggingBoundary != CropBoundary.NONE
+ && mActivePointerId == event.getPointerId(mActivePointerId)) {
+ updateListener(MotionEvent.ACTION_UP, event.getX(0));
+ return true;
}
+ break;
}
return super.onTouchEvent(event);
}
+ @Override
+ public boolean dispatchHoverEvent(MotionEvent event) {
+ return mExploreByTouchHelper.dispatchHoverEvent(event)
+ || super.dispatchHoverEvent(event);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ return mExploreByTouchHelper.dispatchKeyEvent(event)
+ || super.dispatchKeyEvent(event);
+ }
+
+ @Override
+ public void onFocusChanged(boolean gainFocus, int direction,
+ Rect previouslyFocusedRect) {
+ super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+ mExploreByTouchHelper.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+ }
+
/**
* Set the given boundary to the given value without animation.
*/
public void setBoundaryPosition(CropBoundary boundary, float position) {
+ position = (float) getAllowedValues(boundary).clamp(position);
switch (boundary) {
case TOP:
mCrop.top = position;
@@ -280,12 +312,51 @@
mCropInteractionListener = listener;
}
- private void updateListener(MotionEvent event) {
- if (mCropInteractionListener != null && (isVertical(mCurrentDraggingBoundary))) {
+ private Range getAllowedValues(CropBoundary boundary) {
+ switch (boundary) {
+ case TOP:
+ return new Range<>(0f,
+ mCrop.bottom - pixelDistanceToFraction(mCropTouchMargin,
+ CropBoundary.BOTTOM));
+ case BOTTOM:
+ return new Range<>(
+ mCrop.top + pixelDistanceToFraction(mCropTouchMargin,
+ CropBoundary.TOP), 1f);
+ case LEFT:
+ return new Range<>(0f,
+ mCrop.right - pixelDistanceToFraction(mCropTouchMargin,
+ CropBoundary.RIGHT));
+ case RIGHT:
+ return new Range<>(
+ mCrop.left + pixelDistanceToFraction(mCropTouchMargin,
+ CropBoundary.LEFT), 1f);
+ }
+ return null;
+ }
+
+ /**
+ * @param action either ACTION_DOWN, ACTION_UP or ACTION_MOVE.
+ * @param x coordinate of the relevant pointer.
+ */
+ private void updateListener(int action, float x) {
+ if (mCropInteractionListener != null && isVertical(mCurrentDraggingBoundary)) {
float boundaryPosition = getBoundaryPosition(mCurrentDraggingBoundary);
- mCropInteractionListener.onCropMotionEvent(event, mCurrentDraggingBoundary,
- boundaryPosition, fractionToVerticalPixels(boundaryPosition),
- (mCrop.left + mCrop.right) / 2);
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mCropInteractionListener.onCropDragStarted(mCurrentDraggingBoundary,
+ boundaryPosition, fractionToVerticalPixels(boundaryPosition),
+ (mCrop.left + mCrop.right) / 2, x);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ mCropInteractionListener.onCropDragMoved(mCurrentDraggingBoundary,
+ boundaryPosition, fractionToVerticalPixels(boundaryPosition),
+ (mCrop.left + mCrop.right) / 2, x);
+ break;
+ case MotionEvent.ACTION_UP:
+ mCropInteractionListener.onCropDragComplete();
+ break;
+
+ }
}
}
@@ -371,6 +442,8 @@
private static final int TOP_HANDLE_ID = 1;
private static final int BOTTOM_HANDLE_ID = 2;
+ private static final int LEFT_HANDLE_ID = 3;
+ private static final int RIGHT_HANDLE_ID = 4;
AccessibilityHelper() {
super(CropView.this);
@@ -384,62 +457,125 @@
if (Math.abs(y - fractionToVerticalPixels(mCrop.bottom)) < mCropTouchMargin) {
return BOTTOM_HANDLE_ID;
}
- return ExploreByTouchHelper.INVALID_ID;
+ if (y > fractionToVerticalPixels(mCrop.top)
+ && y < fractionToVerticalPixels(mCrop.bottom)) {
+ if (Math.abs(x - fractionToHorizontalPixels(mCrop.left)) < mCropTouchMargin) {
+ return LEFT_HANDLE_ID;
+ }
+ if (Math.abs(x - fractionToHorizontalPixels(mCrop.right)) < mCropTouchMargin) {
+ return RIGHT_HANDLE_ID;
+ }
+ }
+
+ return ExploreByTouchHelper.HOST_ID;
}
@Override
- protected void getVisibleVirtualViews(IntArray virtualViewIds) {
+ protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+ // Add views in traversal order
virtualViewIds.add(TOP_HANDLE_ID);
+ virtualViewIds.add(LEFT_HANDLE_ID);
+ virtualViewIds.add(RIGHT_HANDLE_ID);
virtualViewIds.add(BOTTOM_HANDLE_ID);
}
@Override
protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
- switch (virtualViewId) {
- case TOP_HANDLE_ID:
- event.setContentDescription(
- getResources().getString(R.string.screenshot_top_boundary));
- break;
- case BOTTOM_HANDLE_ID:
- event.setContentDescription(
- getResources().getString(R.string.screenshot_bottom_boundary));
- break;
- }
+ CropBoundary boundary = viewIdToBoundary(virtualViewId);
+ event.setContentDescription(getBoundaryContentDescription(boundary));
}
@Override
protected void onPopulateNodeForVirtualView(int virtualViewId,
- AccessibilityNodeInfo node) {
- switch (virtualViewId) {
- case TOP_HANDLE_ID:
- node.setContentDescription(
- getResources().getString(R.string.screenshot_top_boundary));
- setNodePositions(mCrop.top, node);
- break;
- case BOTTOM_HANDLE_ID:
- node.setContentDescription(
- getResources().getString(R.string.screenshot_bottom_boundary));
- setNodePositions(mCrop.bottom, node);
- break;
- }
+ AccessibilityNodeInfoCompat node) {
+ CropBoundary boundary = viewIdToBoundary(virtualViewId);
+ node.setContentDescription(getBoundaryContentDescription(boundary));
+ setNodePosition(getNodeRect(boundary), node);
- // TODO: need to figure out the full set of actions to support here.
- node.addAction(
- AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK);
- node.setClickable(true);
- node.setFocusable(true);
+ // Intentionally set the class name to SeekBar so that TalkBack uses volume control to
+ // scroll.
+ node.setClassName(SeekBar.class.getName());
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
}
@Override
protected boolean onPerformActionForVirtualView(
int virtualViewId, int action, Bundle arguments) {
- return false;
+ if (action != AccessibilityNodeInfo.ACTION_SCROLL_FORWARD
+ && action != AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
+ return false;
+ }
+ CropBoundary boundary = viewIdToBoundary(virtualViewId);
+ float delta = pixelDistanceToFraction(mCropTouchMargin, boundary);
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD) {
+ delta = -delta;
+ }
+ setBoundaryPosition(boundary, delta + getBoundaryPosition(boundary));
+ invalidateVirtualView(virtualViewId);
+ sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_SELECTED);
+ return true;
}
- private void setNodePositions(float fraction, AccessibilityNodeInfo node) {
- int pixels = fractionToVerticalPixels(fraction);
- Rect rect = new Rect(0, (int) (pixels - mCropTouchMargin),
- getWidth(), (int) (pixels + mCropTouchMargin));
+ private CharSequence getBoundaryContentDescription(CropBoundary boundary) {
+ int template;
+ switch (boundary) {
+ case TOP:
+ template = R.string.screenshot_top_boundary_pct;
+ break;
+ case BOTTOM:
+ template = R.string.screenshot_bottom_boundary_pct;
+ break;
+ case LEFT:
+ template = R.string.screenshot_left_boundary_pct;
+ break;
+ case RIGHT:
+ template = R.string.screenshot_right_boundary_pct;
+ break;
+ default:
+ return "";
+ }
+
+ return getResources().getString(template,
+ Math.round(getBoundaryPosition(boundary) * 100));
+ }
+
+ private CropBoundary viewIdToBoundary(int viewId) {
+ switch (viewId) {
+ case TOP_HANDLE_ID:
+ return CropBoundary.TOP;
+ case BOTTOM_HANDLE_ID:
+ return CropBoundary.BOTTOM;
+ case LEFT_HANDLE_ID:
+ return CropBoundary.LEFT;
+ case RIGHT_HANDLE_ID:
+ return CropBoundary.RIGHT;
+ }
+ return CropBoundary.NONE;
+ }
+
+ private Rect getNodeRect(CropBoundary boundary) {
+ Rect rect;
+ if (isVertical(boundary)) {
+ int pixels = fractionToVerticalPixels(getBoundaryPosition(boundary));
+ rect = new Rect(0, (int) (pixels - mCropTouchMargin),
+ getWidth(), (int) (pixels + mCropTouchMargin));
+ // Top boundary can sometimes go beyond the view, shift it down to compensate so
+ // the area is big enough.
+ if (rect.top < 0) {
+ rect.offset(0, -rect.top);
+ }
+ } else {
+ int pixels = fractionToHorizontalPixels(getBoundaryPosition(boundary));
+ rect = new Rect((int) (pixels - mCropTouchMargin),
+ (int) (fractionToVerticalPixels(mCrop.top) + mCropTouchMargin),
+ (int) (pixels + mCropTouchMargin),
+ (int) (fractionToVerticalPixels(mCrop.bottom) - mCropTouchMargin));
+ }
+ return rect;
+ }
+
+ private void setNodePosition(Rect rect, AccessibilityNodeInfoCompat node) {
node.setBoundsInParent(rect);
int[] pos = new int[2];
getLocationOnScreen(pos);
@@ -452,12 +588,11 @@
* Listen for crop motion events and state.
*/
public interface CropInteractionListener {
- /**
- * Called whenever CropView has a MotionEvent that can impact the position of the crop
- * boundaries.
- */
- void onCropMotionEvent(MotionEvent event, CropBoundary boundary, float boundaryPosition,
- int boundaryPositionPx, float horizontalCenter);
+ void onCropDragStarted(CropBoundary boundary, float boundaryPosition,
+ int boundaryPositionPx, float horizontalCenter, float x);
+ void onCropDragMoved(CropBoundary boundary, float boundaryPosition,
+ int boundaryPositionPx, float horizontalCenter, float x);
+ void onCropDragComplete();
}
static class SavedState extends BaseSavedState {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
index 9ce0eeb..33041d2 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
@@ -207,6 +207,7 @@
mLongScreenshot = longScreenshot;
mPreview.setImageDrawable(mLongScreenshot.getDrawable());
updateImageDimensions();
+ mCropView.setVisibility(View.VISIBLE);
mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
mLongScreenshot.getWidth(), mLongScreenshot.getHeight());
// Original boundaries go from the image tile set's y=0 to y=pageSize, so
@@ -240,6 +241,7 @@
mPreview.setImageDrawable(drawable);
mMagnifierView.setDrawable(drawable, imageResult.bitmap.getWidth(),
imageResult.bitmap.getHeight());
+ mCropView.setVisibility(View.VISIBLE);
mSavedImagePath = imageResult.fileName;
setButtonsEnabled(true);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
index 08cd91c..34b40f7 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
@@ -28,7 +28,6 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewPropertyAnimator;
@@ -148,49 +147,51 @@
}
@Override
- public void onCropMotionEvent(MotionEvent event, CropView.CropBoundary boundary,
- float cropPosition, int cropPositionPx, float horizontalCenter) {
+ public void onCropDragStarted(CropView.CropBoundary boundary, float boundaryPosition,
+ int boundaryPositionPx, float horizontalCenter, float x) {
mCropBoundary = boundary;
mLastCenter = horizontalCenter;
- boolean touchOnRight = event.getX() > getParentWidth() / 2;
+ boolean touchOnRight = x > getParentWidth() / 2;
float translateXTarget = touchOnRight ? 0 : getParentWidth() - getWidth();
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mLastCropPosition = cropPosition;
- setTranslationY(cropPositionPx - getHeight() / 2);
- setPivotX(getWidth() / 2);
- setPivotY(getHeight() / 2);
- setScaleX(0.2f);
- setScaleY(0.2f);
- setAlpha(0f);
- setTranslationX((getParentWidth() - getWidth()) / 2);
- setVisibility(View.VISIBLE);
- mTranslationAnimator =
- animate().alpha(1f).translationX(translateXTarget).scaleX(1f).scaleY(1f);
- mTranslationAnimator.setListener(mTranslationAnimatorListener);
- mTranslationAnimator.start();
- break;
- case MotionEvent.ACTION_MOVE:
- // The touch is near the middle if it's within 10% of the center point.
- // We don't want to animate horizontally if the touch is near the middle.
- boolean nearMiddle = Math.abs(event.getX() - getParentWidth() / 2)
- < getParentWidth() / 10f;
- boolean viewOnLeft = getTranslationX() < (getParentWidth() - getWidth()) / 2;
- if (!nearMiddle && viewOnLeft != touchOnRight && mTranslationAnimator == null) {
- mTranslationAnimator = animate().translationX(translateXTarget);
- mTranslationAnimator.setListener(mTranslationAnimatorListener);
- mTranslationAnimator.start();
- }
- mLastCropPosition = cropPosition;
- setTranslationY(cropPositionPx - getHeight() / 2);
- invalidate();
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- animate().alpha(0).translationX((getParentWidth() - getWidth()) / 2).scaleX(0.2f)
- .scaleY(0.2f).withEndAction(() -> setVisibility(View.INVISIBLE)).start();
- break;
+ mLastCropPosition = boundaryPosition;
+ setTranslationY(boundaryPositionPx - getHeight() / 2);
+ setPivotX(getWidth() / 2);
+ setPivotY(getHeight() / 2);
+ setScaleX(0.2f);
+ setScaleY(0.2f);
+ setAlpha(0f);
+ setTranslationX((getParentWidth() - getWidth()) / 2);
+ setVisibility(View.VISIBLE);
+ mTranslationAnimator =
+ animate().alpha(1f).translationX(translateXTarget).scaleX(1f).scaleY(1f);
+ mTranslationAnimator.setListener(mTranslationAnimatorListener);
+ mTranslationAnimator.start();
+ }
+
+ @Override
+ public void onCropDragMoved(CropView.CropBoundary boundary, float boundaryPosition,
+ int boundaryPositionPx, float horizontalCenter, float x) {
+ boolean touchOnRight = x > getParentWidth() / 2;
+ float translateXTarget = touchOnRight ? 0 : getParentWidth() - getWidth();
+ // The touch is near the middle if it's within 10% of the center point.
+ // We don't want to animate horizontally if the touch is near the middle.
+ boolean nearMiddle = Math.abs(x - getParentWidth() / 2)
+ < getParentWidth() / 10f;
+ boolean viewOnLeft = getTranslationX() < (getParentWidth() - getWidth()) / 2;
+ if (!nearMiddle && viewOnLeft != touchOnRight && mTranslationAnimator == null) {
+ mTranslationAnimator = animate().translationX(translateXTarget);
+ mTranslationAnimator.setListener(mTranslationAnimatorListener);
+ mTranslationAnimator.start();
}
+ mLastCropPosition = boundaryPosition;
+ setTranslationY(boundaryPositionPx - getHeight() / 2);
+ invalidate();
+ }
+
+ @Override
+ public void onCropDragComplete() {
+ animate().alpha(0).translationX((getParentWidth() - getWidth()) / 2).scaleX(0.2f)
+ .scaleY(0.2f).withEndAction(() -> setVisibility(View.INVISIBLE)).start();
}
private Path generateCheckerboard() {
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
index 1961bfc..3ba4646 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
@@ -25,6 +25,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import javax.inject.Inject;
@@ -61,10 +62,10 @@
window.setLayout(
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
-
BrightnessSlider controller = mToggleSliderFactory.create(this, null);
controller.init();
setContentView(controller.getRootView());
+ controller.getRootView().setBackgroundResource(R.drawable.brightness_mirror_background);
mBrightnessController = new BrightnessController(this, controller, mBroadcastDispatcher);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
index 9525975..63179da 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
@@ -18,8 +18,8 @@
import android.view.View;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index 5cebf7c..0378123 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -29,8 +29,8 @@
import com.android.systemui.ExpandHelper;
import com.android.systemui.Gefingerpoken;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.notification.row.ExpandableView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
index f51fbed..ec3a857 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
@@ -97,4 +97,8 @@
public boolean isOngoingCallStatusBarChipEnabled() {
return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip);
}
+
+ public boolean isSmartspaceEnabled() {
+ return mFlagReader.isEnabled(R.bool.flag_smartspace);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
index 4b9d592..54b341f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
@@ -38,8 +38,8 @@
import android.view.animation.Interpolator;
import android.widget.ImageView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.wm.shell.animation.FlingAnimationUtils;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 9804b32..c1eaaaf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -20,7 +20,6 @@
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
-import static com.android.keyguard.KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1;
import static com.android.systemui.DejankUtils.whitelistIpcs;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ALIGNMENT;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BATTERY;
@@ -30,6 +29,7 @@
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_RESTING;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_TRUST;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_USER_LOCKED;
+import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -69,14 +69,15 @@
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.settingslib.Utils;
import com.android.settingslib.fuelgauge.BatteryStatus;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardIndication;
import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -120,6 +121,7 @@
private final @Main DelayableExecutor mExecutor;
private final LockPatternUtils mLockPatternUtils;
private final IActivityManager mIActivityManager;
+ private final FalsingManager mFalsingManager;
protected KeyguardIndicationRotateTextViewController mRotateTextViewController;
private BroadcastReceiver mBroadcastReceiver;
@@ -171,7 +173,8 @@
DevicePolicyManager devicePolicyManager,
IBatteryStats iBatteryStats,
UserManager userManager,
- @Main DelayableExecutor executor) {
+ @Main DelayableExecutor executor,
+ FalsingManager falsingManager) {
mContext = context;
mBroadcastDispatcher = broadcastDispatcher;
mDevicePolicyManager = devicePolicyManager;
@@ -188,6 +191,7 @@
mExecutor = executor;
mLockPatternUtils = new LockPatternUtils(context);
mIActivityManager = ActivityManager.getService();
+ mFalsingManager = falsingManager;
mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
@@ -203,8 +207,7 @@
mRotateTextViewController = new KeyguardIndicationRotateTextViewController(
indicationArea.findViewById(R.id.keyguard_indication_text_bottom),
mExecutor,
- mStatusBarStateController,
- mLockScreenMode);
+ mStatusBarStateController);
updateIndication(false /* animate */);
updateDisclosure();
if (mBroadcastReceiver == null) {
@@ -284,9 +287,7 @@
mRotateTextViewController.hideIndication(INDICATION_TYPE_DISCLOSURE);
}
- if (isKeyguardLayoutEnabled()) {
- updateResting();
- }
+ updateResting();
}
private CharSequence getDisclosureText(@Nullable CharSequence organizationName) {
@@ -306,10 +307,6 @@
}
private void updateOwnerInfo() {
- if (!isKeyguardLayoutEnabled()) {
- mRotateTextViewController.hideIndication(INDICATION_TYPE_OWNER_INFO);
- return;
- }
String info = mLockPatternUtils.getDeviceOwnerInfo();
if (info == null) {
// Use the current user owner information if enabled.
@@ -431,15 +428,7 @@
}
}
- protected boolean isKeyguardLayoutEnabled() {
- return mLockScreenMode == LOCK_SCREEN_MODE_LAYOUT_1;
- }
-
private void updateLogoutView() {
- if (!isKeyguardLayoutEnabled()) {
- mRotateTextViewController.hideIndication(INDICATION_TYPE_LOGOUT);
- return;
- }
final boolean shouldShowLogout = mKeyguardUpdateMonitor.isLogoutEnabled()
&& KeyguardUpdateMonitor.getCurrentUser() != UserHandle.USER_SYSTEM;
if (shouldShowLogout) {
@@ -452,6 +441,9 @@
.setBackground(mContext.getDrawable(
com.android.systemui.R.drawable.logout_button_background))
.setClickListener((view) -> {
+ if (mFalsingManager.isFalseTap(LOW_PENALTY)) {
+ return;
+ }
int currentUserId = KeyguardUpdateMonitor.getCurrentUser();
try {
mIActivityManager.switchUser(UserHandle.USER_SYSTEM);
@@ -651,76 +643,8 @@
}
// LOCK SCREEN
- // Some cases here might need to hide the indication (if the battery is not present)
- int userId = KeyguardUpdateMonitor.getCurrentUser();
-
- if (mLockScreenMode == LOCK_SCREEN_MODE_LAYOUT_1) {
- mTopIndicationView.setVisibility(GONE);
- updateIndications(animate, userId);
- } else {
- boolean hideIndication = false;
- boolean isError = false;
- String trustGrantedIndication = getTrustGrantedIndication();
- String trustManagedIndication = getTrustManagedIndication();
- String powerIndication = null;
-
- if (mPowerPluggedIn || mEnableBatteryDefender) {
- powerIndication = computePowerIndication();
- }
- if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) {
- mTopIndicationView.switchIndication(
- com.android.internal.R.string.lockscreen_storage_locked);
- } else if (!TextUtils.isEmpty(mTransientIndication)) {
- if (powerIndication != null && !mTransientIndication.equals(powerIndication)) {
- String indication = mContext.getResources().getString(
- R.string.keyguard_indication_trust_unlocked_plugged_in,
- mTransientIndication, powerIndication);
- mTopIndicationView.switchIndication(indication, null);
- hideIndication = !mBatteryPresent;
- } else {
- mTopIndicationView.switchIndication(mTransientIndication, null);
- }
- isError = mTransientTextIsError;
- } else if (!TextUtils.isEmpty(trustGrantedIndication)
- && mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
- if (powerIndication != null) {
- String indication = mContext.getResources().getString(
- R.string.keyguard_indication_trust_unlocked_plugged_in,
- trustGrantedIndication, powerIndication);
- mTopIndicationView.switchIndication(indication, null);
- hideIndication = !mBatteryPresent;
- } else {
- mTopIndicationView.switchIndication(trustGrantedIndication, null);
- }
- } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
- mTopIndicationView.switchIndication(mAlignmentIndication, null);
- isError = true;
- hideIndication = !mBatteryPresent;
- } else if (mPowerPluggedIn || mEnableBatteryDefender) {
- if (DEBUG_CHARGING_SPEED) {
- powerIndication += ", " + (mChargingWattage / 1000) + " mW";
- }
- if (animate) {
- animateText(mTopIndicationView, powerIndication);
- } else {
- mTopIndicationView.switchIndication(powerIndication, null);
- }
- hideIndication = !mBatteryPresent;
- } else if (!TextUtils.isEmpty(trustManagedIndication)
- && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId)
- && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
- mTopIndicationView.switchIndication(trustManagedIndication, null);
- } else {
- mTopIndicationView.switchIndication(mRestingIndication, null);
- }
-
- mTopIndicationView.setTextColor(
- isError ? Utils.getColorError(mContext) : mInitialTextColorState);
-
- if (hideIndication) {
- mIndicationArea.setVisibility(GONE);
- }
- }
+ mTopIndicationView.setVisibility(GONE);
+ updateIndications(animate, KeyguardUpdateMonitor.getCurrentUser());
}
// animates textView - textView moves up and bounces down
@@ -883,7 +807,7 @@
@Override
public void onUnlockedChanged() {
- updateIndication(!mDozing);
+ updateIndication(false);
}
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
@@ -1025,7 +949,7 @@
@Override
public void onBiometricRunningStateChanged(boolean running,
BiometricSourceType biometricSourceType) {
- if (running) {
+ if (running && biometricSourceType == BiometricSourceType.FACE) {
// Let's hide any previous messages when authentication starts, otherwise
// multiple auth attempts would overlap.
hideTransientIndication();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
index 563470d..d6921d4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
@@ -13,7 +13,7 @@
import android.graphics.Shader
import android.util.AttributeSet
import android.view.View
-import com.android.systemui.Interpolators
+import com.android.systemui.animation.Interpolators
/**
* Provides methods to modify the various properties of a [LightRevealScrim] to reveal between 0% to
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index c565a271..2726488 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -24,6 +24,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Notification;
+import android.app.smartspace.SmartspaceTarget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
@@ -49,7 +50,7 @@
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.media.MediaData;
@@ -248,6 +249,11 @@
}
@Override
+ public void onSmartspaceMediaDataLoaded(@NonNull String key,
+ @NonNull SmartspaceTarget data) {
+ }
+
+ @Override
public void onMediaDataRemoved(@NonNull String key) {
mNotifPipeline.getAllNotifs()
.stream()
@@ -260,6 +266,9 @@
getDismissedByUserStats(entry));
});
}
+
+ @Override
+ public void onSmartspaceMediaDataRemoved(@NonNull String key) {}
});
}
@@ -313,6 +322,11 @@
}
@Override
+ public void onSmartspaceMediaDataLoaded(@NonNull String key,
+ @NonNull SmartspaceTarget data) {
+ }
+
+ @Override
public void onMediaDataRemoved(@NonNull String key) {
NotificationEntry entry = mEntryManager.getPendingOrActiveNotif(key);
if (entry != null) {
@@ -323,6 +337,9 @@
NotificationListenerService.REASON_CANCEL);
}
}
+
+ @Override
+ public void onSmartspaceMediaDataRemoved(@NonNull String key) {}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index bb6165a..2a46893 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -31,7 +31,7 @@
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.android.systemui.Dumpable
-import com.android.systemui.Interpolators
+import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index b7343f6..84465a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -28,8 +28,8 @@
import android.view.VelocityTracker
import android.view.ViewConfiguration
import com.android.systemui.Gefingerpoken
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 412d342..a00d014 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -53,8 +53,8 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.NotificationIconDozeHelper;
import com.android.systemui.statusbar.notification.NotificationUtils;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 5219ecd..9f59023 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -36,7 +36,7 @@
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.DejankUtils;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
index 7ecdc81..2fa27ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
@@ -25,8 +25,8 @@
import android.view.ViewGroup;
import android.view.animation.Interpolator;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.TransformState;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ExpandAnimationParameters.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ExpandAnimationParameters.kt
index d5835fc..f1479a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ExpandAnimationParameters.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ExpandAnimationParameters.kt
@@ -2,8 +2,8 @@
import android.util.MathUtils
import com.android.internal.annotations.VisibleForTesting
-import com.android.systemui.Interpolators
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator
+import com.android.systemui.animation.ActivityLaunchAnimator
+import com.android.systemui.animation.Interpolators
import kotlin.math.min
/** Parameters for the notifications expand animations. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java
index 82f7c71..76025ab7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java
@@ -21,8 +21,8 @@
import android.view.View;
import android.widget.ImageView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.row.HybridNotificationView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
index e0532c3..c22cd1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
@@ -29,7 +29,7 @@
import com.android.internal.widget.MessagingLinearLayout;
import com.android.internal.widget.MessagingMessage;
import com.android.internal.widget.MessagingPropertyAnimator;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import java.util.ArrayList;
import java.util.HashMap;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java
index 63bb73a..3fc7b13 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java
@@ -24,8 +24,8 @@
import android.view.View;
import android.widget.ImageView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import java.util.function.Consumer;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
index 2f966b4..0b6a5c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
@@ -2,11 +2,11 @@
import android.view.View
import com.android.internal.jank.InteractionJankMonitor
+import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.statusbar.NotificationShadeDepthController
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.statusbar.phone.NotificationPanelViewController
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator
import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController
import kotlin.math.ceil
import kotlin.math.max
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
index 50cbbd5d..c0fbf68 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
@@ -18,7 +18,7 @@
import android.animation.ObjectAnimator
import android.util.FloatProperty
-import com.android.systemui.Interpolators
+import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.StatusBarState
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java
index 3517e24..5d07cac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java
@@ -24,7 +24,7 @@
import android.view.View;
import android.view.animation.Interpolator;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.AnimationFilter;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.ViewState;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
index 20d10d3..74e62b6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
@@ -26,8 +26,8 @@
import com.android.internal.widget.MessagingImageMessage;
import com.android.internal.widget.MessagingPropertyAnimator;
import com.android.internal.widget.ViewClippingUtil;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.ViewTransformationHelper;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt
index 847d1cc..dc16274 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt
@@ -21,8 +21,8 @@
import android.animation.ValueAnimator
import android.view.View
import android.view.ViewGroup
-import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators
/**
* Class to help with fading of view groups without fading one subview
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 17f70cb..78fcf18c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -36,8 +36,8 @@
import com.android.internal.jank.InteractionJankMonitor;
import com.android.settingslib.Utils;
import com.android.systemui.Gefingerpoken;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.FakeShadowView;
import com.android.systemui.statusbar.notification.NotificationUtils;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 2ada281..8fae720 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -73,12 +73,12 @@
import com.android.internal.widget.CallLayout;
import com.android.internal.widget.MessagingLayout;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index 73e0804..3190927 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -29,8 +29,8 @@
import androidx.annotation.Nullable;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
index 14683ec..c0bafb7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
@@ -147,7 +147,7 @@
int status = mFeedbackController.getFeedbackStatus(mEntry);
if (DEBUG) {
sb.append(String.format(
- "[DEBUG]: oldImportance=%d, newImportance=%d, ranking=%d\n\n",
+ "[DEBUG]: oldImportance=%d, newImportance=%d, ranking=%f\n\n",
mRanking.getChannel().getImportance(), mRanking.getImportance(),
mRanking.getRankingScore()));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
index 07d1e68..af8b4d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
@@ -29,9 +29,9 @@
import android.view.View;
import com.android.internal.util.ArrayUtils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.ExpandAnimationParameters;
/**
@@ -284,7 +284,7 @@
mActualWidth = params.getWidth();
float alphaProgress = Interpolators.ALPHA_IN.getInterpolation(
params.getProgress(
- ActivityLaunchAnimator.ANIMATION_DURATION_FADE_OUT_CONTENT /* delay */,
+ ActivityLaunchAnimator.ANIMATION_DELAY_FADE_IN_WINDOW /* delay */,
ActivityLaunchAnimator.ANIMATION_DURATION_FADE_IN_WINDOW /* duration */));
mBackground.setAlpha((int) (mDrawableAlpha * (1.0f - alphaProgress)));
invalidate();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index 8ba036c..fa6f23d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -24,7 +24,7 @@
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static android.provider.Settings.Global.NOTIFICATION_BUBBLES;
-import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN;
+import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN;
import static java.lang.annotation.RetentionPolicy.SOURCE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java
index 8ac5b93..fc296e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java
@@ -34,8 +34,8 @@
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index d12d98e..59a78ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -20,7 +20,7 @@
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
-import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN;
+import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN;
import static java.lang.annotation.RetentionPolicy.SOURCE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
index 2b12119..c3dc700 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
@@ -41,8 +41,8 @@
import android.widget.FrameLayout.LayoutParams;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.AlphaOptimizedImageView;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java
index 1ffb244..bfe352d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java
@@ -46,8 +46,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
index ae1285d..9bbe616 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
@@ -41,9 +41,9 @@
import android.view.animation.PathInterpolator
import android.widget.ImageView
import android.widget.TextView
-import com.android.systemui.Interpolators.LINEAR_OUT_SLOW_IN
import com.android.systemui.Prefs
import com.android.systemui.R
+import com.android.systemui.animation.Interpolators.LINEAR_OUT_SLOW_IN
import com.android.systemui.people.widget.PeopleSpaceWidgetManager
import com.android.systemui.statusbar.notification.row.NotificationConversationInfo.OnConversationSettingsClickListener
import com.android.systemui.statusbar.phone.ShadeController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
index 8d675f8..dba3401 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
@@ -23,7 +23,7 @@
import android.view.animation.Interpolator;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
/**
* A common base class for all views in the notification stack scroller which don't have a
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
index 5a55545..15ca24e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
@@ -36,7 +36,7 @@
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.NotificationExpandButton;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.ViewTransformationHelper;
import com.android.systemui.statusbar.notification.CustomInterpolatorTransformation;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java
index 628c4e2..b95d153 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java
@@ -22,8 +22,8 @@
import android.animation.ValueAnimator;
import android.view.View;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
index 1131a65..ab39de0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
@@ -26,7 +26,7 @@
import android.view.View;
import android.view.animation.Interpolator;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.ShadeViewRefactor;
import com.android.systemui.statusbar.notification.row.ExpandableView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index b28cc14..fb72ac3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -77,8 +77,8 @@
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.ExpandHelper;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DragDownHelper.DragDownCallback;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
index 66a48f1..faeb12c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
@@ -24,8 +24,8 @@
import android.view.animation.Interpolator;
import com.android.keyguard.KeyguardSliceView;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -65,6 +65,8 @@
public static final int ANIMATION_DELAY_HEADS_UP = 120;
public static final int ANIMATION_DELAY_HEADS_UP_CLICKED= 120;
private static final int MAX_STAGGER_COUNT = 5;
+ private static final HeadsUpAppearInterpolator HEADS_UP_APPEAR_INTERPOLATOR =
+ new HeadsUpAppearInterpolator();
private final int mGoToFullShadeAppearingTranslation;
private final int mPulsingAppearingTranslation;
@@ -118,7 +120,7 @@
@Override
public Interpolator getCustomInterpolator(View child, Property property) {
if (mHeadsUpAppearChildren.contains(child) && View.TRANSLATION_Y.equals(property)) {
- return Interpolators.HEADS_UP_APPEAR;
+ return HEADS_UP_APPEAR_INTERPOLATOR;
}
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java
index 3da4e321..df86e20 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java
@@ -26,8 +26,8 @@
import android.view.animation.Interpolator;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.row.ExpandableView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 88e5364..3dd4a3b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -39,6 +39,7 @@
import com.android.systemui.statusbar.policy.DeviceControlsController;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.HotspotController.Callback;
+import com.android.systemui.statusbar.policy.WalletController;
import com.android.systemui.util.UserAwareController;
import com.android.systemui.util.settings.SecureSettings;
@@ -60,6 +61,7 @@
public static final String NIGHT = "night";
public static final String CAST = "cast";
public static final String DEVICE_CONTROLS = "controls";
+ public static final String WALLET = "wallet";
public static final String BRIGHTNESS = "reduce_brightness";
static final String SETTING_SEPARATOR = ":";
@@ -77,6 +79,7 @@
private final NightDisplayListener mNightDisplayListener;
private final CastController mCastController;
private final DeviceControlsController mDeviceControlsController;
+ private final WalletController mWalletController;
private final ReduceBrightColorsController mReduceBrightColorsController;
private final boolean mIsReduceBrightColorsAvailable;
private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>();
@@ -92,6 +95,7 @@
CastController castController,
ReduceBrightColorsController reduceBrightColorsController,
DeviceControlsController deviceControlsController,
+ WalletController walletController,
@Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) {
mContext = context;
mHost = host;
@@ -107,6 +111,7 @@
mReduceBrightColorsController = reduceBrightColorsController;
mIsReduceBrightColorsAvailable = isReduceBrightColorsAvailable;
mDeviceControlsController = deviceControlsController;
+ mWalletController = walletController;
}
/**
@@ -146,6 +151,9 @@
if (!mAutoTracker.isAdded(DEVICE_CONTROLS)) {
mDeviceControlsController.setCallback(mDeviceControlsCallback);
}
+ if (!mAutoTracker.isAdded(WALLET)) {
+ initWalletController();
+ }
int settingsN = mAutoAddSettingList.size();
for (int i = 0; i < settingsN; i++) {
@@ -294,6 +302,16 @@
}
};
+ private void initWalletController() {
+ if (mAutoTracker.isAdded(WALLET)) return;
+ Integer position = mWalletController.getWalletPosition();
+
+ if (position != null) {
+ mHost.addTile(WALLET, position);
+ mAutoTracker.setTileAdded(WALLET);
+ }
+ }
+
@VisibleForTesting
final NightDisplayListener.Callback mNightDisplayCallback =
new NightDisplayListener.Callback() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index c60bbc5..9dce332 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -34,8 +34,8 @@
import android.view.View;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 9d1c609..40e6b40 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -31,8 +31,8 @@
import android.widget.LinearLayout;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index 5dfb22f..2922b4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -25,8 +25,8 @@
import android.view.View;
import android.view.ViewConfiguration;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.KeyguardAffordanceView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index b891e6f..c3325b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -48,8 +48,11 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.MediaStore;
-import android.provider.Settings;
import android.service.media.CameraPrewarmService;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsRequest;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -64,17 +67,20 @@
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.ActivityIntentHelper;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.camera.CameraIntents;
import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.IntentButtonProvider;
import com.android.systemui.plugins.IntentButtonProvider.IntentButton;
import com.android.systemui.plugins.IntentButtonProvider.IntentButton.IconState;
@@ -87,6 +93,9 @@
import com.android.systemui.statusbar.policy.PreviewInflater;
import com.android.systemui.tuner.LockscreenFragment.LockButtonFactory;
import com.android.systemui.tuner.TunerService;
+import com.android.systemui.wallet.ui.WalletActivity;
+
+import java.util.concurrent.Executor;
/**
* Implementation for the bottom area of the Keyguard, including camera/phone affordance and status
@@ -121,7 +130,13 @@
private KeyguardAffordanceView mRightAffordanceView;
private KeyguardAffordanceView mLeftAffordanceView;
+
private ImageView mWalletButton;
+ private boolean mWalletEnabled = false;
+ private boolean mHasCard = false;
+ private WalletCardRetriever mCardRetriever = new WalletCardRetriever();
+ private QuickAccessWalletClient mQuickAccessWalletClient;
+
private ViewGroup mIndicationArea;
private TextView mIndicationText;
private TextView mIndicationTextBottom;
@@ -138,7 +153,7 @@
private AccessibilityController mAccessibilityController;
private StatusBar mStatusBar;
private KeyguardAffordanceHelper mAffordanceHelper;
-
+ private FalsingManager mFalsingManager;
private boolean mUserSetupComplete;
private boolean mPrewarmBound;
private Messenger mPrewarmMessenger;
@@ -170,7 +185,6 @@
private int mBurnInXOffset;
private int mBurnInYOffset;
private ActivityIntentHelper mActivityIntentHelper;
- private int mLockScreenMode;
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
public KeyguardBottomAreaView(Context context) {
@@ -415,10 +429,11 @@
}
private void updateWalletVisibility() {
- if (mDozing) {
+ if (mDozing || !mWalletEnabled) {
mWalletButton.setVisibility(GONE);
} else {
mWalletButton.setVisibility(VISIBLE);
+ mWalletButton.setOnClickListener(this::onWalletClick);
}
}
@@ -871,25 +886,63 @@
return insets;
}
- private void setupWallet() {
- boolean inNewLayout = mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
- boolean settingEnabled = Settings.Global.getInt(mContext.getContentResolver(),
- "controls_lockscreen", 0) == 1;
- if (!inNewLayout || !settingEnabled) {
- mWalletButton.setVisibility(View.GONE);
- return;
- }
-
- // TODO: add image
- // mWalletButton.setImageDrawable(list.get(0).loadIcon());
- updateWalletVisibility();
+ /** Set the falsing manager */
+ public void setFalsingManager(FalsingManager falsingManager) {
+ mFalsingManager = falsingManager;
}
/**
- * Optionally add controls when in the new lockscreen mode
+ * Initialize the wallet feature, only enabling if the feature is enabled within the platform.
*/
- public void onLockScreenModeChanged(int mode) {
- mLockScreenMode = mode;
- setupWallet();
+ public void initWallet(QuickAccessWalletClient client, Executor uiExecutor, boolean enabled) {
+ mQuickAccessWalletClient = client;
+ mWalletEnabled = enabled && client.isWalletFeatureAvailable();
+
+ if (mWalletEnabled) {
+ queryWalletCards(uiExecutor);
+ }
+ updateWalletVisibility();
+ }
+
+ private void queryWalletCards(Executor uiExecutor) {
+ GetWalletCardsRequest request =
+ new GetWalletCardsRequest(1 /* cardWidth */, 1 /* cardHeight */,
+ 1 /* iconSizePx */, 2 /* maxCards */);
+ mQuickAccessWalletClient.getWalletCards(uiExecutor, request, mCardRetriever);
+ }
+
+ private void onWalletClick(View v) {
+ // More coming here; need to inform the user about how to proceed
+ mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY);
+
+ if (mHasCard) {
+ Intent intent = new Intent(mContext, WalletActivity.class)
+ .setAction(Intent.ACTION_VIEW)
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ } else {
+ if (mQuickAccessWalletClient.createWalletIntent() == null) {
+ Log.w(TAG, "Could not get intent of the wallet app.");
+ return;
+ }
+ mActivityStarter.postStartActivityDismissingKeyguard(
+ mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0);
+ }
+ }
+
+ private class WalletCardRetriever implements
+ QuickAccessWalletClient.OnWalletCardsRetrievedCallback {
+
+ @Override
+ public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
+ mHasCard = !response.getWalletCards().isEmpty();
+ updateWalletVisibility();
+ }
+
+ @Override
+ public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
+ mHasCard = false;
+ updateWalletVisibility();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index f12bf7b..481b2db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -25,8 +25,8 @@
import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcherListView;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
index 8970a9a..5085e1c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.keyguard.KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1;
-
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
@@ -31,7 +29,7 @@
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.keyguard.KeyguardIndication;
import java.util.LinkedList;
@@ -40,16 +38,12 @@
* A view to show hints on Keyguard ("Swipe up to unlock", "Tap again to open").
*/
public class KeyguardIndicationTextView extends TextView {
- private static final int FADE_OUT_MILLIS = 200;
- private static final int FADE_IN_MILLIS = 250;
private static final long MSG_DURATION_MILLIS = 600;
private long mNextAnimationTime = 0;
private boolean mAnimationsEnabled = true;
private LinkedList<CharSequence> mMessages = new LinkedList<>();
private LinkedList<KeyguardIndication> mKeyguardIndicationInfo = new LinkedList<>();
- private boolean mUseNewAnimations = false;
-
public KeyguardIndicationTextView(Context context) {
super(context);
}
@@ -67,10 +61,6 @@
super(context, attrs, defStyleAttr, defStyleRes);
}
- public void setLockScreenMode(int lockScreenMode) {
- mUseNewAnimations = lockScreenMode == LOCK_SCREEN_MODE_LAYOUT_1;
- }
-
/**
* Changes the text with an animation and makes sure a single indication is shown long enough.
*/
@@ -148,15 +138,11 @@
}
});
- if (mUseNewAnimations) {
- Animator yTranslate =
- ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, 0, -getYTranslationPixels());
- yTranslate.setDuration(getFadeOutDuration());
- fadeOut.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
- animatorSet.playTogether(fadeOut, yTranslate);
- } else {
- animatorSet.play(fadeOut);
- }
+ Animator yTranslate =
+ ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, 0, -getYTranslationPixels());
+ yTranslate.setDuration(getFadeOutDuration());
+ fadeOut.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
+ animatorSet.playTogether(fadeOut, yTranslate);
return animatorSet;
}
@@ -168,20 +154,16 @@
fadeIn.setDuration(getFadeInDuration());
fadeIn.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
- if (mUseNewAnimations) {
- Animator yTranslate =
- ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, getYTranslationPixels(), 0);
- yTranslate.setDuration(getYInDuration());
- yTranslate.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationCancel(Animator animation) {
- setTranslationY(0);
- }
- });
- animatorSet.playTogether(yTranslate, fadeIn);
- } else {
- animatorSet.play(fadeIn);
- }
+ Animator yTranslate =
+ ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, getYTranslationPixels(), 0);
+ yTranslate.setDuration(getYInDuration());
+ yTranslate.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ setTranslationY(0);
+ }
+ });
+ animatorSet.playTogether(yTranslate, fadeIn);
return animatorSet;
}
@@ -193,26 +175,22 @@
private long getFadeInDelay() {
if (!mAnimationsEnabled) return 0L;
- if (mUseNewAnimations) return 150L;
- return 0L;
+ return 150L;
}
private long getFadeInDuration() {
if (!mAnimationsEnabled) return 0L;
- if (mUseNewAnimations) return 317L;
- return FADE_IN_MILLIS;
+ return 317L;
}
private long getYInDuration() {
if (!mAnimationsEnabled) return 0L;
- if (mUseNewAnimations) return 600L;
- return 0L;
+ return 600L;
}
private long getFadeOutDuration() {
if (!mAnimationsEnabled) return 0L;
- if (mUseNewAnimations) return 167L;
- return FADE_OUT_MILLIS;
+ return 167L;
}
private void setNextAnimationTime(long time) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 3f8e9d3..0694737 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -44,8 +44,8 @@
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
import com.android.systemui.statusbar.policy.BatteryController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index 5b7ffd2..9021b74 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -26,7 +26,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index 0df3347..cc4f901 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -32,8 +32,8 @@
import android.view.ViewTreeObserver.OnPreDrawListener;
import com.android.internal.graphics.ColorUtils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import java.lang.annotation.Retention;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index ac91b70..6b864c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -17,8 +17,8 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.demomode.DemoMode;
import com.android.systemui.demomode.DemoModeController;
@@ -161,15 +161,14 @@
/**
* Called by the Keyguard*ViewController whose view contains the aod icons.
*/
- public void setupAodIcons(@NonNull NotificationIconContainer aodIcons,
- int lockScreenMode) {
+ public void setupAodIcons(@NonNull NotificationIconContainer aodIcons) {
boolean changed = mAodIcons != null;
if (changed) {
mAodIcons.setAnimationsEnabled(false);
mAodIcons.removeAllViews();
}
mAodIcons = aodIcons;
- mAodIcons.setOnLockScreen(true, lockScreenMode);
+ mAodIcons.setOnLockScreen(true);
updateAodIconsVisibility(false /* animate */);
updateAnimations();
if (changed) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 25de551..c09c485 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -35,10 +35,9 @@
import androidx.collection.ArrayMap;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.AlphaOptimizedFrameLayout;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.stack.AnimationFilter;
@@ -151,7 +150,6 @@
private float mActualPaddingStart = NO_VALUE;
private boolean mDozing;
private boolean mOnLockScreen;
- private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
private boolean mInNotificationIconShelf;
private boolean mChangingViewPositions;
private int mAddAnimationStartIndex = -1;
@@ -464,33 +462,6 @@
mFirstVisibleIconState = mIconStates.get(getChildAt(0));
}
- boolean center = mOnLockScreen
- && mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
- if (center && translationX < getLayoutEnd()) {
- float initialTranslation =
- mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation;
-
- float contentWidth = 0;
- if (mLastVisibleIconState != null) {
- contentWidth = mLastVisibleIconState.xTranslation + mIconSize;
- contentWidth = Math.min(getWidth(), contentWidth) - initialTranslation;
- }
- float availableSpace = getLayoutEnd() - getActualPaddingStart();
- float delta = (availableSpace - contentWidth) / 2;
-
- if (firstOverflowIndex != -1) {
- // If we have an overflow, only count those half for centering because the dots
- // don't have a lot of visual weight.
- float deltaIgnoringOverflow = (getLayoutEnd() - mVisualOverflowStart) / 2;
- delta = (deltaIgnoringOverflow + delta) / 2;
- }
- for (int i = 0; i < childCount; i++) {
- View view = getChildAt(i);
- IconState iconState = mIconStates.get(view);
- iconState.xTranslation += delta;
- }
- }
-
if (isLayoutRtl()) {
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
@@ -698,9 +669,8 @@
* Set whether the device is on the lockscreen and which lockscreen mode the device is
* configured to. Depending on these values, the layout of the AOD icons change.
*/
- public void setOnLockScreen(boolean onLockScreen, int lockScreenMode) {
+ public void setOnLockScreen(boolean onLockScreen) {
mOnLockScreen = onLockScreen;
- mLockScreenMode = lockScreenMode;
}
public void setInNotificationIconShelf(boolean inShelf) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 25c1327..6a35293 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -53,6 +53,7 @@
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.UserManager;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.util.Log;
import android.util.MathUtils;
import android.view.DisplayCutout;
@@ -76,7 +77,6 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
-import com.android.keyguard.KeyguardClockSwitchController;
import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardStatusViewController;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -87,8 +87,9 @@
import com.android.keyguard.dagger.KeyguardStatusViewComponent;
import com.android.keyguard.dagger.KeyguardUserSwitcherComponent;
import com.android.systemui.DejankUtils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.FalsingCollector;
@@ -100,7 +101,6 @@
import com.android.systemui.media.MediaDataManager;
import com.android.systemui.media.MediaHierarchyManager;
import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -155,6 +155,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.concurrent.Executor;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -363,6 +364,7 @@
private float mDownX;
private float mDownY;
private int mDisplayCutoutTopInset = 0; // in pixels
+ private int mSplitShadeNotificationsTopPadding;
private final KeyguardClockPositionAlgorithm
mClockPositionAlgorithm =
@@ -517,6 +519,9 @@
private int mOldLayoutDirection;
private NotificationShelfController mNotificationShelfController;
+ private final QuickAccessWalletClient mQuickAccessWalletClient;
+ private final Executor mUiExecutor;
+
private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() {
@@ -578,7 +583,9 @@
NotificationShadeDepthController notificationShadeDepthController,
AmbientState ambientState,
LockIconViewController lockIconViewController,
- FeatureFlags featureFlags) {
+ FeatureFlags featureFlags,
+ QuickAccessWalletClient quickAccessWalletClient,
+ @Main Executor uiExecutor) {
super(view, falsingManager, dozeLog, keyguardStateController,
(SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
statusBarKeyguardViewManager, latencyTracker, flingAnimationUtilsBuilder.get(),
@@ -624,6 +631,8 @@
mScrimController = scrimController;
mUserManager = userManager;
mMediaDataManager = mediaDataManager;
+ mQuickAccessWalletClient = quickAccessWalletClient;
+ mUiExecutor = uiExecutor;
pulseExpansionHandler.setPulseExpandAbortListener(() -> {
if (mQs != null) {
mQs.animateHeaderSlidingOut();
@@ -798,11 +807,6 @@
statusBarViewComponent.getKeyguardStatusBarViewController();
mKeyguarStatusBarViewController.init();
- // Re-associate the clock container with the keyguard clock switch.
- KeyguardClockSwitchController keyguardClockSwitchController =
- statusViewComponent.getKeyguardClockSwitchController();
- keyguardClockSwitchController.setBigClockContainer(mBigClockContainer);
-
if (mKeyguardUserSwitcherController != null) {
// Try to close the switcher so that callbacks are triggered if necessary.
// Otherwise, NPV can get into a state where some of the views are still hidden
@@ -847,6 +851,8 @@
}
public void updateResources() {
+ mSplitShadeNotificationsTopPadding =
+ mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade);
int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width);
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
mShouldUseSplitNotificationShade =
@@ -978,6 +984,9 @@
mKeyguardBottomArea.setAffordanceHelper(mAffordanceHelper);
mKeyguardBottomArea.setStatusBar(mStatusBar);
mKeyguardBottomArea.setUserSetupComplete(mUserSetupComplete);
+ mKeyguardBottomArea.setFalsingManager(mFalsingManager);
+ mKeyguardBottomArea.initWallet(mQuickAccessWalletClient, mUiExecutor,
+ mFeatureFlags.isQuickAccessWalletEnabled());
}
private void updateMaxDisplayedNotifications(boolean recompute) {
@@ -2019,10 +2028,9 @@
}
}
- private float calculateQsTopPadding() {
- // in split shade mode we want notifications to be directly below status bar
+ private float calculateNotificationsTopPadding() {
if (mShouldUseSplitNotificationShade && !mKeyguardShowing) {
- return 0f;
+ return mSplitShadeNotificationsTopPadding;
}
if (mKeyguardShowing && (mQsExpandImmediate
|| mIsExpanding && mQsExpandedWhenExpandingStarted)) {
@@ -2076,7 +2084,8 @@
protected void requestScrollerTopPaddingUpdate(boolean animate) {
- mNotificationStackScrollLayoutController.updateTopPadding(calculateQsTopPadding(), animate);
+ mNotificationStackScrollLayoutController.updateTopPadding(
+ calculateNotificationsTopPadding(), animate);
if (mKeyguardShowing && mKeyguardBypassController.getBypassEnabled()) {
// update the position of the header
updateQsExpansion();
@@ -4056,7 +4065,8 @@
calculatePanelHeightShade(), p);
p.setColor(Color.MAGENTA);
canvas.drawLine(
- 0, calculateQsTopPadding(), mView.getWidth(), calculateQsTopPadding(), p);
+ 0, calculateNotificationsTopPadding(), mView.getWidth(),
+ calculateNotificationsTopPadding(), p);
p.setColor(Color.CYAN);
canvas.drawLine(0, mClockPositionResult.stackScrollerPadding, mView.getWidth(),
mNotificationStackScrollLayoutController.getTopPadding(), p);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
index 936e289..a80e270 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -47,8 +47,8 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
import com.android.systemui.DejankUtils;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.plugins.FalsingManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 681f450..58488ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -497,10 +497,9 @@
return;
}
shiftNotificationsScrim(qsPanelBottomY);
- updateNotificationsScrimAlpha(qsPanelBottomY);
+ updateNotificationsScrimAlpha(expansionFraction, qsPanelBottomY);
if (mQsExpansion != expansionFraction) {
mQsExpansion = expansionFraction;
- Log.d(TAG, "set qs fraction");
boolean relevantState = (mState == ScrimState.SHADE_LOCKED
|| mState == ScrimState.KEYGUARD
|| mState == ScrimState.PULSING
@@ -520,14 +519,14 @@
}
}
- private void updateNotificationsScrimAlpha(int qsPanelBottomY) {
+ private void updateNotificationsScrimAlpha(float qsExpansion, int qsPanelBottomY) {
float newAlpha = 0;
if (qsPanelBottomY > 0) {
float interpolator = 0;
if (mState == ScrimState.UNLOCKED || mState == ScrimState.SHADE_LOCKED) {
interpolator = getInterpolatedFraction();
} else {
- interpolator = mQsExpansion;
+ interpolator = qsExpansion;
}
newAlpha = MathUtils.lerp(0, 1, interpolator);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java
index 1130b6d..9cefded 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java
@@ -28,7 +28,7 @@
import android.view.animation.AnimationUtils;
import com.android.keyguard.AlphaOptimizedImageButton;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
public class SettingsButton extends AlphaOptimizedImageButton {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 19ece62..d386ebd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -148,6 +148,7 @@
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.camera.CameraIntents;
@@ -173,7 +174,6 @@
import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.PluginDependencyProvider;
import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -1372,7 +1372,7 @@
private void setUpPresenter() {
// Set up the initial notification state.
- mActivityLaunchAnimator = new ActivityLaunchAnimator();
+ mActivityLaunchAnimator = new ActivityLaunchAnimator(mContext);
mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider(
mNotificationShadeWindowViewController,
mNotificationPanelViewController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
index d45f64f..2f52158 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
@@ -1,6 +1,6 @@
package com.android.systemui.statusbar.phone
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator
+import com.android.systemui.animation.ActivityLaunchAnimator
/**
* A [ActivityLaunchAnimator.Controller] that takes care of collapsing the status bar at the right
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index 2e918da..3404528 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -45,12 +45,12 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.ActivityIntentHelper;
import com.android.systemui.EventLogTags;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
index d3907ae..a4fd647 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
@@ -61,7 +61,7 @@
companion object {
private const val TAG = "DeviceControlsControllerImpl"
- internal const val QS_PRIORITY_POSITION = 3
+ internal const val QS_PRIORITY_POSITION = 2
internal const val QS_DEFAULT_POSITION = POSITION_AT_END
internal const val PREFS_CONTROLS_SEEDING_COMPLETED = "SeedingCompleted"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java
index 0649478..4dd63be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java
@@ -25,8 +25,8 @@
import androidx.core.graphics.ColorUtils;
import com.android.keyguard.KeyguardConstants;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.qs.tiles.UserDetailItemView;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
index 25e9084..e2c52f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
@@ -40,8 +40,8 @@
import com.android.keyguard.KeyguardVisibilityHelper;
import com.android.keyguard.dagger.KeyguardUserSwitcherScope;
import com.android.settingslib.drawable.CircleFramedDrawable;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java
index a815adf..20b66f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java
@@ -25,7 +25,7 @@
import com.android.keyguard.KeyguardConstants;
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
-import com.android.systemui.Interpolators;
+import com.android.systemui.animation.Interpolators;
/**
* The container for the user switcher on Keyguard.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 6843eb5..f2a0e37 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -80,8 +80,8 @@
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
diff --git a/core/java/android/os/CombinedVibrationEffect.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletController.kt
similarity index 64%
copy from core/java/android/os/CombinedVibrationEffect.aidl
copy to packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletController.kt
index 330733c..eaad477 100644
--- a/core/java/android/os/CombinedVibrationEffect.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletController.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,6 +14,12 @@
* limitations under the License.
*/
-package android.os;
+package com.android.systemui.statusbar.policy
-parcelable CombinedVibrationEffect;
+/**
+ * Supports adding a Quick Access Wallet QS tile
+ */
+interface WalletController {
+ /** @return valid position or null to indicate no tile should be set */
+ fun getWalletPosition(): Int?
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletControllerImpl.kt
new file mode 100644
index 0000000..af12844
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WalletControllerImpl.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy
+
+import android.service.quickaccesswallet.QuickAccessWalletClient
+import android.util.Log
+
+import com.android.systemui.dagger.SysUISingleton
+
+import javax.inject.Inject
+
+/**
+ * Check if the wallet service is available for use, and place the tile.
+ */
+@SysUISingleton
+public class WalletControllerImpl @Inject constructor(
+ private val quickAccessWalletClient: QuickAccessWalletClient
+) : WalletController {
+
+ companion object {
+ private const val TAG = "WalletControllerImpl"
+ internal const val QS_PRIORITY_POSITION = 2
+ }
+
+ /**
+ * @return QS_PRIORITY_POSITION or null to indicate no tile should be set
+ */
+ override fun getWalletPosition(): Int? {
+ return if (quickAccessWalletClient.isWalletServiceAvailable()) {
+ Log.i(TAG, "Setting WalletTile position: $QS_PRIORITY_POSITION")
+ QS_PRIORITY_POSITION
+ } else {
+ Log.i(TAG, "Setting WalletTile position: null")
+ null
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
index 7666022..9fb0453 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
@@ -48,6 +48,8 @@
import com.android.systemui.statusbar.policy.SecurityControllerImpl;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
+import com.android.systemui.statusbar.policy.WalletController;
+import com.android.systemui.statusbar.policy.WalletControllerImpl;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
@@ -120,6 +122,10 @@
/** */
@Binds
+ WalletController provideWalletController(WalletControllerImpl controllerImpl);
+
+ /** */
+ @Binds
NetworkController.AccessPointController provideAccessPointController(
AccessPointControllerImpl accessPointControllerImpl);
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index c9011f4..fdd929c 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -138,19 +138,25 @@
mAcceptColorEvents = false;
}
+ final boolean hadWallpaperColors = mSystemColors != null;
if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
mSystemColors = wallpaperColors;
- if (DEBUG) {
- Log.d(TAG, "got new lock colors: " + wallpaperColors + " where: " + which);
- }
+ if (DEBUG) Log.d(TAG, "got new colors: " + wallpaperColors + " where: " + which);
}
if (mDeviceProvisionedController != null
&& !mDeviceProvisionedController.isCurrentUserSetup()) {
- Log.i(TAG, "Wallpaper color event deferred until setup is finished: "
- + wallpaperColors);
- mDeferredThemeEvaluation = true;
- return;
+ if (hadWallpaperColors) {
+ Log.i(TAG, "Wallpaper color event deferred until setup is finished: "
+ + wallpaperColors);
+ mDeferredThemeEvaluation = true;
+ return;
+ } else {
+ if (DEBUG) {
+ Log.i(TAG, "During user setup, but allowing first color event: had? "
+ + hadWallpaperColors + " has? " + (mSystemColors != null));
+ }
+ }
}
reevaluateSystemTheme(false /* forceReload */);
};
@@ -221,17 +227,31 @@
}
},
UserHandle.USER_ALL);
+
+ if (!mIsMonetEnabled) {
+ return;
+ }
+
mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
// Upon boot, make sure we have the most up to date colors
- mBgExecutor.execute(() -> {
+ Runnable updateColors = () -> {
WallpaperColors systemColor = mWallpaperManager.getWallpaperColors(
WallpaperManager.FLAG_SYSTEM);
mMainExecutor.execute(() -> {
+ if (DEBUG) Log.d(TAG, "Boot colors: " + systemColor);
mSystemColors = systemColor;
reevaluateSystemTheme(false /* forceReload */);
});
- });
+ };
+
+ // Whenever we're going directly to setup wizard, we need to process colors synchronously,
+ // otherwise we'll see some jank when the activity is recreated.
+ if (!mDeviceProvisionedController.isCurrentUserSetup()) {
+ mMainExecutor.execute(updateColors);
+ } else {
+ mBgExecutor.execute(updateColors);
+ }
mWallpaperManager.addOnColorsChangedListener(mOnColorsChangedListener, null,
UserHandle.USER_ALL);
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt
index 9638ac1..0c9b48e 100644
--- a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt
@@ -19,8 +19,7 @@
import android.animation.ValueAnimator
import android.graphics.PointF
import android.util.MathUtils
-import com.android.internal.R.attr.width
-import com.android.systemui.Interpolators
+import com.android.systemui.animation.Interpolators
/**
* The fraction after which we start fading in when going from a gone widget to a visible one
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index a8a3d79c..8459b7b 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -99,9 +99,9 @@
import com.android.internal.graphics.drawable.BackgroundBlurDrawable;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.Prefs;
import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialog;
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
index c1835db..f884687 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
@@ -94,17 +94,15 @@
mHandler,
mUserTracker,
mKeyguardStateController);
- // Clicking the wallet button will open the wallet app if the device is unlocked; bring up
- // the security bouncer otherwise.
- walletView.getWalletButton().setOnClickListener(
- v -> {
- if (mKeyguardStateController.isUnlocked()) {
- mActivityStarter.startActivity(
- mQuickAccessWalletClient.createWalletIntent(), true);
- } else {
- mKeyguardDismissUtil.executeWhenUnlocked(() -> false, false);
- }
- });
+
+ walletView.getAppButton().setOnClickListener(
+ v -> mActivityStarter.startActivity(
+ mQuickAccessWalletClient.createWalletIntent(), true));
+ // Click the action button to re-render the screen when the device is unlocked.
+ if (!mKeyguardStateController.isUnlocked()) {
+ walletView.getActionButton().setOnClickListener(
+ v -> mKeyguardDismissUtil.executeWhenUnlocked(() -> false, false));
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java
index a379394..a3c2699 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java
@@ -54,7 +54,10 @@
private final WalletCardCarousel mCardCarousel;
private final ImageView mIcon;
private final TextView mCardLabel;
- private final Button mWalletButton;
+ // Displays at the bottom of the screen, allow user to enter the default wallet app.
+ private final Button mAppButton;
+ // Displays underneath the carousel, allow user to unlock device, verify card, etc.
+ private final Button mActionButton;
private final Interpolator mInInterpolator;
private final Interpolator mOutInterpolator;
private final float mAnimationTranslationX;
@@ -75,7 +78,8 @@
mCardCarousel.setCardScrollListener(this);
mIcon = requireViewById(R.id.icon);
mCardLabel = requireViewById(R.id.label);
- mWalletButton = requireViewById(R.id.wallet_button);
+ mAppButton = requireViewById(R.id.wallet_app_button);
+ mActionButton = requireViewById(R.id.wallet_action_button);
mErrorView = requireViewById(R.id.error_view);
mEmptyStateView = requireViewById(R.id.wallet_empty_state);
mInInterpolator =
@@ -101,15 +105,6 @@
public void onCardScroll(WalletCardViewInfo centerCard, WalletCardViewInfo nextCard,
float percentDistanceFromCenter) {
CharSequence centerCardText = centerCard.getLabel();
- Drawable icon = centerCard.getIcon();
- if (icon != null) {
- Drawable drawable = resizeDrawable(getResources(), icon);
- drawable.setTint(mContext.getColor(R.color.GM2_blue_600));
- mIcon.setImageDrawable(drawable);
- mIcon.setVisibility(VISIBLE);
- } else {
- mIcon.setVisibility(INVISIBLE);
- }
if (!TextUtils.equals(mCenterCardText, centerCardText)) {
mCenterCardText = centerCardText;
mCardLabel.setText(centerCardText);
@@ -122,16 +117,21 @@
}
}
+ /**
+ * Render and show card carousel view.
+ *
+ * <p>This is called only when {@param data} is not empty.</p>
+ *
+ * @param data a list of wallet cards information.
+ * @param selectedIndex index of the current selected card
+ * @param isDeviceLocked indicates whether the device is locked.
+ */
void showCardCarousel(
List<WalletCardViewInfo> data, int selectedIndex, boolean isDeviceLocked) {
boolean shouldAnimate = mCardCarousel.setData(data, selectedIndex);
mCardCarouselContainer.setVisibility(VISIBLE);
mErrorView.setVisibility(GONE);
- if (isDeviceLocked) {
- mWalletButton.setText(R.string.wallet_button_label_device_locked);
- } else {
- mWalletButton.setText(R.string.wallet_button_label_device_unlocked);
- }
+ renderHeaderIconAndActionButton(data.get(0), isDeviceLocked);
if (shouldAnimate) {
// If the empty state is visible, animate it away and delay the card carousel animation
int emptyStateAnimDelay = 0;
@@ -216,8 +216,12 @@
return mCardCarousel;
}
- Button getWalletButton() {
- return mWalletButton;
+ Button getAppButton() {
+ return mAppButton;
+ }
+
+ Button getActionButton() {
+ return mActionButton;
}
@VisibleForTesting
@@ -235,7 +239,37 @@
return mCardCarouselContainer;
}
- private static Drawable resizeDrawable(Resources resources, Drawable drawable) {
+ private void renderHeaderIconAndActionButton(WalletCardViewInfo walletCard, boolean isLocked) {
+ Drawable icon = resizeDrawable(getResources(), walletCard.getIcon());
+ renderHeaderIcon(icon, isLocked);
+ if (isLocked) {
+ mActionButton.setVisibility(VISIBLE);
+ mActionButton.setText(R.string.wallet_action_button_label_unlock);
+ } else {
+ mActionButton.setVisibility(GONE);
+ }
+ }
+
+ private void renderHeaderIcon(@Nullable Drawable icon, boolean isLocked) {
+ if (icon == null) {
+ mIcon.setVisibility(INVISIBLE);
+ return;
+ }
+ icon.setTint(mContext.getColor(isLocked ? R.color.GM2_grey_800 : R.color.GM2_blue_600));
+ mIcon.setImageDrawable(icon);
+ mIcon.setVisibility(VISIBLE);
+ mIcon.setBackground(
+ mContext.getDrawable(
+ isLocked
+ ? R.drawable.circle_wallet_secondary_56dp
+ : R.drawable.circle_wallet_primary_56dp));
+ }
+
+ @Nullable
+ private static Drawable resizeDrawable(Resources resources, @Nullable Drawable drawable) {
+ if (drawable == null) {
+ return null;
+ }
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
return new BitmapDrawable(resources, Bitmap.createScaledBitmap(
bitmap, CONTACTLESS_ICON_SIZE, CONTACTLESS_ICON_SIZE, true));
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index afeda967..55b80dd 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -38,7 +38,6 @@
import android.app.NotificationManager;
import android.content.Context;
import android.content.res.Configuration;
-import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.notification.NotificationListenerService.RankingMap;
@@ -85,16 +84,13 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
-import java.util.function.Supplier;
/**
* The SysUi side bubbles manager which communicate with other SysUi components.
@@ -252,6 +248,13 @@
mSysuiProxy = new Bubbles.SysuiProxy() {
@Override
+ public void isNotificationShadeExpand(Consumer<Boolean> callback) {
+ sysuiMainExecutor.execute(() -> {
+ callback.accept(mNotificationShadeWindowController.getPanelExpanded());
+ });
+ }
+
+ @Override
public void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback) {
sysuiMainExecutor.execute(() -> {
NotificationEntry entry =
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
index 45b0b59..3fc3d89 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
@@ -186,14 +186,15 @@
WindowManager windowManager,
WindowManagerShellWrapper windowManagerShellWrapper,
LauncherApps launcherApps,
+ TaskStackListenerImpl taskStackListener,
UiEventLogger uiEventLogger,
ShellTaskOrganizer organizer,
@ShellMainThread ShellExecutor mainExecutor,
@ShellMainThread Handler mainHandler) {
return Optional.of(BubbleController.create(context, null /* synchronizer */,
floatingContentCoordinator, statusBarService, windowManager,
- windowManagerShellWrapper, launcherApps, uiEventLogger, organizer,
- mainExecutor, mainHandler));
+ windowManagerShellWrapper, launcherApps, taskStackListener,
+ uiEventLogger, organizer, mainExecutor, mainHandler));
}
//
@@ -334,10 +335,12 @@
SyncTransactionQueue syncQueue, Context context,
RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
@ShellMainThread ShellExecutor mainExecutor,
- DisplayImeController displayImeController) {
+ DisplayImeController displayImeController, Transitions transitions,
+ TransactionPool transactionPool) {
if (ActivityTaskManager.supportsSplitScreenMultiWindow(context)) {
return Optional.of(new SplitScreenController(shellTaskOrganizer, syncQueue, context,
- rootTaskDisplayAreaOrganizer, mainExecutor, displayImeController));
+ rootTaskDisplayAreaOrganizer, mainExecutor, displayImeController, transitions,
+ transactionPool));
} else {
return Optional.empty();
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index 70a7b7a..9017dd2 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -18,29 +18,36 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
+import android.util.AttributeSet;
import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
+import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
+import com.android.systemui.statusbar.policy.BatteryController;
import org.junit.Before;
import org.junit.Test;
@@ -50,6 +57,8 @@
import org.mockito.MockitoAnnotations;
import org.mockito.verification.VerificationMode;
+import java.util.concurrent.Executor;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
@@ -78,6 +87,18 @@
ContentResolver mContentResolver;
@Mock
BroadcastDispatcher mBroadcastDispatcher;
+ @Mock
+ private PluginManager mPluginManager;
+ @Mock
+ private FeatureFlags mFeatureFlags;
+ @Mock
+ private Executor mExecutor;
+ @Mock
+ private AnimatableClockView mClockView;
+ @Mock
+ private AnimatableClockView mLargeClockView;
+ @Mock
+ BatteryController mBatteryController;
private KeyguardClockSwitchController mController;
@@ -85,8 +106,16 @@
public void setup() {
MockitoAnnotations.initMocks(this);
- when(mView.findViewById(com.android.systemui.R.id.left_aligned_notification_icon_container))
+ when(mView.findViewById(R.id.left_aligned_notification_icon_container))
.thenReturn(mNotificationIcons);
+ when(mView.getContext()).thenReturn(getContext());
+
+ when(mView.findViewById(R.id.animatable_clock_view)).thenReturn(mClockView);
+ when(mView.findViewById(R.id.animatable_clock_view_large)).thenReturn(mLargeClockView);
+ when(mClockView.getContext()).thenReturn(getContext());
+ when(mLargeClockView.getContext()).thenReturn(getContext());
+
+ when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
when(mView.isAttachedToWindow()).thenReturn(true);
when(mResources.getString(anyInt())).thenReturn("h:mm");
mController = new KeyguardClockSwitchController(
@@ -98,7 +127,11 @@
mKeyguardSliceViewController,
mNotificationIconAreaController,
mContentResolver,
- mBroadcastDispatcher);
+ mBroadcastDispatcher,
+ mPluginManager,
+ mFeatureFlags,
+ mExecutor,
+ mBatteryController);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);
@@ -144,33 +177,11 @@
listenerArgumentCaptor.getValue().onViewDetachedFromWindow(mView);
- verify(mStatusBarStateController).removeCallback(
- any(StatusBarStateController.StateListener.class));
verify(mColorExtractor).removeOnColorsChangedListener(
any(ColorExtractor.OnColorsChangedListener.class));
}
@Test
- public void testBigClockPassesStatusBarState() {
- ViewGroup testView = new FrameLayout(mContext);
-
- mController.init();
- when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
- mController.setBigClockContainer(testView);
- verify(mView).setBigClockContainer(testView, StatusBarState.SHADE);
-
-
- when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
- mController.setBigClockContainer(testView);
- verify(mView).setBigClockContainer(testView, StatusBarState.KEYGUARD);
-
-
- when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED);
- mController.setBigClockContainer(testView);
- verify(mView).setBigClockContainer(testView, StatusBarState.SHADE_LOCKED);
- }
-
- @Test
public void testPluginPassesStatusBarState() {
ArgumentCaptor<ClockManager.ClockChangedListener> listenerArgumentCaptor =
ArgumentCaptor.forClass(ClockManager.ClockChangedListener.class);
@@ -182,13 +193,58 @@
verify(mView).setClockPlugin(mClockPlugin, StatusBarState.SHADE);
}
+ @Test
+ public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() {
+ mController.init();
+
+ View statusArea = mock(View.class);
+ when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);
+
+ View nic = mock(View.class);
+ when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
+ when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));
+
+ BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
+ TestView view = mock(TestView.class);
+ when(plugin.getView(any())).thenReturn(view);
+
+ mController.mPluginListener.onPluginConnected(plugin, mContext);
+ verify(statusArea).setVisibility(View.GONE);
+ }
+
+ @Test
+ public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() {
+ mController.init();
+
+ View statusArea = mock(View.class);
+ when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);
+
+ View nic = mock(View.class);
+ when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
+ when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));
+
+ BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
+ TestView view = mock(TestView.class);
+ when(plugin.getView(any())).thenReturn(view);
+
+ mController.mPluginListener.onPluginConnected(plugin, mContext);
+ mController.mPluginListener.onPluginDisconnected(plugin);
+ verify(statusArea).setVisibility(View.VISIBLE);
+ }
+
private void verifyAttachment(VerificationMode times) {
verify(mClockManager, times).addOnClockChangedListener(
any(ClockManager.ClockChangedListener.class));
- verify(mStatusBarStateController, times).addCallback(
- any(StatusBarStateController.StateListener.class));
verify(mColorExtractor, times).addOnColorsChangedListener(
any(ColorExtractor.OnColorsChangedListener.class));
verify(mView, times).updateColors(mGradientColors);
}
+
+ private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView {
+ TestView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void registerDataProvider(BcSmartspaceDataPlugin plugin) { }
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
index e793079..10ed1d7 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
@@ -21,9 +21,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -33,7 +31,6 @@
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
-import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -48,8 +45,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@@ -59,14 +54,13 @@
// the keyguard_clcok_switch layout is inflated.
@RunWithLooper(setAsMainLooper = true)
public class KeyguardClockSwitchTest extends SysuiTestCase {
- private FrameLayout mClockContainer;
- private FrameLayout mBigClockContainer;
+ private FrameLayout mClockFrame;
+ private FrameLayout mLargeClockFrame;
private TextClock mBigClock;
- @Mock
- TextClock mClockView;
+ private AnimatableClockView mClockView;
+ private AnimatableClockView mLargeClockView;
View mMockKeyguardSliceView;
- @InjectMocks
KeyguardClockSwitch mKeyguardClockSwitch;
@Before
@@ -95,11 +89,12 @@
});
mKeyguardClockSwitch =
(KeyguardClockSwitch) layoutInflater.inflate(R.layout.keyguard_clock_switch, null);
- mClockContainer = mKeyguardClockSwitch.findViewById(R.id.clock_view);
- mBigClockContainer = new FrameLayout(getContext());
+ mClockFrame = mKeyguardClockSwitch.findViewById(R.id.lockscreen_clock_view);
+ mClockView = mKeyguardClockSwitch.findViewById(R.id.animatable_clock_view);
+ mLargeClockFrame = mKeyguardClockSwitch.findViewById(R.id.lockscreen_clock_view_large);
+ mLargeClockView = mKeyguardClockSwitch.findViewById(R.id.animatable_clock_view_large);
mBigClock = new TextClock(getContext());
MockitoAnnotations.initMocks(this);
- when(mClockView.getPaint()).thenReturn(mock(TextPaint.class));
}
@Test
@@ -110,33 +105,28 @@
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- verify(mClockView).setVisibility(GONE);
- assertThat(plugin.getView().getParent()).isEqualTo(mClockContainer);
+ assertThat(mClockView.getVisibility()).isEqualTo(GONE);
+ assertThat(plugin.getView().getParent()).isEqualTo(mClockFrame);
}
@Test
public void onPluginConnected_showPluginBigClock() {
- // GIVEN that the container for the big clock has visibility GONE
- mBigClockContainer.setVisibility(GONE);
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // AND the plugin returns a view for the big clock
+ // GIVEN the plugin returns a view for the big clock
ClockPlugin plugin = mock(ClockPlugin.class);
when(plugin.getBigClockView()).thenReturn(mBigClock);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
// WHEN the plugin is connected
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
// THEN the big clock container is visible and it is the parent of the
// big clock view.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBigClock.getParent()).isEqualTo(mBigClockContainer);
+ assertThat(mLargeClockView.getVisibility()).isEqualTo(View.GONE);
+ assertThat(mBigClock.getParent()).isEqualTo(mLargeClockFrame);
}
@Test
public void onPluginConnected_nullView() {
ClockPlugin plugin = mock(ClockPlugin.class);
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- verify(mClockView, never()).setVisibility(GONE);
+ assertThat(mClockView.getVisibility()).isEqualTo(VISIBLE);
}
@Test
@@ -150,7 +140,7 @@
when(plugin2.getView()).thenReturn(new TextClock(getContext()));
mKeyguardClockSwitch.setClockPlugin(plugin2, StatusBarState.KEYGUARD);
// THEN only the view from the second plugin should be a child of KeyguardClockSwitch.
- assertThat(plugin2.getView().getParent()).isEqualTo(mClockContainer);
+ assertThat(plugin2.getView().getParent()).isEqualTo(mClockFrame);
assertThat(plugin1.getView().getParent()).isNull();
}
@@ -170,33 +160,28 @@
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- mClockView.setVisibility(GONE);
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- mKeyguardClockSwitch.setClockPlugin(null, StatusBarState.KEYGUARD);
+ assertThat(mClockView.getVisibility()).isEqualTo(GONE);
- verify(mClockView).setVisibility(VISIBLE);
+ mKeyguardClockSwitch.setClockPlugin(null, StatusBarState.KEYGUARD);
+ assertThat(mClockView.getVisibility()).isEqualTo(VISIBLE);
+
assertThat(plugin.getView().getParent()).isNull();
}
@Test
public void onPluginDisconnected_hidePluginBigClock() {
- // GIVEN that the big clock container is visible
- FrameLayout bigClockContainer = new FrameLayout(getContext());
- bigClockContainer.setVisibility(VISIBLE);
- mKeyguardClockSwitch.setBigClockContainer(bigClockContainer, StatusBarState.KEYGUARD);
- // AND the plugin returns a view for the big clock
+ // GIVEN the plugin returns a view for the big clock
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getBigClockView()).thenReturn(pluginView);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
// WHEN the plugin is connected and then disconnected
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
mKeyguardClockSwitch.setClockPlugin(null, StatusBarState.KEYGUARD);
// THEN the big lock container is GONE and the big clock view doesn't have
// a parent.
- assertThat(bigClockContainer.getVisibility()).isEqualTo(GONE);
+ assertThat(mLargeClockView.getVisibility()).isEqualTo(VISIBLE);
assertThat(pluginView.getParent()).isNull();
}
@@ -205,7 +190,7 @@
ClockPlugin plugin = mock(ClockPlugin.class);
mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
mKeyguardClockSwitch.setClockPlugin(null, StatusBarState.KEYGUARD);
- verify(mClockView, never()).setVisibility(GONE);
+ assertThat(mClockView.getVisibility()).isEqualTo(VISIBLE);
}
@Test
@@ -220,7 +205,7 @@
// WHEN the second plugin is disconnected
mKeyguardClockSwitch.setClockPlugin(null, StatusBarState.KEYGUARD);
// THEN the default clock should be shown.
- verify(mClockView).setVisibility(VISIBLE);
+ assertThat(mClockView.getVisibility()).isEqualTo(VISIBLE);
assertThat(plugin1.getView().getParent()).isNull();
assertThat(plugin2.getView().getParent()).isNull();
}
@@ -238,13 +223,6 @@
}
@Test
- public void setTextColor_defaultClockSetTextColor() {
- mKeyguardClockSwitch.setTextColor(Color.YELLOW);
-
- verify(mClockView).setTextColor(Color.YELLOW);
- }
-
- @Test
public void setTextColor_pluginClockSetTextColor() {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
@@ -256,16 +234,6 @@
verify(plugin).setTextColor(Color.WHITE);
}
- @Test
- public void setStyle_defaultClockSetStyle() {
- TextPaint paint = mock(TextPaint.class);
- Style style = mock(Style.class);
- doReturn(paint).when(mClockView).getPaint();
-
- mKeyguardClockSwitch.setStyle(style);
-
- verify(paint).setStyle(style);
- }
@Test
public void setStyle_pluginClockSetStyle() {
@@ -279,98 +247,4 @@
verify(plugin).setStyle(style);
}
-
- @Test
- public void onStateChanged_GoneInShade() {
- // GIVEN that the big clock container is visible
- mBigClockContainer.setVisibility(View.VISIBLE);
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // WHEN transitioned to SHADE state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.SHADE);
- // THEN the container is gone.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void onStateChanged_VisibleInKeyguard() {
- // GIVEN that the big clock container is gone
- mBigClockContainer.setVisibility(View.GONE);
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // AND GIVEN that a plugin is active.
- ClockPlugin plugin = mock(ClockPlugin.class);
- when(plugin.getBigClockView()).thenReturn(mBigClock);
- mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- // WHEN transitioned to KEYGUARD state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
- // THEN the container is visible.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void setBigClockContainer_visible() {
- // GIVEN that the big clock container is visible
- mBigClockContainer.setVisibility(View.VISIBLE);
- // AND GIVEN that a plugin is active.
- ClockPlugin plugin = mock(ClockPlugin.class);
- when(plugin.getBigClockView()).thenReturn(mBigClock);
- mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
- // WHEN the container is associated with the clock switch
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // THEN the container remains visible.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void setBigClockContainer_gone() {
- // GIVEN that the big clock container is gone
- mBigClockContainer.setVisibility(View.GONE);
- // AND GIVEN that a plugin is active.
- ClockPlugin plugin = mock(ClockPlugin.class);
- when(plugin.getBigClockView()).thenReturn(mBigClock);
- mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
- // WHEN the container is associated with the clock switch
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // THEN the container is made visible.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void setKeyguardHidingBigClock_gone() {
- // GIVEN that the container for the big clock has visibility GONE
- mBigClockContainer.setVisibility(GONE);
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // AND the plugin returns a view for the big clock
- ClockPlugin plugin = mock(ClockPlugin.class);
- when(plugin.getBigClockView()).thenReturn(mBigClock);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
- // WHEN the plugin is connected
- mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- // WHEN the container set hiding clock as true
- mKeyguardClockSwitch.setKeyguardHidingBigClock(true);
- // THEN the container is gone.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void setKeyguardHidingBigClock_visible() {
- // GIVEN that the container for the big clock has visibility GONE
- mBigClockContainer.setVisibility(GONE);
- mKeyguardClockSwitch.setBigClockContainer(mBigClockContainer, StatusBarState.KEYGUARD);
- // AND the plugin returns a view for the big clock
- ClockPlugin plugin = mock(ClockPlugin.class);
- when(plugin.getBigClockView()).thenReturn(mBigClock);
- // AND in the keyguard state
- mKeyguardClockSwitch.updateBigClockVisibility(StatusBarState.KEYGUARD);
- // WHEN the plugin is connected
- mKeyguardClockSwitch.setClockPlugin(plugin, StatusBarState.KEYGUARD);
- // WHEN the container set hiding clock as false
- mKeyguardClockSwitch.setKeyguardHidingBigClock(false);
- // THEN the container is made visible.
- assertThat(mBigClockContainer.getVisibility()).isEqualTo(View.VISIBLE);
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
index 0074dbe..49f1655 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
@@ -23,7 +23,6 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -50,8 +49,6 @@
@Mock
ConfigurationController mConfigurationController;
@Mock
- NotificationIconAreaController mNotificationIconAreaController;
- @Mock
DozeParameters mDozeParameters;
private KeyguardStatusViewController mController;
@@ -67,7 +64,6 @@
mKeyguardStateController,
mKeyguardUpdateMonitor,
mConfigurationController,
- mNotificationIconAreaController,
mDozeParameters);
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt
index 7b4f14d..ad7f0cb 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt
@@ -16,6 +16,7 @@
package com.android.keyguard
+import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.testing.AndroidTestingRunner
import android.text.Layout
@@ -25,7 +26,9 @@
import com.android.systemui.SysuiTestCase
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
import org.mockito.Mockito.`when`
+import org.mockito.Mockito.eq
import org.mockito.Mockito.inOrder
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
@@ -107,4 +110,34 @@
// Then, animation start should not be called.
verify(valueAnimator, never()).start()
}
+
+ @Test
+ fun testAnimationEnded() {
+ val layout = makeLayout("Hello, World", PAINT)
+ val valueAnimator = mock(ValueAnimator::class.java)
+ val textInterpolator = mock(TextInterpolator::class.java)
+ val paint = mock(TextPaint::class.java)
+ `when`(textInterpolator.targetPaint).thenReturn(paint)
+ val animationEndCallback = mock(Runnable::class.java)
+
+ val textAnimator = TextAnimator(layout, {}).apply {
+ this.textInterpolator = textInterpolator
+ this.animator = valueAnimator
+ }
+
+ textAnimator.setTextStyle(
+ weight = 400,
+ animate = true,
+ onAnimationEnd = animationEndCallback
+ )
+
+ // Verify animationEnd callback has been added.
+ val captor = ArgumentCaptor.forClass(AnimatorListenerAdapter::class.java)
+ verify(valueAnimator).addListener(captor.capture())
+ captor.value.onAnimationEnd(valueAnimator)
+
+ // Verify animationEnd callback has been invoked and removed.
+ verify(animationEndCallback).run()
+ verify(valueAnimator).removeListener(eq(captor.value))
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
similarity index 95%
rename from packages/SystemUI/tests/src/com/android/systemui/plugins/animation/ActivityLaunchAnimatorTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
index 722b0b1..6420c4e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/animation/ActivityLaunchAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
@@ -1,4 +1,4 @@
-package com.android.systemui.plugins.animation
+package com.android.systemui.animation
import android.app.ActivityManager
import android.app.WindowConfiguration
@@ -35,7 +35,7 @@
@RunWith(AndroidTestingRunner::class)
@RunWithLooper
class ActivityLaunchAnimatorTest : SysuiTestCase() {
- private val activityLaunchAnimator = ActivityLaunchAnimator()
+ private val activityLaunchAnimator = ActivityLaunchAnimator(mContext)
private val rootView = View(mContext)
@Spy private val controller = TestLaunchAnimatorController(rootView)
@Mock lateinit var iCallback: IRemoteAnimationFinishedCallback
@@ -96,7 +96,7 @@
@Test
fun doesNotStartIfAnimationIsCancelled() {
- val runner = ActivityLaunchAnimator.Runner(controller)
+ val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationCancelled()
runner.onAnimationStart(0, emptyArray(), emptyArray(), emptyArray(), iCallback)
@@ -107,7 +107,7 @@
@Test
fun abortsIfNoOpeningWindowIsFound() {
- val runner = ActivityLaunchAnimator.Runner(controller)
+ val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationStart(0, emptyArray(), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
@@ -117,7 +117,7 @@
@Test
fun startsAnimationIfWindowIsOpening() {
- val runner = ActivityLaunchAnimator.Runner(controller)
+ val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationStart(0, arrayOf(fakeWindow()), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
verify(controller).onLaunchAnimationStart(anyBoolean())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
index e6aeee7..f077190 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -35,6 +35,7 @@
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -65,6 +66,8 @@
private SysuiStatusBarStateController mStatusBarStateController;
@Mock
private KeyguardStateController mKeyguardStateController;
+ private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
+ private final FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock);
@Before
public void setUp() {
@@ -75,7 +78,8 @@
mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager,
mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor,
- mStatusBarStateController, mKeyguardStateController, new FakeSystemClock());
+ mStatusBarStateController, mKeyguardStateController, mFakeExecutor,
+ mFakeSystemClock);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewControllerTest.java
index b6729ad..2f78532 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewControllerTest.java
@@ -17,7 +17,6 @@
package com.android.systemui.keyguard;
-import static com.android.keyguard.KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BATTERY;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_DISCLOSURE;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_OWNER_INFO;
@@ -77,7 +76,7 @@
MockitoAnnotations.initMocks(this);
when(mView.getTextColors()).thenReturn(ColorStateList.valueOf(Color.WHITE));
mController = new KeyguardIndicationRotateTextViewController(mView, mExecutor,
- mStatusBarStateController, LOCK_SCREEN_MODE_LAYOUT_1);
+ mStatusBarStateController);
mController.onViewAttached();
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index af677c9..73b0a6b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -210,16 +210,16 @@
fun bindWhenUnattached() {
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, null, null, device, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
assertThat(player.isPlaying()).isFalse()
}
@Test
fun bindText() {
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
assertThat(appName.getText()).isEqualTo(APP)
assertThat(titleText.getText()).isEqualTo(TITLE)
assertThat(artistText.getText()).isEqualTo(ARTIST)
@@ -227,10 +227,10 @@
@Test
fun bindBackgroundColor() {
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
val list = ArgumentCaptor.forClass(ColorStateList::class.java)
verify(view).setBackgroundTintList(list.capture())
assertThat(list.value).isEqualTo(ColorStateList.valueOf(BG_COLOR))
@@ -238,10 +238,10 @@
@Test
fun bindDevice() {
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
assertThat(seamlessText.getText()).isEqualTo(DEVICE_NAME)
assertThat(seamless.isEnabled()).isTrue()
}
@@ -250,10 +250,10 @@
fun bindDisabledDevice() {
seamless.id = 1
seamlessFallback.id = 2
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, disabledDevice, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
verify(expandedSet).setVisibility(seamless.id, View.GONE)
verify(expandedSet).setVisibility(seamlessFallback.id, View.VISIBLE)
verify(collapsedSet).setVisibility(seamless.id, View.GONE)
@@ -262,10 +262,10 @@
@Test
fun bindNullDevice() {
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
assertThat(seamless.isEnabled()).isTrue()
assertThat(seamlessText.getText()).isEqualTo(context.getResources().getString(
com.android.internal.R.string.ext_media_seamless_action))
@@ -273,18 +273,18 @@
@Test
fun bindDeviceResumptionPlayer() {
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null,
resumption = true)
- player.bind(state, PACKAGE)
+ player.bindPlayer(state, PACKAGE)
assertThat(seamlessText.getText()).isEqualTo(DEVICE_NAME)
assertThat(seamless.isEnabled()).isFalse()
}
@Test
fun longClick_gutsClosed() {
- player.attach(holder)
+ player.attachPlayer(holder)
whenever(mediaViewController.isGutsVisible).thenReturn(false)
val captor = ArgumentCaptor.forClass(View.OnLongClickListener::class.java)
@@ -296,7 +296,7 @@
@Test
fun longClick_gutsOpen() {
- player.attach(holder)
+ player.attachPlayer(holder)
whenever(mediaViewController.isGutsVisible).thenReturn(true)
val captor = ArgumentCaptor.forClass(View.OnLongClickListener::class.java)
@@ -308,7 +308,7 @@
@Test
fun cancelButtonClick_animation() {
- player.attach(holder)
+ player.attachPlayer(holder)
cancel.callOnClick()
@@ -317,7 +317,7 @@
@Test
fun settingsButtonClick() {
- player.attach(holder)
+ player.attachPlayer(holder)
settings.callOnClick()
@@ -330,11 +330,11 @@
@Test
fun dismissButtonClick() {
val mediaKey = "key for dismissal"
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null,
notificationKey = KEY)
- player.bind(state, mediaKey)
+ player.bindPlayer(state, mediaKey)
assertThat(dismiss.isEnabled).isEqualTo(true)
dismiss.callOnClick()
@@ -348,11 +348,11 @@
@Test
fun dismissButtonDisabled() {
val mediaKey = "key for dismissal"
- player.attach(holder)
+ player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null,
isClearable = false, notificationKey = KEY)
- player.bind(state, mediaKey)
+ player.bindPlayer(state, mediaKey)
assertThat(dismiss.isEnabled).isEqualTo(false)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
index e88c728..96eb4b0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
@@ -2,6 +2,7 @@
import android.app.Notification.MediaStyle
import android.app.PendingIntent
+import android.app.smartspace.SmartspaceTarget
import android.graphics.Bitmap
import android.media.MediaDescription
import android.media.MediaMetadata
@@ -39,6 +40,8 @@
private const val KEY = "KEY"
private const val KEY_2 = "KEY_2"
+private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+private const val KEY_NONE_MEDIA_SMARTSPACE = "NONE_MEDIA_SMARTSPACE_ID"
private const val PACKAGE_NAME = "com.android.systemui"
private const val APP_NAME = "SystemUI"
private const val SESSION_ARTIST = "artist"
@@ -72,6 +75,8 @@
@Mock lateinit var listener: MediaDataManager.Listener
@Mock lateinit var pendingIntent: PendingIntent
@Mock lateinit var activityStarter: ActivityStarter
+ lateinit var smartspaceMediaDataProvider: SmartspaceMediaDataProvider
+ @Mock lateinit var mediaSmartspaceTarget: SmartspaceTarget
lateinit var mediaDataManager: MediaDataManager
lateinit var mediaNotification: StatusBarNotification
@Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData>
@@ -80,6 +85,7 @@
fun setup() {
foregroundExecutor = FakeExecutor(FakeSystemClock())
backgroundExecutor = FakeExecutor(FakeSystemClock())
+ smartspaceMediaDataProvider = SmartspaceMediaDataProvider()
mediaDataManager = MediaDataManager(
context = context,
backgroundExecutor = backgroundExecutor,
@@ -94,6 +100,7 @@
mediaDataCombineLatest = mediaDataCombineLatest,
mediaDataFilter = mediaDataFilter,
activityStarter = activityStarter,
+ smartspaceMediaDataProvider = smartspaceMediaDataProvider,
useMediaResumption = true,
useQsMediaPlayer = true
)
@@ -117,6 +124,9 @@
// mock, it doesn't pass those events along the chain to the external listeners. So, just
// treat mediaSessionBasedFilter as a listener for testing.
listener = mediaSessionBasedFilter
+
+ whenever(mediaSmartspaceTarget.smartspaceTargetId).thenReturn(KEY_MEDIA_SMARTSPACE)
+ whenever(mediaSmartspaceTarget.featureType).thenReturn(SmartspaceTarget.FEATURE_MEDIA)
}
@After
@@ -320,4 +330,24 @@
assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
}
+
+ @Test
+ fun testOnSmartspaceMediaDataLoaded_hasNewMediaTarget_callsListener() {
+ smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
+ verify(listener).onSmartspaceMediaDataLoaded(
+ eq(KEY_MEDIA_SMARTSPACE), eq(mediaSmartspaceTarget))
+ }
+
+ @Test
+ fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_notCallsListener() {
+ smartspaceMediaDataProvider.onTargetsAvailable(listOf())
+ verify(listener, never()).onSmartspaceMediaDataLoaded(anyObject(), anyObject())
+ }
+
+ @Test
+ fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() {
+ smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
+ smartspaceMediaDataProvider.onTargetsAvailable(listOf())
+ verify(listener).onSmartspaceMediaDataRemoved(KEY_MEDIA_SMARTSPACE)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index d91625e..7125500 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -186,11 +186,11 @@
mLauncherApps = mock(LauncherApps.class);
mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
mManager = new PeopleSpaceWidgetManager(mContext);
- mManager.setAppWidgetManager(mAppWidgetManager, mIPeopleManager, mPeopleManager,
- mLauncherApps, mNotificationEntryManager, mPackageManager, true);
- mManager.attach(mListenerService);
mProvider = new PeopleSpaceWidgetProvider();
mProvider.setPeopleSpaceWidgetManager(mManager);
+ mManager.setAppWidgetManager(mAppWidgetManager, mIPeopleManager, mPeopleManager,
+ mLauncherApps, mNotificationEntryManager, mPackageManager, true, mProvider);
+ mManager.attach(mListenerService);
verify(mListenerService).addNotificationHandler(mListenerCaptor.capture());
NotificationHandler serviceListener = requireNonNull(mListenerCaptor.getValue());
@@ -842,6 +842,52 @@
any());
}
+
+ @Test
+ public void testAddThenReconfigureWidgetsUpdatesStorageCacheAndListeners()
+ throws Exception {
+ clearStorage();
+ mManager.addNewWidget(WIDGET_ID_WITH_SHORTCUT, PERSON_TILE);
+ // Check storage.
+ SharedPreferences widgetSp = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID_WITH_SHORTCUT),
+ Context.MODE_PRIVATE);
+ assertThat(widgetSp.getString(PACKAGE_NAME, null)).isEqualTo(TEST_PACKAGE_A);
+ assertThat(widgetSp.getString(PeopleSpaceUtils.SHORTCUT_ID, null)).isEqualTo(
+ PERSON_TILE.getId());
+ assertThat(widgetSp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(0);
+ // Check listener and caching.
+ verify(mPeopleManager).registerConversationListener(eq(TEST_PACKAGE_A), anyInt(),
+ eq(SHORTCUT_ID), any(),
+ any());
+ verify(mLauncherApps, times(1)).cacheShortcuts(
+ eq(TEST_PACKAGE_A),
+ eq(Arrays.asList(SHORTCUT_ID)), eq(UserHandle.of(0)),
+ eq(LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS));
+
+ // Reconfigure WIDGET_ID_WITH_SHORTCUT from PERSON_TILE to PERSON_TILE_WITH_SAME_URI
+ mManager.addNewWidget(WIDGET_ID_WITH_SHORTCUT, PERSON_TILE_WITH_SAME_URI);
+
+ // Check listener is removed and shortcut is uncached.
+ verify(mPeopleManager).unregisterConversationListener(any());
+ verify(mLauncherApps).uncacheShortcuts(eq(TEST_PACKAGE_A),
+ eq(Arrays.asList(PERSON_TILE.getId())), eq(UserHandle.of(0)),
+ eq(LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS));
+ // Check reconfigured storage from TEST_PACKAGE_A to B and SHORTCUT_ID to OTHER_SHORTCUT_ID.
+ assertThat(widgetSp.getString(PACKAGE_NAME, null)).isEqualTo(TEST_PACKAGE_B);
+ assertThat(widgetSp.getString(PeopleSpaceUtils.SHORTCUT_ID, null)).isEqualTo(
+ OTHER_SHORTCUT_ID);
+ assertThat(widgetSp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(0);
+ // Check listener & caching are reconfigured to TEST_PACKAGE_B and OTHER_SHORTCUT_ID.
+ verify(mPeopleManager, times(1)).registerConversationListener(eq(TEST_PACKAGE_B), anyInt(),
+ eq(OTHER_SHORTCUT_ID), any(),
+ any());
+ verify(mLauncherApps, times(1)).cacheShortcuts(
+ eq(TEST_PACKAGE_B),
+ eq(Arrays.asList(OTHER_SHORTCUT_ID)), eq(UserHandle.of(0)),
+ eq(LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS));
+ }
+
@Test
public void testDeleteAllWidgetsForConversationsUncachesShortcutAndRemovesListeners()
throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogTest.kt
index 28b44d9..1baaf6b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogTest.kt
@@ -234,6 +234,27 @@
}
@Test
+ fun testPhoneCallNotClickable() {
+ val element = PrivacyDialog.PrivacyElement(
+ PrivacyType.TYPE_MICROPHONE,
+ TEST_PACKAGE_NAME,
+ TEST_USER_ID,
+ "App",
+ null,
+ 0L,
+ false,
+ false,
+ true
+ )
+
+ val list = listOf(element)
+ dialog = PrivacyDialog(context, list, starter)
+ dialog.show()
+ assertThat(dialog.requireViewById<View>(R.id.privacy_item).isClickable).isFalse()
+ assertThat(dialog.requireViewById<View>(R.id.chevron).visibility).isEqualTo(View.GONE)
+ }
+
+ @Test
fun testAttribution() {
val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index e4b95af..4ee639b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -102,7 +102,7 @@
mRootView = (ViewGroup) new LayoutInflaterBuilder(mContext)
.replace("ImageView", TestableImageView.class)
.build().inflate(R.layout.quick_settings_footer, null, false);
- mFooter = new QSSecurityFooter(mRootView, mContext, mUserTracker, new Handler(looper),
+ mFooter = new QSSecurityFooter(mRootView, mUserTracker, new Handler(looper),
mActivityStarter, mSecurityController, looper);
mFooterText = mRootView.findViewById(R.id.footer_text);
mFooterIcon = mRootView.findViewById(R.id.footer_icon);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index 7ff056e..68ed2a5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -20,7 +20,13 @@
import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ALIGNMENT;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BATTERY;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_DISCLOSURE;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_RESTING;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_TRANSIENT;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_TRUST;
+import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_USER_LOCKED;
import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +35,8 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
@@ -70,6 +78,7 @@
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardIndication;
import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.statusbar.phone.LockIcon;
@@ -130,6 +139,8 @@
private DockManager mDockManager;
@Mock
private KeyguardIndicationRotateTextViewController mRotateTextViewController;
+ @Mock
+ private FalsingManager mFalsingManager;
@Captor
private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
@Captor
@@ -197,7 +208,7 @@
mController = new KeyguardIndicationController(mContext, mWakeLockBuilder,
mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,
- mUserManager, mExecutor);
+ mUserManager, mExecutor, mFalsingManager);
mController.setIndicationArea(mIndicationArea);
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
mStatusBarStateListener = mStatusBarStateListenerCaptor.getValue();
@@ -227,10 +238,11 @@
});
mInstrumentation.waitForIdleSync();
- assertThat(mTextView.getText()).isEqualTo(
+
+ verifyIndicationMessage(INDICATION_TYPE_ALIGNMENT,
mContext.getResources().getString(R.string.dock_alignment_slow_charging));
- assertThat(mTextView.getCurrentTextColor()).isEqualTo(
- Utils.getColorError(mContext).getDefaultColor());
+ assertThat(mKeyguardIndicationCaptor.getValue().getTextColor())
+ .isEqualTo(Utils.getColorError(mContext));
}
@Test
@@ -244,10 +256,10 @@
});
mInstrumentation.waitForIdleSync();
- assertThat(mTextView.getText()).isEqualTo(
+ verifyIndicationMessage(INDICATION_TYPE_ALIGNMENT,
mContext.getResources().getString(R.string.dock_alignment_not_charging));
- assertThat(mTextView.getCurrentTextColor()).isEqualTo(
- Utils.getColorError(mContext).getDefaultColor());
+ assertThat(mKeyguardIndicationCaptor.getValue().getTextColor())
+ .isEqualTo(Utils.getColorError(mContext));
}
@Test
@@ -293,9 +305,7 @@
when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(false);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).hideIndication(INDICATION_TYPE_DISCLOSURE);
- verify(mRotateTextViewController, never()).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- any(), anyBoolean());
+ verifyHideIndication(INDICATION_TYPE_DISCLOSURE);
}
@Test
@@ -305,10 +315,7 @@
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureGeneric);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
}
@Test
@@ -320,10 +327,7 @@
when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(null);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureGeneric);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
}
@Test
@@ -333,10 +337,7 @@
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureWithOrganization);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
}
@Test
@@ -348,10 +349,7 @@
when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureWithOrganization);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
}
@Test
@@ -363,26 +361,20 @@
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureGeneric);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
reset(mRotateTextViewController);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mDisclosureWithOrganization);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
reset(mRotateTextViewController);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).hideIndication(INDICATION_TYPE_DISCLOSURE);
+ verifyHideIndication(INDICATION_TYPE_DISCLOSURE);
}
@Test
@@ -395,10 +387,7 @@
.thenReturn(DEVICE_OWNER_TYPE_FINANCED);
sendUpdateDisclosureBroadcast();
- verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE),
- mKeyguardIndicationCaptor.capture(), eq(false));
- assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
- .isEqualTo(mFinancedDisclosureWithOrganization);
+ verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mFinancedDisclosureWithOrganization);
}
@Test
@@ -462,10 +451,11 @@
mController.getKeyguardCallback().onBiometricHelp(
KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED, message,
BiometricSourceType.FACE);
- assertThat(mTextView.getText()).isEqualTo(message);
+ verifyTransientMessage(message);
+ reset(mRotateTextViewController);
mStatusBarStateListener.onDozingChanged(true);
- assertThat(mTextView.getText()).isNotEqualTo(message);
+ verifyHideIndication(INDICATION_TYPE_TRANSIENT);
}
@Test
@@ -477,7 +467,7 @@
mController.getKeyguardCallback().onBiometricError(FaceManager.FACE_ERROR_TIMEOUT,
"A message", BiometricSourceType.FACE);
- assertThat(mTextView.getText()).isEqualTo(message);
+ verifyTransientMessage(message);
mStatusBarStateListener.onDozingChanged(true);
assertThat(mTextView.getText()).isNotEqualTo(message);
@@ -503,19 +493,22 @@
reset(mKeyguardUpdateMonitor);
mController.setVisible(true);
- assertThat(mTextView.getText()).isEqualTo(
+ verifyIndicationMessage(INDICATION_TYPE_USER_LOCKED,
mContext.getString(com.android.internal.R.string.lockscreen_storage_locked));
+ reset(mRotateTextViewController);
when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true);
mController.setRestingIndication(restingIndication);
- assertThat(mTextView.getText()).isEqualTo(mController.getTrustGrantedIndication());
+ verifyHideIndication(INDICATION_TYPE_USER_LOCKED);
+ verifyIndicationMessage(INDICATION_TYPE_RESTING, restingIndication);
+ reset(mRotateTextViewController);
reset(mKeyguardUpdateMonitor);
when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true);
when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
mController.onUnlockedChanged();
- assertThat(mTextView.getText()).isEqualTo(restingIndication);
+ verifyIndicationMessage(INDICATION_TYPE_RESTING, restingIndication);
}
@Test
@@ -567,12 +560,10 @@
when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
mController.setPowerPluggedIn(true);
mController.setVisible(true);
- String powerIndication = mController.computePowerIndication();
- String pluggedIndication = mContext.getString(R.string.keyguard_indication_trust_unlocked);
- pluggedIndication = mContext.getString(
- R.string.keyguard_indication_trust_unlocked_plugged_in,
- pluggedIndication, powerIndication);
- assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
+
+ verifyIndicationMessage(
+ INDICATION_TYPE_TRUST,
+ mContext.getString(R.string.keyguard_indication_trust_unlocked));
}
@Test
@@ -586,10 +577,11 @@
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
- String percentage = NumberFormat.getPercentInstance().format(80 / 100f);
- String pluggedIndication = mContext.getString(
- R.string.keyguard_plugged_in_charging_limited, percentage);
- assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
+ verifyIndicationMessage(
+ INDICATION_TYPE_BATTERY,
+ mContext.getString(
+ R.string.keyguard_plugged_in_charging_limited,
+ NumberFormat.getPercentInstance().format(80 / 100f)));
}
@Test
@@ -603,10 +595,11 @@
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
- String percentage = NumberFormat.getPercentInstance().format(80 / 100f);
- String pluggedIndication = mContext.getString(
- R.string.keyguard_plugged_in_charging_limited, percentage);
- assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
+ verifyIndicationMessage(
+ INDICATION_TYPE_BATTERY,
+ mContext.getString(
+ R.string.keyguard_plugged_in_charging_limited,
+ NumberFormat.getPercentInstance().format(80 / 100f)));
}
@Test
@@ -620,12 +613,13 @@
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
- String chargedIndication = mContext.getString(R.string.keyguard_charged);
- assertThat(mTextView.getText()).isEqualTo(chargedIndication);
+ verifyIndicationMessage(
+ INDICATION_TYPE_BATTERY,
+ mContext.getString(R.string.keyguard_charged));
}
@Test
- public void onRefreshBatteryInfo_dischargingWithOverheat_presentBatteryPercentage() {
+ public void onRefreshBatteryInfo_dozing_dischargingWithOverheat_presentBatteryPercentage() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
90 /* level */, 0 /* plugged */, BatteryManager.BATTERY_HEALTH_OVERHEAT,
@@ -646,10 +640,32 @@
mController.getKeyguardCallback().onRequireUnlockForNfc();
mController.setVisible(true);
- assertThat(mTextView.getText()).isEqualTo(message);
+ verifyTransientMessage(message);
}
private void sendUpdateDisclosureBroadcast() {
mBroadcastReceiver.onReceive(mContext, new Intent());
}
+
+ private void verifyIndicationMessage(int type, String message) {
+ verify(mRotateTextViewController).updateIndication(eq(type),
+ mKeyguardIndicationCaptor.capture(), anyBoolean());
+ assertThat(mKeyguardIndicationCaptor.getValue().getMessage())
+ .isEqualTo(message);
+ }
+
+ private void verifyHideIndication(int type) {
+ if (type == INDICATION_TYPE_TRANSIENT) {
+ verify(mRotateTextViewController).hideTransient();
+ verify(mRotateTextViewController, never()).showTransient(anyString(), anyBoolean());
+ } else {
+ verify(mRotateTextViewController).hideIndication(type);
+ verify(mRotateTextViewController, never()).updateIndication(eq(type),
+ anyObject(), anyBoolean());
+ }
+ }
+
+ private void verifyTransientMessage(String message) {
+ verify(mRotateTextViewController).showTransient(eq(message), anyBoolean());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java
index 57278e3..a1168f8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java
@@ -32,9 +32,9 @@
import android.view.View;
import android.view.animation.Interpolator;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.notification.stack.AnimationFilter;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.ViewState;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index ac160d6..3f5d220 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -30,6 +30,7 @@
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -56,6 +57,7 @@
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DeviceControlsController;
import com.android.systemui.statusbar.policy.HotspotController;
+import com.android.systemui.statusbar.policy.WalletController;
import com.android.systemui.util.settings.FakeSettings;
import com.android.systemui.util.settings.SecureSettings;
@@ -95,7 +97,8 @@
@Mock private ManagedProfileController mManagedProfileController;
@Mock private NightDisplayListener mNightDisplayListener;
@Mock private ReduceBrightColorsController mReduceBrightColorsController;
- @Mock private DeviceControlsController mDeviceControlsController;;
+ @Mock private DeviceControlsController mDeviceControlsController;
+ @Mock private WalletController mWalletController;
@Mock(answer = Answers.RETURNS_SELF)
private AutoAddTracker.Builder mAutoAddTrackerBuilder;
@Mock private Context mUserContext;
@@ -142,6 +145,7 @@
CastController castController,
ReduceBrightColorsController reduceBrightColorsController,
DeviceControlsController deviceControlsController,
+ WalletController walletController,
@Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) {
return new AutoTileManager(context, autoAddTrackerBuilder, mQsTileHost,
Handler.createAsync(TestableLooper.get(this).getLooper()),
@@ -153,6 +157,7 @@
castController,
reduceBrightColorsController,
deviceControlsController,
+ walletController,
isReduceBrightColorsAvailable);
}
@@ -160,7 +165,7 @@
return createAutoTileManager(context, mAutoAddTrackerBuilder, mHotspotController,
mDataSaverController, mManagedProfileController, mNightDisplayListener,
mCastController, mReduceBrightColorsController, mDeviceControlsController,
- mIsReduceBrightColorsAvailable);
+ mWalletController, mIsReduceBrightColorsAvailable);
}
@Test
@@ -175,10 +180,11 @@
CastController cC = mock(CastController.class);
ReduceBrightColorsController rBC = mock(ReduceBrightColorsController.class);
DeviceControlsController dCC = mock(DeviceControlsController.class);
+ WalletController wC = mock(WalletController.class);
AutoTileManager manager =
createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDS, cC, rBC,
- dCC, true);
+ dCC, wC, true);
verify(tracker, never()).initialize();
verify(hC, never()).addCallback(any());
@@ -188,6 +194,7 @@
verify(cC, never()).addCallback(any());
verify(rBC, never()).addCallback(any());
verify(dCC, never()).setCallback(any());
+ verify(wC, never()).getWalletPosition();
assertNull(manager.getSecureSettingForKey(TEST_SETTING));
assertNull(manager.getSecureSettingForKey(TEST_SETTING_COMPONENT));
}
@@ -240,6 +247,8 @@
inOrderDevices.verify(mDeviceControlsController).removeCallback();
inOrderDevices.verify(mDeviceControlsController).setCallback(any());
+ verify(mWalletController, times(2)).getWalletPosition();
+
SecureSetting setting = mAutoTileManager.getSecureSettingForKey(TEST_SETTING);
assertEquals(USER + 1, setting.getCurrentUser());
assertTrue(setting.isListening());
@@ -288,6 +297,8 @@
inOrderDevices.verify(mDeviceControlsController).removeCallback();
inOrderDevices.verify(mDeviceControlsController).setCallback(any());
+ verify(mWalletController, times(2)).getWalletPosition();
+
SecureSetting setting = mAutoTileManager.getSecureSettingForKey(TEST_SETTING);
assertEquals(USER + 1, setting.getCurrentUser());
assertFalse(setting.isListening());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
index 858227f..5f8eb9e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
@@ -25,7 +25,6 @@
import androidx.test.filters.SmallTest;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.plugins.DarkIconDispatcher;
@@ -107,9 +106,7 @@
@Test
public void testAppearResetsTranslation() {
- mController.setupAodIcons(
- mAodIcons,
- KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL);
+ mController.setupAodIcons(mAodIcons);
when(mDozeParameters.shouldControlScreenOff()).thenReturn(false);
mController.appearAodIcons();
verify(mAodIcons).setTranslationY(0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index 7d052b9..cebf8be 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -39,6 +39,7 @@
import android.hardware.biometrics.BiometricSourceType;
import android.os.PowerManager;
import android.os.UserManager;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.DisplayMetrics;
@@ -98,6 +99,8 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
import com.android.wm.shell.animation.FlingAnimationUtils;
import org.junit.Before;
@@ -235,6 +238,8 @@
private UiEventLogger mUiEventLogger;
@Mock
private LockIconViewController mLockIconViewController;
+ @Mock
+ private QuickAccessWalletClient mQuickAccessWalletClient;
private SysuiStatusBarStateController mStatusBarStateController;
private NotificationPanelViewController mNotificationPanelViewController;
@@ -339,7 +344,9 @@
mNotificationShadeDepthController,
mAmbientState,
mLockIconViewController,
- mFeatureFlags);
+ mFeatureFlags,
+ mQuickAccessWalletClient,
+ new FakeExecutor(new FakeSystemClock()));
mNotificationPanelViewController.initDependencies(
mStatusBar,
mNotificationShelfController);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 123e4ef..8633eb4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -70,6 +70,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Map;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -245,13 +246,14 @@
mScrimController.transitionTo(ScrimState.KEYGUARD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- SEMI_TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false));
}
@Test
@@ -259,13 +261,15 @@
mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
- assertScrimTint(false /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -273,13 +277,15 @@
mScrimController.transitionTo(ScrimState.OFF);
finishAnimationsImmediately();
- assertScrimAlpha(OPAQUE /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, OPAQUE));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -287,13 +293,16 @@
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE,
+ mNotificationsScrim, TRANSPARENT));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -302,17 +311,17 @@
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT));
// Pulsing notification should conserve AOD wallpaper.
mScrimController.transitionTo(ScrimState.PULSING);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT));
}
@Test
@@ -322,13 +331,15 @@
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -339,13 +350,15 @@
mScrimController.setHasBackdrop(true);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -355,31 +368,31 @@
mScrimController.setAodFrontScrimAlpha(0.5f);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- SEMI_TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT));
// ... but that it does take effect once we enter the AOD state.
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(SEMI_TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, SEMI_TRANSPARENT,
+ mScrimBehind, OPAQUE));
// ... and that if we set it while we're in AOD, it does take immediate effect.
mScrimController.setAodFrontScrimAlpha(1f);
- assertScrimAlpha(OPAQUE /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, OPAQUE));
// ... and make sure we recall the previous front scrim alpha even if we transition away
// for a bit.
mScrimController.transitionTo(ScrimState.UNLOCKED);
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(OPAQUE /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, OPAQUE));
// ... and alpha updates should be completely ignored if always_on is off.
// Passing it forward would mess up the wake-up transition.
@@ -402,17 +415,17 @@
mScrimController.setAodFrontScrimAlpha(0.5f);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- SEMI_TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT));
// ... and doesn't take effect when disabled always_on
mAlwaysOnEnabled = false;
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(OPAQUE /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, OPAQUE));
// ... but will take effect after docked
when(mDockManager.isDocked()).thenReturn(true);
@@ -420,15 +433,15 @@
mScrimController.setAodFrontScrimAlpha(0.5f);
mScrimController.transitionTo(ScrimState.AOD);
- assertScrimAlpha(SEMI_TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, SEMI_TRANSPARENT,
+ mScrimBehind, OPAQUE));
// ... and that if we set it while we're in AOD, it does take immediate effect after docked.
mScrimController.setAodFrontScrimAlpha(1f);
- assertScrimAlpha(OPAQUE /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, OPAQUE));
// Reset value since enums are static.
mScrimController.setAodFrontScrimAlpha(0f);
@@ -442,36 +455,38 @@
mScrimController.setWallpaperSupportsAmbientMode(false);
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
mScrimController.transitionTo(ScrimState.PULSING);
finishAnimationsImmediately();
// Front scrim should be transparent, but tinted
// Back scrim should be semi-transparent so the user can see the wallpaper
// Pulse callback should have been invoked
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
- assertScrimTint(true /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
// ... and when ambient goes dark, front scrim should be semi-transparent
mScrimController.setAodFrontScrimAlpha(0.5f);
finishAnimationsImmediately();
// Front scrim should be semi-transparent
- assertScrimAlpha(SEMI_TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, SEMI_TRANSPARENT,
+ mScrimBehind, OPAQUE));
mScrimController.setWakeLockScreenSensorActive(true);
finishAnimationsImmediately();
- assertScrimAlpha(SEMI_TRANSPARENT /* front */,
- SEMI_TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, SEMI_TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT));
// Reset value since enums are static.
mScrimController.setAodFrontScrimAlpha(0f);
@@ -483,27 +498,29 @@
finishAnimationsImmediately();
// Front scrim should be transparent
// Back scrim should be visible without tint
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
- assertScrimTint(false /* front */,
- false /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, false,
+ mScrimForBubble, false
+ ));
}
@Test
public void transitionToBouncer() {
mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
finishAnimationsImmediately();
- // Front scrim should be transparent
- // Back scrim should be visible without tint
- assertScrimAlpha(OPAQUE /* front */,
- TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
- assertScrimTint(false /* front */,
- false /* behind */,
- false /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, OPAQUE,
+ mScrimBehind, TRANSPARENT));
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, false,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -511,19 +528,21 @@
mScrimController.setPanelExpansion(0f);
mScrimController.transitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT));
- assertScrimTint(false /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
// Back scrim should be visible after start dragging
mScrimController.setPanelExpansion(0.5f);
- assertScrimAlpha(TRANSPARENT /* front */,
- SEMI_TRANSPARENT /* back */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT));
}
@Test
@@ -531,9 +550,11 @@
mScrimController.transitionTo(ScrimState.BUBBLE_EXPANDED);
finishAnimationsImmediately();
- assertScrimTint(false /* front */,
- false /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, false,
+ mScrimForBubble, false
+ ));
// Front scrim should be transparent
Assert.assertEquals(ScrimController.TRANSPARENT,
@@ -589,7 +610,10 @@
mScrimController.setQsPosition(1f, 999 /* value doesn't matter */);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT, OPAQUE, TRANSPARENT);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE,
+ mNotificationsScrim, OPAQUE));
}
@Test
@@ -623,21 +647,26 @@
mScrimController.transitionTo(ScrimState.UNLOCKED);
// Immediately tinted black after the transition starts
- assertScrimTint(true /* front */,
- true /* behind */,
- true /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, true
+ ));
finishAnimationsImmediately();
// All scrims should be transparent at the end of fade transition.
- assertScrimAlpha(TRANSPARENT /* front */,
- TRANSPARENT /* behind */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT,
+ mScrimForBubble, TRANSPARENT));
// Make sure at the very end of the animation, we're reset to transparent
- assertScrimTint(false /* front */,
- true /* behind */,
- false /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, true,
+ mScrimForBubble, false
+ ));
}
@Test
@@ -652,9 +681,11 @@
// Front scrim should be black in the middle of the transition
Assert.assertTrue("Scrim should be visible during transition. Alpha: "
+ mScrimInFront.getViewAlpha(), mScrimInFront.getViewAlpha() > 0);
- assertScrimTint(true /* front */,
- true /* behind */,
- true /* bubble */);
+ assertScrimTinted(Map.of(
+ mScrimInFront, true,
+ mScrimBehind, true,
+ mScrimForBubble, true
+ ));
Assert.assertSame("Scrim should be visible during transition.",
mScrimVisibility, OPAQUE);
}
@@ -843,15 +874,15 @@
mScrimController.setKeyguardOccluded(true);
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* behind */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
mScrimController.transitionTo(ScrimState.PULSING);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* behind */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
}
@Test
@@ -859,15 +890,15 @@
mScrimController.setWallpaperSupportsAmbientMode(true);
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- TRANSPARENT /* behind */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT));
mScrimController.setKeyguardOccluded(true);
finishAnimationsImmediately();
- assertScrimAlpha(TRANSPARENT /* front */,
- OPAQUE /* behind */,
- TRANSPARENT /* bubble */);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE));
}
@Test
@@ -926,21 +957,67 @@
}
}
- private void assertScrimTint(boolean front, boolean behind, boolean bubble) {
- Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
- + " with scrim: " + getScrimName(mScrimInFront) + " and tint: "
- + Integer.toHexString(mScrimInFront.getTint()),
- front, mScrimInFront.getTint() != Color.TRANSPARENT);
+ @Test
+ public void testScrimsOpaque_whenShadeFullyExpanded() {
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ mScrimController.setPanelExpansion(1);
+ // notifications scrim alpha change require calling setQsPosition
+ mScrimController.setQsPosition(0, 300);
+ finishAnimationsImmediately();
- Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
- + " with scrim: " + getScrimName(mScrimBehind) + " and tint: "
- + Integer.toHexString(mScrimBehind.getTint()),
- behind, mScrimBehind.getTint() != Color.TRANSPARENT);
+ Assert.assertEquals("Behind scrim should be opaque",
+ mScrimBehind.getViewAlpha(), 1, 0.0);
+ Assert.assertEquals("Notifications scrim should be opaque",
+ mNotificationsScrim.getViewAlpha(), 1, 0.0);
+ }
- Assert.assertEquals("Tint test failed at state " + mScrimController.getState()
- + " with scrim: " + getScrimName(mScrimForBubble) + " and tint: "
- + Integer.toHexString(mScrimForBubble.getTint()),
- bubble, mScrimForBubble.getTint() != Color.TRANSPARENT);
+ @Test
+ public void testScrimsVisible_whenShadeVisible() {
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ mScrimController.setPanelExpansion(0.5f);
+ // notifications scrim alpha change require calling setQsPosition
+ mScrimController.setQsPosition(0, 300);
+
+ assertScrimAlpha(Map.of(
+ mScrimBehind, SEMI_TRANSPARENT,
+ mNotificationsScrim, SEMI_TRANSPARENT,
+ mScrimInFront, TRANSPARENT));
+ }
+
+ @Test
+ public void testScrimsVisible_whenShadeVisibleOnLockscreen() {
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+ mScrimController.setQsPosition(0.5f, 300);
+
+ assertScrimAlpha(Map.of(
+ mScrimBehind, SEMI_TRANSPARENT,
+ mNotificationsScrim, SEMI_TRANSPARENT,
+ mScrimInFront, TRANSPARENT));
+ }
+
+ @Test
+ public void testNotificationScrimTransparent_whenOnLockscreen() {
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+ // even if shade is not pulled down, panel has expansion of 1 on the lockscreen
+ mScrimController.setPanelExpansion(1);
+ mScrimController.setQsPosition(0f, /*qs panel bottom*/ 0);
+
+ assertScrimAlpha(Map.of(
+ mScrimBehind, SEMI_TRANSPARENT,
+ mNotificationsScrim, TRANSPARENT));
+ }
+
+ private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
+ // notifications scrim should have always transparent tint
+ assertScrimTint(mNotificationsScrim, false);
+ scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
+ }
+
+ private void assertScrimTint(ScrimView scrim, boolean hasTint) {
+ String message = "Tint test failed at state " + mScrimController.getState()
+ + " with scrim: " + getScrimName(scrim) + " and tint: "
+ + Integer.toHexString(scrim.getTint());
+ Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
}
private String getScrimName(ScrimView scrim) {
@@ -956,29 +1033,25 @@
return "unknown_scrim";
}
- private void assertScrimAlpha(int front, int behind, int bubble) {
+ /**
+ * If {@link #mScrimForBubble} or {@link #mNotificationsScrim} is not passed in the map
+ * we assume it must be transparent
+ */
+ private void assertScrimAlpha(Map<ScrimView, Integer> scrimToAlpha) {
// Check single scrim visibility.
- Assert.assertEquals("Unexpected front scrim alpha: "
- + mScrimInFront.getViewAlpha(),
- front != TRANSPARENT /* expected */,
- mScrimInFront.getViewAlpha() > TRANSPARENT /* actual */);
-
- Assert.assertEquals("Unexpected back scrim alpha: "
- + mScrimBehind.getViewAlpha(),
- behind != TRANSPARENT /* expected */,
- mScrimBehind.getViewAlpha() > TRANSPARENT /* actual */);
-
- Assert.assertEquals(
- "Unexpected bubble scrim alpha: "
- + mScrimForBubble.getViewAlpha(), /* message */
- bubble != TRANSPARENT /* expected */,
- mScrimForBubble.getViewAlpha() > TRANSPARENT /* actual */);
+ if (!scrimToAlpha.containsKey(mScrimForBubble)) {
+ assertScrimAlpha(mScrimForBubble, TRANSPARENT);
+ }
+ if (!scrimToAlpha.containsKey(mNotificationsScrim)) {
+ assertScrimAlpha(mNotificationsScrim, TRANSPARENT);
+ }
+ scrimToAlpha.forEach((scrimView, alpha) -> assertScrimAlpha(scrimView, alpha));
// Check combined scrim visibility.
final int visibility;
- if (front == OPAQUE || behind == OPAQUE || bubble == OPAQUE) {
+ if (scrimToAlpha.values().contains(OPAQUE)) {
visibility = OPAQUE;
- } else if (front > TRANSPARENT || behind > TRANSPARENT || bubble > TRANSPARENT) {
+ } else if (scrimToAlpha.values().contains(SEMI_TRANSPARENT)) {
visibility = SEMI_TRANSPARENT;
} else {
visibility = TRANSPARENT;
@@ -987,4 +1060,11 @@
visibility /* expected */,
mScrimVisibility);
}
+
+ private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) {
+ Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
+ + scrim.getViewAlpha(),
+ expectedAlpha != TRANSPARENT /* expected */,
+ scrim.getViewAlpha() > TRANSPARENT /* actual */);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
index e34bc0c..5170168 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
@@ -51,9 +51,9 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.ActivityIntentHelper;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.animation.ActivityLaunchAnimator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/WalletControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/WalletControllerImplTest.kt
new file mode 100644
index 0000000..dbc2e347
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/WalletControllerImplTest.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy
+
+import android.service.quickaccesswallet.QuickAccessWalletClient
+import android.testing.AndroidTestingRunner
+
+import androidx.test.filters.SmallTest
+
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_PRIORITY_POSITION
+
+import com.google.common.truth.Truth.assertThat
+
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when`
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class WalletControllerImplTest : SysuiTestCase() {
+
+ @Mock
+ private lateinit var quickAccessWalletClient: QuickAccessWalletClient
+
+ private lateinit var controller: WalletController
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ controller = WalletControllerImpl(quickAccessWalletClient)
+ }
+
+ @Test
+ fun testResultIsNullWhenNoServiceAvailable() {
+ `when`(quickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false)
+ assertThat(controller.getWalletPosition()).isNull()
+ }
+
+ @Test
+ fun testResultIsIntWhenServiceAvailable() {
+ `when`(quickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true)
+ assertThat(controller.getWalletPosition()).isEqualTo(QS_PRIORITY_POSITION)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
index ddf0537..ddf39d1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
@@ -57,6 +57,8 @@
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.util.settings.SecureSettings;
+import com.google.common.util.concurrent.MoreExecutors;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -201,18 +203,61 @@
}
@Test
- public void onWallpaperColorsChanged_defersUntilSetupIsCompleted() {
+ public void onWallpaperColorsChanged_firstEventBeforeUserSetup_shouldBeAccepted() {
+ // By default, on setup() we make this controller return that the user finished setup
+ // wizard. This test on the other hand, is testing the setup flow.
reset(mDeviceProvisionedController);
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null);
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+ verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any());
+ }
+
+ @Test
+ public void onWallpaperColorsChanged_defersUntilSetupIsCompleted_ifHasColors() {
+ mDeviceProvisionedController = mock(DeviceProvisionedController.class);
+ mThemeOverlayApplier = mock(ThemeOverlayApplier.class);
+ mWallpaperManager = mock(WallpaperManager.class);
+
+ // Assume we have some wallpaper colors at boot.
+ when(mWallpaperManager.getWallpaperColors(anyInt()))
+ .thenReturn(new WallpaperColors(Color.valueOf(Color.GRAY), null, null));
+
+ Executor executor = MoreExecutors.directExecutor();
+ mThemeOverlayController = new ThemeOverlayController(null /* context */,
+ mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier,
+ mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController,
+ mUserTracker, mDumpManager, mFeatureFlags) {
+ @Nullable
+ @Override
+ protected FabricatedOverlay getOverlay(int color, int type) {
+ FabricatedOverlay overlay = mock(FabricatedOverlay.class);
+ when(overlay.getIdentifier())
+ .thenReturn(new OverlayIdentifier(Integer.toHexString(color | 0xff000000)));
+ return overlay;
+ }
+ };
+ mThemeOverlayController.start();
+ verify(mWallpaperManager).addOnColorsChangedListener(mColorsListener.capture(), eq(null),
+ eq(UserHandle.USER_ALL));
+ verify(mDeviceProvisionedController).addCallback(mDeviceProvisionedListener.capture());
+
+ // Colors were applied during controller initialization.
+ verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any());
+ clearInvocations(mThemeOverlayApplier);
+
+ WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
+ Color.valueOf(Color.BLUE), null);
+ mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+
+ // Defers event because we already have initial colors.
verify(mThemeOverlayApplier, never())
.applyCurrentUserOverlays(any(), any(), anyInt(), any());
+ // Then event happens after setup phase is over.
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mDeviceProvisionedListener.getValue().onUserSetupChanged();
-
verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 9b9937b..abc8da2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -101,6 +101,7 @@
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.TaskStackListenerImpl;
import com.google.common.collect.ImmutableList;
@@ -206,6 +207,8 @@
@Mock
private BubbleLogger mBubbleLogger;
@Mock
+ private TaskStackListenerImpl mTaskStackListener;
+ @Mock
private ShellTaskOrganizer mShellTaskOrganizer;
private TestableBubblePositioner mPositioner;
@@ -287,6 +290,7 @@
mWindowManagerShellWrapper,
mLauncherApps,
mBubbleLogger,
+ mTaskStackListener,
mShellTaskOrganizer,
mPositioner,
syncExecutor,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index b0ec628..1ba7f8a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -94,6 +94,7 @@
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.TaskStackListenerImpl;
import org.junit.Before;
import org.junit.Ignore;
@@ -187,6 +188,8 @@
@Mock
private BubbleLogger mBubbleLogger;
@Mock
+ private TaskStackListenerImpl mTaskStackListener;
+ @Mock
private ShellTaskOrganizer mShellTaskOrganizer;
private TestableBubblePositioner mPositioner;
@@ -253,6 +256,7 @@
mWindowManagerShellWrapper,
mLauncherApps,
mBubbleLogger,
+ mTaskStackListener,
mShellTaskOrganizer,
mPositioner,
syncExecutor,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
index a1adb2c..a9a558d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
@@ -31,6 +31,7 @@
import com.android.wm.shell.bubbles.BubblePositioner;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.TaskStackListenerImpl;
/**
* Testable BubbleController subclass that immediately synchronizes surfaces.
@@ -47,13 +48,15 @@
WindowManagerShellWrapper windowManagerShellWrapper,
LauncherApps launcherApps,
BubbleLogger bubbleLogger,
+ TaskStackListenerImpl taskStackListener,
ShellTaskOrganizer shellTaskOrganizer,
BubblePositioner positioner,
ShellExecutor shellMainExecutor,
Handler shellMainHandler) {
super(context, data, Runnable::run, floatingContentCoordinator, dataRepository,
statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
- bubbleLogger, shellTaskOrganizer, positioner, shellMainExecutor, shellMainHandler);
+ bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, shellMainExecutor,
+ shellMainHandler);
setInflateSynchronously(true);
initialize();
}
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index f06a940..a48f76e 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -264,6 +264,10 @@
// Package: android
NOTE_CARRIER_SUGGESTION_AVAILABLE = 63;
+ // Inform that NAS settings have changed on OS upgrade
+ // Package: android
+ NOTE_NAS_UPGRADE = 64;
+
// ADD_NEW_IDS_ABOVE_THIS_LINE
// Legacy IDs with arbitrary values appear below
// Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/services/Android.bp b/services/Android.bp
index 25b270e..ad1406c 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -7,6 +7,22 @@
default_applicable_licenses: ["frameworks_base_license"],
}
+// Defaults for platform code that runs inside system_server
+java_defaults {
+ name: "platform_service_defaults",
+ plugins: ["error_prone_android_framework"],
+ errorprone: {
+ javacflags: [
+ // "-Xep:AndroidFrameworkBinderIdentity:ERROR",
+ "-Xep:AndroidFrameworkCompatChange:ERROR",
+ // "-Xep:AndroidFrameworkUid:ERROR",
+ // NOTE: only enable to generate local patchfiles
+ // "-XepPatchChecks:refaster:frameworks/base/errorprone/refaster/EfficientXml.java.refaster",
+ // "-XepPatchLocation:/tmp/refaster/",
+ ],
+ },
+}
+
filegroup {
name: "services-main-sources",
srcs: [
diff --git a/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
index bafb641..6828dd9 100644
--- a/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
+++ b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
@@ -40,29 +40,34 @@
private final IAccessibilityInteractionConnectionCallback mServiceCallback;
private final IAccessibilityInteractionConnection mConnectionWithReplacementActions;
private final int mInteractionId;
+ private final int mNodeWithReplacementActionsInteractionId;
private final Object mLock = new Object();
@GuardedBy("mLock")
- List<AccessibilityNodeInfo> mNodesWithReplacementActions;
+ private boolean mReplacementNodeIsReadyOrFailed;
+
+ @GuardedBy("mLock")
+ AccessibilityNodeInfo mNodeWithReplacementActions;
@GuardedBy("mLock")
List<AccessibilityNodeInfo> mNodesFromOriginalWindow;
@GuardedBy("mLock")
+ boolean mSetFindNodeFromOriginalWindowCalled = false;
+
+ @GuardedBy("mLock")
AccessibilityNodeInfo mNodeFromOriginalWindow;
- // Keep track of whether or not we've been called back for a single node
@GuardedBy("mLock")
- boolean mSingleNodeCallbackHappened;
+ boolean mSetFindNodesFromOriginalWindowCalled = false;
- // Keep track of whether or not we've been called back for multiple node
- @GuardedBy("mLock")
- boolean mMultiNodeCallbackHappened;
- // We shouldn't get any more callbacks after we've called back the original service, but
- // keep track to make sure we catch such strange things
@GuardedBy("mLock")
- boolean mDone;
+ List<AccessibilityNodeInfo> mPrefetchedNodesFromOriginalWindow;
+
+ @GuardedBy("mLock")
+ boolean mSetPrefetchFromOriginalWindowCalled = false;
+
public ActionReplacingCallback(IAccessibilityInteractionConnectionCallback serviceCallback,
IAccessibilityInteractionConnection connectionWithReplacementActions,
@@ -70,19 +75,20 @@
mServiceCallback = serviceCallback;
mConnectionWithReplacementActions = connectionWithReplacementActions;
mInteractionId = interactionId;
+ mNodeWithReplacementActionsInteractionId = interactionId + 1;
// Request the root node of the replacing window
final long identityToken = Binder.clearCallingIdentity();
try {
mConnectionWithReplacementActions.findAccessibilityNodeInfoByAccessibilityId(
- AccessibilityNodeInfo.ROOT_NODE_ID, null, interactionId + 1, this, 0,
+ AccessibilityNodeInfo.ROOT_NODE_ID, null,
+ mNodeWithReplacementActionsInteractionId, this, 0,
interrogatingPid, interrogatingTid, null, null);
} catch (RemoteException re) {
if (DEBUG) {
Slog.e(LOG_TAG, "Error calling findAccessibilityNodeInfoByAccessibilityId()");
}
- // Pretend we already got a (null) list of replacement nodes
- mMultiNodeCallbackHappened = true;
+ mReplacementNodeIsReadyOrFailed = true;
} finally {
Binder.restoreCallingIdentity(identityToken);
}
@@ -90,46 +96,67 @@
@Override
public void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, int interactionId) {
- boolean readyForCallback;
- synchronized(mLock) {
+ synchronized (mLock) {
if (interactionId == mInteractionId) {
mNodeFromOriginalWindow = info;
+ mSetFindNodeFromOriginalWindowCalled = true;
+ } else if (interactionId == mNodeWithReplacementActionsInteractionId) {
+ mNodeWithReplacementActions = info;
+ mReplacementNodeIsReadyOrFailed = true;
} else {
Slog.e(LOG_TAG, "Callback with unexpected interactionId");
return;
}
-
- mSingleNodeCallbackHappened = true;
- readyForCallback = mMultiNodeCallbackHappened;
}
- if (readyForCallback) {
- replaceInfoActionsAndCallService();
- }
+ replaceInfoActionsAndCallServiceIfReady();
}
@Override
public void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos,
int interactionId) {
- boolean callbackForSingleNode;
- boolean callbackForMultipleNodes;
- synchronized(mLock) {
+ synchronized (mLock) {
if (interactionId == mInteractionId) {
mNodesFromOriginalWindow = infos;
- } else if (interactionId == mInteractionId + 1) {
- mNodesWithReplacementActions = infos;
+ mSetFindNodesFromOriginalWindowCalled = true;
+ } else if (interactionId == mNodeWithReplacementActionsInteractionId) {
+ setNodeWithReplacementActionsFromList(infos);
+ mReplacementNodeIsReadyOrFailed = true;
} else {
Slog.e(LOG_TAG, "Callback with unexpected interactionId");
return;
}
- callbackForSingleNode = mSingleNodeCallbackHappened;
- callbackForMultipleNodes = mMultiNodeCallbackHappened;
- mMultiNodeCallbackHappened = true;
}
- if (callbackForSingleNode) {
- replaceInfoActionsAndCallService();
+ replaceInfoActionsAndCallServiceIfReady();
+ }
+
+ @Override
+ public void setPrefetchAccessibilityNodeInfoResult(List<AccessibilityNodeInfo> infos,
+ int interactionId)
+ throws RemoteException {
+ synchronized (mLock) {
+ if (interactionId == mInteractionId) {
+ mPrefetchedNodesFromOriginalWindow = infos;
+ mSetPrefetchFromOriginalWindowCalled = true;
+ } else {
+ Slog.e(LOG_TAG, "Callback with unexpected interactionId");
+ return;
+ }
}
- if (callbackForMultipleNodes) {
- replaceInfosActionsAndCallService();
+ replaceInfoActionsAndCallServiceIfReady();
+ }
+
+ private void replaceInfoActionsAndCallServiceIfReady() {
+ replaceInfoActionsAndCallService();
+ replaceInfosActionsAndCallService();
+ replacePrefetchInfosActionsAndCallService();
+ }
+
+ private void setNodeWithReplacementActionsFromList(List<AccessibilityNodeInfo> infos) {
+ for (int i = 0; i < infos.size(); i++) {
+ AccessibilityNodeInfo info = infos.get(i);
+ if (info.getSourceNodeId() == AccessibilityNodeInfo.ROOT_NODE_ID) {
+ mNodeWithReplacementActions = info;
+ }
}
}
@@ -142,55 +169,81 @@
private void replaceInfoActionsAndCallService() {
final AccessibilityNodeInfo nodeToReturn;
+ boolean doCallback = false;
synchronized (mLock) {
- if (mDone) {
- if (DEBUG) {
- Slog.e(LOG_TAG, "Extra callback");
- }
- return;
- }
- if (mNodeFromOriginalWindow != null) {
+ doCallback = mReplacementNodeIsReadyOrFailed
+ && mSetFindNodeFromOriginalWindowCalled;
+ if (doCallback && mNodeFromOriginalWindow != null) {
replaceActionsOnInfoLocked(mNodeFromOriginalWindow);
+ mSetFindNodeFromOriginalWindowCalled = false;
}
- recycleReplaceActionNodesLocked();
nodeToReturn = mNodeFromOriginalWindow;
- mDone = true;
}
- try {
- mServiceCallback.setFindAccessibilityNodeInfoResult(nodeToReturn, mInteractionId);
- } catch (RemoteException re) {
- if (DEBUG) {
- Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfoResult");
+ if (doCallback) {
+ try {
+ mServiceCallback.setFindAccessibilityNodeInfoResult(nodeToReturn, mInteractionId);
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfoResult");
+ }
}
}
}
private void replaceInfosActionsAndCallService() {
- final List<AccessibilityNodeInfo> nodesToReturn;
+ List<AccessibilityNodeInfo> nodesToReturn = null;
+ boolean doCallback = false;
synchronized (mLock) {
- if (mDone) {
+ doCallback = mReplacementNodeIsReadyOrFailed
+ && mSetFindNodesFromOriginalWindowCalled;
+ if (doCallback) {
+ nodesToReturn = replaceActionsLocked(mNodesFromOriginalWindow);
+ mSetFindNodesFromOriginalWindowCalled = false;
+ }
+ }
+ if (doCallback) {
+ try {
+ mServiceCallback.setFindAccessibilityNodeInfosResult(nodesToReturn, mInteractionId);
+ } catch (RemoteException re) {
if (DEBUG) {
- Slog.e(LOG_TAG, "Extra callback");
- }
- return;
- }
- if (mNodesFromOriginalWindow != null) {
- for (int i = 0; i < mNodesFromOriginalWindow.size(); i++) {
- replaceActionsOnInfoLocked(mNodesFromOriginalWindow.get(i));
+ Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfosResult");
}
}
- recycleReplaceActionNodesLocked();
- nodesToReturn = (mNodesFromOriginalWindow == null)
- ? null : new ArrayList<>(mNodesFromOriginalWindow);
- mDone = true;
}
- try {
- mServiceCallback.setFindAccessibilityNodeInfosResult(nodesToReturn, mInteractionId);
- } catch (RemoteException re) {
- if (DEBUG) {
- Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfosResult");
+ }
+
+ private void replacePrefetchInfosActionsAndCallService() {
+ List<AccessibilityNodeInfo> nodesToReturn = null;
+ boolean doCallback = false;
+ synchronized (mLock) {
+ doCallback = mReplacementNodeIsReadyOrFailed
+ && mSetPrefetchFromOriginalWindowCalled;
+ if (doCallback) {
+ nodesToReturn = replaceActionsLocked(mPrefetchedNodesFromOriginalWindow);
+ mSetPrefetchFromOriginalWindowCalled = false;
}
}
+ if (doCallback) {
+ try {
+ mServiceCallback.setPrefetchAccessibilityNodeInfoResult(
+ nodesToReturn, mInteractionId);
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfosResult");
+ }
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private List<AccessibilityNodeInfo> replaceActionsLocked(List<AccessibilityNodeInfo> infos) {
+ if (infos != null) {
+ for (int i = 0; i < infos.size(); i++) {
+ replaceActionsOnInfoLocked(infos.get(i));
+ }
+ }
+ return (infos == null)
+ ? null : new ArrayList<>(infos);
}
@GuardedBy("mLock")
@@ -204,40 +257,22 @@
info.setDismissable(false);
// We currently only replace actions for the root node
if ((info.getSourceNodeId() == AccessibilityNodeInfo.ROOT_NODE_ID)
- && mNodesWithReplacementActions != null) {
- // This list should always contain a single node with the root ID
- for (int i = 0; i < mNodesWithReplacementActions.size(); i++) {
- AccessibilityNodeInfo nodeWithReplacementActions =
- mNodesWithReplacementActions.get(i);
- if (nodeWithReplacementActions.getSourceNodeId()
- == AccessibilityNodeInfo.ROOT_NODE_ID) {
- List<AccessibilityAction> actions = nodeWithReplacementActions.getActionList();
- if (actions != null) {
- for (int j = 0; j < actions.size(); j++) {
- info.addAction(actions.get(j));
- }
- // The PIP needs to be able to take accessibility focus
- info.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
- info.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
- }
- info.setClickable(nodeWithReplacementActions.isClickable());
- info.setFocusable(nodeWithReplacementActions.isFocusable());
- info.setContextClickable(nodeWithReplacementActions.isContextClickable());
- info.setScrollable(nodeWithReplacementActions.isScrollable());
- info.setLongClickable(nodeWithReplacementActions.isLongClickable());
- info.setDismissable(nodeWithReplacementActions.isDismissable());
+ && mNodeWithReplacementActions != null) {
+ List<AccessibilityAction> actions = mNodeWithReplacementActions.getActionList();
+ if (actions != null) {
+ for (int j = 0; j < actions.size(); j++) {
+ info.addAction(actions.get(j));
}
+ // The PIP needs to be able to take accessibility focus
+ info.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
+ info.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
}
+ info.setClickable(mNodeWithReplacementActions.isClickable());
+ info.setFocusable(mNodeWithReplacementActions.isFocusable());
+ info.setContextClickable(mNodeWithReplacementActions.isContextClickable());
+ info.setScrollable(mNodeWithReplacementActions.isScrollable());
+ info.setLongClickable(mNodeWithReplacementActions.isLongClickable());
+ info.setDismissable(mNodeWithReplacementActions.isDismissable());
}
}
-
- @GuardedBy("mLock")
- private void recycleReplaceActionNodesLocked() {
- if (mNodesWithReplacementActions == null) return;
- for (int i = mNodesWithReplacementActions.size() - 1; i >= 0; i--) {
- AccessibilityNodeInfo nodeWithReplacementAction = mNodesWithReplacementActions.get(i);
- nodeWithReplacementAction.recycle();
- }
- mNodesWithReplacementActions = null;
- }
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 55490ce..b1eae9e 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -644,13 +644,12 @@
}
@Override
- public boolean createAssociation(String packageName, String macAddress, int userId) {
+ public void createAssociation(String packageName, String macAddress, int userId) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES, "createAssociation");
addAssociation(new Association(
userId, macAddress, packageName, null, false, System.currentTimeMillis()));
- return true;
}
private void checkCanCallNotificationApi(String callingPackage) throws RemoteException {
diff --git a/services/core/java/com/android/server/AlarmManagerInternal.java b/services/core/java/com/android/server/AlarmManagerInternal.java
index 0a73502..e5ae77a 100644
--- a/services/core/java/com/android/server/AlarmManagerInternal.java
+++ b/services/core/java/com/android/server/AlarmManagerInternal.java
@@ -24,13 +24,16 @@
public interface InFlightListener {
/** There is now an alarm pending delivery to the given app */
void broadcastAlarmPending(int recipientUid);
+
/** A broadcast alarm targeted to the given app has completed delivery */
void broadcastAlarmComplete(int recipientUid);
}
/** Returns true if AlarmManager is delaying alarms due to device idle. */
boolean isIdling();
+
public void removeAlarmsForUid(int uid);
+
public void registerInFlightListener(InFlightListener callback);
/**
@@ -38,4 +41,10 @@
* {@link android.app.PendingIntent#equals(java.lang.Object) PendingIntent.equals}
*/
void remove(PendingIntent rec);
+
+ /**
+ * Returns if the given package in the given user holds
+ * {@link android.Manifest.permission#SCHEDULE_EXACT_ALARM}
+ */
+ boolean hasScheduleExactAlarm(String packageName, int uid);
}
diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java
index 9e126d7..c49b8e8 100644
--- a/services/core/java/com/android/server/BinderCallsStatsService.java
+++ b/services/core/java/com/android/server/BinderCallsStatsService.java
@@ -138,6 +138,12 @@
private static final String SETTINGS_COLLECT_LATENCY_DATA_KEY = "collect_Latency_data";
private static final String SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY =
"latency_observer_sampling_interval";
+ private static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY =
+ "latency_histogram_bucket_count";
+ private static final String SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY =
+ "latency_histogram_first_bucket_size";
+ private static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY =
+ "latency_histogram_bucket_scale_factor";
private boolean mEnabled;
private final Uri mUri = Settings.Global.getUriFor(Settings.Global.BINDER_CALLS_STATS);
@@ -198,9 +204,20 @@
mParser.getBoolean(SETTINGS_COLLECT_LATENCY_DATA_KEY,
BinderCallsStats.DEFAULT_COLLECT_LATENCY_DATA));
// Binder latency observer settings.
- mBinderCallsStats.getLatencyObserver().setSamplingInterval(mParser.getInt(
+ BinderLatencyObserver binderLatencyObserver = mBinderCallsStats.getLatencyObserver();
+ binderLatencyObserver.setSamplingInterval(mParser.getInt(
SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY,
BinderLatencyObserver.PERIODIC_SAMPLING_INTERVAL_DEFAULT));
+ binderLatencyObserver.setHistogramBucketsParams(
+ mParser.getInt(
+ SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY,
+ BinderLatencyObserver.BUCKET_COUNT_DEFAULT),
+ mParser.getInt(
+ SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY,
+ BinderLatencyObserver.FIRST_BUCKET_SIZE_DEFAULT),
+ mParser.getFloat(
+ SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY,
+ BinderLatencyObserver.BUCKET_SCALE_FACTOR_DEFAULT));
final boolean enabled =
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 4081fd5..d9cc4b4 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2279,7 +2279,9 @@
netId = nai.network.getNetId();
}
boolean ok = addLegacyRouteToHost(lp, addr, netId, uid);
- if (DBG) log("requestRouteToHostAddress ok=" + ok);
+ if (DBG) {
+ log("requestRouteToHostAddress " + addr + nai.toShortString() + " ok=" + ok);
+ }
return ok;
} finally {
Binder.restoreCallingIdentity(token);
@@ -2903,13 +2905,13 @@
pw.println();
pw.println("mNetworkRequestInfoLogs (most recent first):");
pw.increaseIndent();
- mNetworkRequestInfoLogs.reverseDump(fd, pw, args);
+ mNetworkRequestInfoLogs.reverseDump(pw);
pw.decreaseIndent();
pw.println();
pw.println("mNetworkInfoBlockingLogs (most recent first):");
pw.increaseIndent();
- mNetworkInfoBlockingLogs.reverseDump(fd, pw, args);
+ mNetworkInfoBlockingLogs.reverseDump(pw);
pw.decreaseIndent();
pw.println();
@@ -2923,7 +2925,7 @@
long duration = SystemClock.elapsedRealtime() - mLastWakeLockAcquireTimestamp;
pw.println("currently holding WakeLock for: " + (duration / 1000) + "s");
}
- mWakelockLogs.reverseDump(fd, pw, args);
+ mWakelockLogs.reverseDump(pw);
pw.println();
pw.println("bandwidth update requests (by uid):");
@@ -2935,7 +2937,12 @@
}
}
pw.decreaseIndent();
+ pw.decreaseIndent();
+ pw.println();
+ pw.println("mOemNetworkPreferencesLogs (most recent first):");
+ pw.increaseIndent();
+ mOemNetworkPreferencesLogs.reverseDump(pw);
pw.decreaseIndent();
}
@@ -4224,7 +4231,7 @@
// network, we should respect the user's option and don't need to popup the
// PARTIAL_CONNECTIVITY notification to user again.
nai.networkAgentConfig.acceptPartialConnectivity = accept;
- nai.updateScoreForNetworkAgentConfigUpdate();
+ nai.updateScoreForNetworkAgentUpdate();
rematchAllNetworksAndRequests();
}
@@ -4292,6 +4299,7 @@
}
if (!nai.avoidUnvalidated) {
nai.avoidUnvalidated = true;
+ nai.updateScoreForNetworkAgentUpdate();
rematchAllNetworksAndRequests();
}
}
@@ -4399,7 +4407,7 @@
private void updateAvoidBadWifi() {
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
- nai.updateScoreForNetworkAgentConfigUpdate();
+ nai.updateScoreForNetworkAgentUpdate();
}
rematchAllNetworksAndRequests();
}
@@ -6237,6 +6245,12 @@
@NonNull
private ProfileNetworkPreferences mProfileNetworkPreferences = new ProfileNetworkPreferences();
+ // OemNetworkPreferences activity String log entries.
+ private static final int MAX_OEM_NETWORK_PREFERENCE_LOGS = 20;
+ @NonNull
+ private final LocalLog mOemNetworkPreferencesLogs =
+ new LocalLog(MAX_OEM_NETWORK_PREFERENCE_LOGS);
+
/**
* Determine whether a given package has a mapping in the current OemNetworkPreferences.
* @param packageName the package name to check existence of a mapping for.
@@ -6601,7 +6615,7 @@
@NonNull final INetworkOfferCallback callback) {
ensureRunningOnConnectivityServiceThread();
for (final NetworkOfferInfo noi : mNetworkOffers) {
- if (noi.offer.callback.equals(callback)) return noi;
+ if (noi.offer.callback.asBinder().equals(callback.asBinder())) return noi;
}
return null;
}
@@ -7159,6 +7173,7 @@
final NetworkCapabilities prevNc = nai.getAndSetNetworkCapabilities(newNc);
updateUids(nai, prevNc, newNc);
+ nai.updateScoreForNetworkAgentUpdate();
if (nai.getCurrentScore() == oldScore && newNc.equalRequestableCapabilities(prevNc)) {
// If the requestable capabilities haven't changed, and the score hasn't changed, then
@@ -7754,6 +7769,7 @@
// all networks except in the case of an underlying network for a VCN.
if (newSatisfier.isNascent()) {
newSatisfier.unlingerRequest(NetworkRequest.REQUEST_ID_NONE);
+ newSatisfier.unsetInactive();
}
// if newSatisfier is not null, then newRequest may not be null.
@@ -8258,6 +8274,7 @@
// But it will be removed as soon as the network satisfies a request for the first time.
networkAgent.lingerRequest(NetworkRequest.REQUEST_ID_NONE,
SystemClock.elapsedRealtime(), mNascentDelayMs);
+ networkAgent.setInactive();
// Consider network even though it is not yet validated.
rematchAllNetworksAndRequests();
@@ -9739,6 +9756,7 @@
return;
}
+ mOemNetworkPreferencesLogs.log("UPDATE INITIATED: " + preference);
final ArraySet<NetworkRequestInfo> nris =
new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences(preference);
replaceDefaultNetworkRequestsForPreference(nris);
@@ -9892,7 +9910,7 @@
}
for (final UserHandle ui : users) {
// Add the rules for all users as this policy is device wide.
- uids.get(pref).add(UserHandle.getUid(ui, uid));
+ uids.get(pref).add(ui.getUid(uid));
}
} catch (PackageManager.NameNotFoundException e) {
// Although this may seem like an error scenario, it is ok that uninstalled
diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java
index 0c3d884..a2a232d 100644
--- a/services/core/java/com/android/server/DropBoxManagerService.java
+++ b/services/core/java/com/android/server/DropBoxManagerService.java
@@ -88,7 +88,7 @@
private static final int DEFAULT_AGE_SECONDS = 3 * 86400;
private static final int DEFAULT_MAX_FILES = 1000;
private static final int DEFAULT_MAX_FILES_LOWRAM = 300;
- private static final int DEFAULT_QUOTA_KB = 5 * 1024;
+ private static final int DEFAULT_QUOTA_KB = 10 * 1024;
private static final int DEFAULT_QUOTA_PERCENT = 10;
private static final int DEFAULT_RESERVE_PERCENT = 10;
private static final int QUOTA_RESCAN_MILLIS = 5000;
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index f591802..0c785da 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -363,6 +363,12 @@
users = ArrayUtils.appendInt(users, userId);
invalidateIsUserUnlockedCache();
}
+ public void appendAll(int[] userIds) {
+ for (int userId : userIds) {
+ users = ArrayUtils.appendInt(users, userId);
+ }
+ invalidateIsUserUnlockedCache();
+ }
public void remove(int userId) {
users = ArrayUtils.removeInt(users, userId);
invalidateIsUserUnlockedCache();
@@ -1099,6 +1105,10 @@
}
try {
+ // Reset vold to tear down existing disks/volumes and start from
+ // a clean state. Exception: already-unlocked user storage will
+ // remain unlocked and is not affected by the reset.
+ //
// TODO(b/135341433): Remove cautious logging when FUSE is stable
Slog.i(TAG, "Resetting vold...");
mVold.reset();
@@ -1113,7 +1123,7 @@
mStoraged.onUserStarted(userId);
}
if (mIsAutomotive) {
- restoreAllUnlockedUsers(userManager, users, systemUnlockedUsers);
+ restoreSystemUnlockedUsers(userManager, users, systemUnlockedUsers);
}
mVold.onSecureKeyguardStateChanged(mSecureKeyguardShowing);
mStorageManagerInternal.onReset(mVold);
@@ -1123,7 +1133,7 @@
}
}
- private void restoreAllUnlockedUsers(UserManager userManager, List<UserInfo> allUsers,
+ private void restoreSystemUnlockedUsers(UserManager userManager, List<UserInfo> allUsers,
int[] systemUnlockedUsers) throws Exception {
Arrays.sort(systemUnlockedUsers);
UserManager.invalidateIsUserUnlockedCache();
@@ -1146,6 +1156,31 @@
}
}
+ // If vold knows that some users have their storage unlocked already (which
+ // can happen after a "userspace reboot"), then add those users to
+ // mLocalUnlockedUsers. Do this right away and don't wait until
+ // PHASE_BOOT_COMPLETED, since the system may unlock users before then.
+ private void restoreLocalUnlockedUsers() {
+ final int[] userIds;
+ try {
+ userIds = mVold.getUnlockedUsers();
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to get unlocked users from vold", e);
+ return;
+ }
+ if (!ArrayUtils.isEmpty(userIds)) {
+ Slog.d(TAG, "CE storage for users " + Arrays.toString(userIds)
+ + " is already unlocked");
+ synchronized (mLock) {
+ // Append rather than replace, just in case we're actually
+ // reconnecting to vold after it crashed and was restarted, in
+ // which case things will be the other way around --- we'll know
+ // about the unlocked users but vold won't.
+ mLocalUnlockedUsers.appendAll(userIds);
+ }
+ }
+ }
+
private void onUnlockUser(int userId) {
Slog.d(TAG, "onUnlockUser " + userId);
@@ -1947,6 +1982,7 @@
connectVold();
}, DateUtils.SECOND_IN_MILLIS);
} else {
+ restoreLocalUnlockedUsers();
onDaemonConnected();
}
}
@@ -3233,19 +3269,24 @@
+ " hasSecret: " + (secret != null));
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
+ if (isUserKeyUnlocked(userId)) {
+ Slog.d(TAG, "User " + userId + "'s CE storage is already unlocked");
+ return;
+ }
+
if (isFsEncrypted) {
- // When a user has secure lock screen, require secret to actually unlock.
- // This check is mostly in place for emulation mode.
- if (StorageManager.isFileEncryptedEmulatedOnly() &&
- mLockPatternUtils.isSecure(userId) && ArrayUtils.isEmpty(secret)) {
- throw new IllegalStateException("Secret required to unlock secure user " + userId);
+ // When a user has a secure lock screen, a secret is required to
+ // unlock the key, so don't bother trying to unlock it without one.
+ // This prevents misleading error messages from being logged. This
+ // is also needed for emulated FBE to behave like native FBE.
+ if (mLockPatternUtils.isSecure(userId) && ArrayUtils.isEmpty(secret)) {
+ Slog.d(TAG, "Not unlocking user " + userId
+ + "'s CE storage yet because a secret is needed");
+ return;
}
try {
mVold.unlockUserKey(userId, serialNumber, encodeBytes(token),
encodeBytes(secret));
- } catch (ServiceSpecificException sse) {
- Slog.d(TAG, "Expected if the user has not unlocked the device.", sse);
- return;
} catch (Exception e) {
Slog.wtf(TAG, e);
return;
@@ -3267,6 +3308,11 @@
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
+ if (!isUserKeyUnlocked(userId)) {
+ Slog.d(TAG, "User " + userId + "'s CE storage is already locked");
+ return;
+ }
+
try {
mVold.lockUserKey(userId);
} catch (Exception e) {
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index 65a2a7b..3b31ab2 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -172,9 +172,6 @@
@NonNull
private final TrackingNetworkCallback mTrackingNetworkCallback = new TrackingNetworkCallback();
- /** Can only be assigned when {@link #systemReady()} is called, since it uses AppOpsManager. */
- @Nullable private LocationPermissionChecker mLocationPermissionChecker;
-
@GuardedBy("mLock")
@NonNull
private final Map<ParcelUuid, VcnConfig> mConfigs = new ArrayMap<>();
@@ -372,7 +369,6 @@
new NetworkRequest.Builder().clearCapabilities().build(),
mTrackingNetworkCallback);
mTelephonySubscriptionTracker.register();
- mLocationPermissionChecker = mDeps.newLocationPermissionChecker(mVcnContext.getContext());
}
private void enforcePrimaryUser() {
@@ -839,13 +835,6 @@
return false;
}
- if (!mLocationPermissionChecker.checkLocationPermission(
- cbInfo.mPkgName,
- "VcnStatusCallback" /* featureId */,
- cbInfo.mUid,
- null /* message */)) {
- return false;
- }
return true;
}
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 211999f..9835a9a 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -56,6 +56,7 @@
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -585,10 +586,12 @@
private void run() {
boolean waitedHalf = false;
while (true) {
- final List<HandlerChecker> blockedCheckers;
- final String subject;
- final boolean allowRestart;
+ List<HandlerChecker> blockedCheckers = Collections.emptyList();
+ String subject = "";
+ boolean allowRestart = true;
int debuggerWasConnected = 0;
+ boolean doWaitedHalfDump = false;
+ final ArrayList<Integer> pids;
synchronized (mLock) {
long timeout = CHECK_INTERVAL;
// Make sure we (re)spin the checkers that have become idle within
@@ -634,20 +637,28 @@
} else if (waitState == WAITED_HALF) {
if (!waitedHalf) {
Slog.i(TAG, "WAITED_HALF");
- // We've waited half the deadlock-detection interval. Pull a stack
- // trace and wait another half.
- ArrayList<Integer> pids = new ArrayList<>(mInterestingJavaPids);
- ActivityManagerService.dumpStackTraces(pids, null, null,
- getInterestingNativePids(), null);
waitedHalf = true;
+ // We've waited half, but we'd need to do the stack trace dump w/o the lock.
+ pids = new ArrayList<>(mInterestingJavaPids);
+ doWaitedHalfDump = true;
+ } else {
+ continue;
}
- continue;
+ } else {
+ // something is overdue!
+ blockedCheckers = getBlockedCheckersLocked();
+ subject = describeCheckersLocked(blockedCheckers);
+ allowRestart = mAllowRestart;
+ pids = new ArrayList<>(mInterestingJavaPids);
}
+ } // END synchronized (mLock)
- // something is overdue!
- blockedCheckers = getBlockedCheckersLocked();
- subject = describeCheckersLocked(blockedCheckers);
- allowRestart = mAllowRestart;
+ if (doWaitedHalfDump) {
+ // We've waited half the deadlock-detection interval. Pull a stack
+ // trace and wait another half.
+ ActivityManagerService.dumpStackTraces(pids, null, null,
+ getInterestingNativePids(), null);
+ continue;
}
// If we got here, that means that the system is most likely hung.
@@ -655,8 +666,6 @@
// Then kill this process so that the system will restart.
EventLog.writeEvent(EventLogTags.WATCHDOG, subject);
- ArrayList<Integer> pids = new ArrayList<>(mInterestingJavaPids);
-
long anrTime = SystemClock.uptimeMillis();
StringBuilder report = new StringBuilder();
report.append(MemoryPressureUtil.currentPsiState());
@@ -681,6 +690,7 @@
// Try to add the error to the dropbox, but assuming that the ActivityManager
// itself may be deadlocked. (which has happened, causing this statement to
// deadlock and the watchdog as a whole to be ineffective)
+ final String localSubject = subject;
Thread dropboxThread = new Thread("watchdogWriteToDropbox") {
public void run() {
// If a watched thread hangs before init() is called, we don't have a
@@ -688,10 +698,10 @@
if (mActivity != null) {
mActivity.addErrorToDropBox(
"watchdog", null, "system_server", null, null, null,
- subject, report.toString(), stack, null, null, null);
+ localSubject, report.toString(), stack, null, null, null);
}
FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED,
- subject);
+ localSubject);
}
};
dropboxThread.start();
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c7f2f43..50040e2 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -34,7 +34,6 @@
import static android.os.PowerWhitelistManager.REASON_DENIED;
import static android.os.PowerWhitelistManager.REASON_DEVICE_DEMO_MODE;
import static android.os.PowerWhitelistManager.REASON_DEVICE_OWNER;
-import static android.os.PowerWhitelistManager.REASON_EXEMPTED_PACKAGE;
import static android.os.PowerWhitelistManager.REASON_FGS_BINDING;
import static android.os.PowerWhitelistManager.REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION;
import static android.os.PowerWhitelistManager.REASON_INSTR_BACKGROUND_FGS_PERMISSION;
@@ -289,13 +288,6 @@
static final long FGS_BG_START_RESTRICTION_CHANGE_ID = 170668199L;
/**
- * If set to false for a package, the system will *not* exempt it from FGS-BG-start,
- * even if it's in {#code ActiveServices.sFgsBgStartExemptedPackages}.
- */
- @ChangeId
- static final long FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID = 175801883;
-
- /**
* If a service can not become foreground service due to BG-FGS-launch restriction or other
* reasons, throws an IllegalStateException.
*/
@@ -303,56 +295,6 @@
@EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.S)
static final long FGS_START_EXCEPTION_CHANGE_ID = 174041399L;
- /**
- * Special allowlist that contains packages that are allowed to start FGS even if they target S,
- * without using START_FOREGROUND_SERVICES_FROM_BACKGROUND.
- *
- * Note: we exempt FGS starts if either the "callee" or "caller" match any of the emempted
- * packages. This means:
- * - Exempted apps could call Context.startForegroundService() for services owned by any other
- * apps.
- * - Any apps could call Context.startForegroundService() for services owned by any exempted
- * apps.
- * And the call would succeed.
- */
- private static final ArraySet<String> sFgsBgStartExemptedPackages = new ArraySet<>();
-
- private static final ArrayList<String> sFgsBgStartExemptedPackagePrefixes = new ArrayList<>();
-
- /**
- * List of packages that are exempted from the FGS restriction *for now*.
- *
- * STOPSHIP(/b/176844961) Remove it. Also update ActiveServicesTest.java.
- */
- private static final String[] FGS_BG_START_EXEMPTED_PACKAGES = {
- "com.google.pixel.exo.bootstrapping",
- };
-
- /**
- * List of packages that are exempted from the FGS restriction *for now*. We also allow
- * any packages that
- *
- * STOPSHIP(/b/176844961) Remove it. Also update ActiveServicesTest.java.
- */
- private static final String[] FGS_BG_START_EXEMPTED_PACKAGES_PREFIXED_ALLOWED = {
- "com.android.webview",
- "com.google.android.webview",
- "com.android.chrome",
- "com.google.android.apps.chrome",
- "com.chrome",
- };
-
- static {
- for (String s : FGS_BG_START_EXEMPTED_PACKAGES) {
- sFgsBgStartExemptedPackages.add(s);
- }
-
- for (String s : FGS_BG_START_EXEMPTED_PACKAGES_PREFIXED_ALLOWED) {
- sFgsBgStartExemptedPackages.add(s); // Add it for an exact match.
- sFgsBgStartExemptedPackagePrefixes.add(s + "."); // Add it for an prefix match.
- }
- }
-
final Runnable mLastAnrDumpClearer = new Runnable() {
@Override public void run() {
synchronized (mAm) {
@@ -5857,16 +5799,6 @@
}
}
- // NOTE this should always be the last check.
- if (ret == REASON_DENIED) {
- if (isPackageExemptedFromFgsRestriction(callingPackage, callingUid)) {
- ret = REASON_EXEMPTED_PACKAGE;
- } else if (targetService != null && isPackageExemptedFromFgsRestriction(
- targetService.appInfo.packageName, targetService.appInfo.uid)) {
- ret = REASON_EXEMPTED_PACKAGE;
- }
- }
-
if (ret == REASON_DENIED) {
final boolean isCompanionApp = mAm.mInternal.isAssociatedCompanionApp(
UserHandle.getUserId(callingUid), callingUid);
@@ -5889,28 +5821,6 @@
return ret;
}
- @VisibleForTesting
- static boolean isPackageExemptedFromFgsRestriction(String packageName, int uid) {
- boolean exempted = false;
- if (sFgsBgStartExemptedPackages.contains(packageName)) {
- exempted = true;
- } else {
- for (String pkg : sFgsBgStartExemptedPackagePrefixes) {
- if (packageName.startsWith(pkg)) {
- exempted = true;
- break;
- }
- }
- }
- if (!exempted) {
- return false; // Package isn't exempted.
- }
- // Allow exempted packages to be subject to the restriction using this compat ID.
- // (so that, for example, the webview developer will be able to test the restriction
- // locally.)
- return CompatChanges.isChangeEnabled(FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID, uid);
- }
-
private static boolean isFgsBgStart(@ReasonCode int code) {
return code != REASON_PROC_STATE_PERSISTENT
&& code != REASON_PROC_STATE_PERSISTENT_UI
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a737ea7..2a1a897 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -11501,6 +11501,9 @@
// and it's not isolated, as we'd need the signal to bookkeeping the dying process list.
restart = app.onCleanupApplicationRecordLSP(mProcessStats, allowRestart,
fromBinderDied || app.isolated /* unlinkDeath */);
+
+ // Cancel pending frozen task if there is any.
+ mOomAdjuster.mCachedAppOptimizer.unscheduleFreezeAppLSP(app);
}
mAppProfiler.onCleanupApplicationRecordLocked(app);
skipCurrentReceiverLocked(app);
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index e4cb15f..8dc9d03 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -974,6 +974,16 @@
}
}
+ /**
+ * To be called when the given app is killed.
+ */
+ @GuardedBy({"mAm", "mProcLock"})
+ void unscheduleFreezeAppLSP(ProcessRecord app) {
+ if (mUseFreezer) {
+ mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
+ }
+ }
+
@VisibleForTesting
static final class LastCompactionStats {
private final long[] mRssAfterCompaction;
diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java
index b44699b..fb9f2dd 100644
--- a/services/core/java/com/android/server/am/ContentProviderHelper.java
+++ b/services/core/java/com/android/server/am/ContentProviderHelper.java
@@ -1206,10 +1206,10 @@
}
}
+ if (providers != null) {
+ mService.mSystemThread.installSystemProviders(providers);
+ }
synchronized (this) {
- if (providers != null) {
- mService.mSystemThread.installSystemProviders(providers);
- }
mSystemProvidersInstalled = true;
}
diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java
index fcf82fa..ffd2458 100644
--- a/services/core/java/com/android/server/appop/HistoricalRegistry.java
+++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java
@@ -385,11 +385,10 @@
callback.sendResult(new Bundle());
return;
}
- mPersistence.collectHistoricalOpsDLocked(result, uid, packageName,
- attributionTag,
- opNames, filter, beginTimeMillis, endTimeMillis, flags);
-
}
+ mPersistence.collectHistoricalOpsDLocked(result, uid, packageName,
+ attributionTag,
+ opNames, filter, beginTimeMillis, endTimeMillis, flags);
}
}
@@ -577,19 +576,19 @@
Slog.e(LOG_TAG, "Interaction before persistence initialized");
return;
}
- final List<HistoricalOps> history = mPersistence.readHistoryDLocked();
- clearHistoricalRegistry();
- if (history != null) {
- final int historySize = history.size();
- for (int i = 0; i < historySize; i++) {
- final HistoricalOps ops = history.get(i);
- ops.offsetBeginAndEndTime(offsetMillis);
- }
- if (offsetMillis < 0) {
- pruneFutureOps(history);
- }
- mPersistence.persistHistoricalOpsDLocked(history);
+ }
+ final List<HistoricalOps> history = mPersistence.readHistoryDLocked();
+ clearHistoricalRegistry();
+ if (history != null) {
+ final int historySize = history.size();
+ for (int i = 0; i < historySize; i++) {
+ final HistoricalOps ops = history.get(i);
+ ops.offsetBeginAndEndTime(offsetMillis);
}
+ if (offsetMillis < 0) {
+ pruneFutureOps(history);
+ }
+ mPersistence.persistHistoricalOpsDLocked(history);
}
}
}
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 9b88c9a..18d04e9 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -1257,6 +1257,7 @@
break;
case AudioSystem.DEVICE_OUT_HDMI:
case AudioSystem.DEVICE_OUT_HDMI_ARC:
+ case AudioSystem.DEVICE_OUT_HDMI_EARC:
configureHdmiPlugIntent(intent, state);
break;
}
@@ -1292,6 +1293,7 @@
break;
case AudioSystem.DEVICE_OUT_HDMI:
case AudioSystem.DEVICE_OUT_HDMI_ARC:
+ case AudioSystem.DEVICE_OUT_HDMI_EARC:
connType = AudioRoutesInfo.MAIN_HDMI;
break;
case AudioSystem.DEVICE_OUT_USB_DEVICE:
@@ -1336,7 +1338,8 @@
}
final AudioDevicePort devicePort = (AudioDevicePort) port;
if (devicePort.type() != AudioManager.DEVICE_OUT_HDMI
- && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_ARC) {
+ && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_ARC
+ && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_EARC) {
continue;
}
// found an HDMI port: format the list of supported encodings
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 4cec83d..9707ace 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -562,6 +562,7 @@
AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET,
AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET,
AudioSystem.DEVICE_OUT_HDMI_ARC,
+ AudioSystem.DEVICE_OUT_HDMI_EARC,
AudioSystem.DEVICE_OUT_AUX_LINE));
// Devices for which the volume is always max, no volume panel
Set<Integer> mFullVolumeDevices = new HashSet<>();
@@ -5877,6 +5878,9 @@
if ((device & AudioSystem.DEVICE_OUT_SPEAKER) != 0) {
device = AudioSystem.DEVICE_OUT_SPEAKER;
} else if ((device & AudioSystem.DEVICE_OUT_HDMI_ARC) != 0) {
+ // FIXME(b/184944421): DEVICE_OUT_HDMI_EARC has two bits set,
+ // so it must be handled correctly as it aliases
+ // with DEVICE_OUT_HDMI_ARC | DEVICE_OUT_EARPIECE.
device = AudioSystem.DEVICE_OUT_HDMI_ARC;
} else if ((device & AudioSystem.DEVICE_OUT_SPDIF) != 0) {
device = AudioSystem.DEVICE_OUT_SPDIF;
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index 6017e92..e118781 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -645,7 +645,8 @@
case BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRMED:
case BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRM_NOT_REQUIRED:
if (mTokenEscrow != null) {
- mKeyStore.addAuthToken(mTokenEscrow);
+ final int result = mKeyStore.addAuthToken(mTokenEscrow);
+ Slog.d(TAG, "addAuthToken: " + result);
} else {
Slog.e(TAG, "mTokenEscrow is null");
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricSensor.java b/services/core/java/com/android/server/biometrics/BiometricSensor.java
index c9e148f..8a842b5 100644
--- a/services/core/java/com/android/server/biometrics/BiometricSensor.java
+++ b/services/core/java/com/android/server/biometrics/BiometricSensor.java
@@ -19,10 +19,13 @@
import static android.hardware.biometrics.BiometricManager.Authenticators;
import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.content.Context;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricSensorReceiver;
+import android.hardware.biometrics.SensorPropertiesInternal;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
@@ -62,6 +65,7 @@
@Retention(RetentionPolicy.SOURCE)
@interface SensorState {}
+ @NonNull private final Context mContext;
public final int id;
public final @Authenticators.Types int oemStrength; // strength as configured by the OEM
public final int modality;
@@ -84,8 +88,9 @@
*/
abstract boolean confirmationSupported();
- BiometricSensor(int id, int modality, @Authenticators.Types int strength,
- IBiometricAuthenticator impl) {
+ BiometricSensor(@NonNull Context context, int id, int modality,
+ @Authenticators.Types int strength, IBiometricAuthenticator impl) {
+ this.mContext = context;
this.id = id;
this.modality = modality;
this.oemStrength = strength;
@@ -169,12 +174,19 @@
@Override
public String toString() {
+ SensorPropertiesInternal properties = null;
+ try {
+ properties = impl.getSensorProperties(mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception", e);
+ }
+
return "ID(" + id + ")"
+ ", oemStrength: " + oemStrength
+ ", updatedStrength: " + mUpdatedStrength
+ ", modality " + modality
+ ", state: " + mSensorState
+ ", cookie: " + mCookie
- + ", authenticator: " + impl;
+ + ", props: " + properties;
}
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 70f26ac..cb7c568 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -725,7 +725,7 @@
}
}
- mSensors.add(new BiometricSensor(id, modality, strength, authenticator) {
+ mSensors.add(new BiometricSensor(getContext(), id, modality, strength, authenticator) {
@Override
boolean confirmationAlwaysRequired(int userId) {
return mSettingObserver.getConfirmationAlwaysRequired(modality, userId);
@@ -1351,13 +1351,8 @@
for (BiometricSensor sensor : mSensors) {
pw.println(" " + sensor);
}
+ pw.println();
pw.println("CurrentSession: " + mCurrentAuthSession);
-
- final List<FingerprintSensorPropertiesInternal> fpProps =
- mInjector.getFingerprintSensorProperties(getContext());
- pw.println("FingerprintSensorProperties: " + fpProps.size());
- for (FingerprintSensorPropertiesInternal prop : fpProps) {
- pw.println(" " + prop);
- }
+ pw.println();
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
index 93fea90..f744374 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
@@ -32,7 +32,8 @@
* Abstract {@link HalClientMonitor} subclass that operations eligible/interested in acquisition
* messages should extend.
*/
-public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implements Interruptable {
+public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implements Interruptable,
+ ErrorConsumer {
private static final String TAG = "Biometrics/AcquisitionClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
index 79e75b1..cf545f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
@@ -229,7 +229,8 @@
getTargetUserId(), mIsStrongBiometric);
} else if (!isBiometricPrompt() && listener != null) {
if (mIsStrongBiometric) {
- KeyStore.getInstance().addAuthToken(byteToken);
+ final int result = KeyStore.getInstance().addAuthToken(byteToken);
+ Slog.d(TAG, "addAuthToken: " + result);
} else {
Slog.d(TAG, "Skipping addAuthToken");
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index 6c480f1..cc27127 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -422,9 +422,9 @@
+ mCurrentOperation);
// This should trigger the internal onClientFinished callback, which clears the
// operation and starts the next one.
- final Interruptable interruptable =
- (Interruptable) mCurrentOperation.mClientMonitor;
- interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_CANCELED,
+ final ErrorConsumer errorConsumer =
+ (ErrorConsumer) mCurrentOperation.mClientMonitor;
+ errorConsumer.onError(BiometricConstants.BIOMETRIC_ERROR_CANCELED,
0 /* vendorCode */);
return;
} else {
@@ -559,22 +559,21 @@
}
/**
- * Requests to cancel authentication.
+ * Requests to cancel authentication or detection.
* @param token from the caller, should match the token passed in when requesting authentication
*/
- public void cancelAuthentication(IBinder token) {
+ public void cancelAuthenticationOrDetection(IBinder token) {
if (mCurrentOperation == null) {
Slog.e(getTag(), "Unable to cancel authentication, null operation");
return;
}
- final boolean isAuthenticating =
- mCurrentOperation.mClientMonitor instanceof AuthenticationConsumer;
+ final boolean isCorrectClient = isAuthenticationOrDetectionOperation(mCurrentOperation);
final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token;
- if (isAuthenticating && tokenMatches) {
- Slog.d(getTag(), "Cancelling authentication: " + mCurrentOperation);
+ if (isCorrectClient && tokenMatches) {
+ Slog.d(getTag(), "Cancelling: " + mCurrentOperation);
cancelInternal(mCurrentOperation);
- } else if (!isAuthenticating) {
+ } else if (!isCorrectClient) {
// Look through the current queue for all authentication clients for the specified
// token, and mark them as STATE_WAITING_IN_QUEUE_CANCELING. Note that we're marking
// all of them, instead of just the first one, since the API surface currently doesn't
@@ -582,7 +581,7 @@
// process. However, this generally does not happen anyway, and would be a class of
// bugs on its own.
for (Operation operation : mPendingOperations) {
- if (operation.mClientMonitor instanceof AuthenticationConsumer
+ if (isAuthenticationOrDetectionOperation(operation)
&& operation.mClientMonitor.getToken() == token) {
Slog.d(getTag(), "Marking " + operation
+ " as STATE_WAITING_IN_QUEUE_CANCELING");
@@ -592,6 +591,13 @@
}
}
+ private boolean isAuthenticationOrDetectionOperation(@NonNull Operation operation) {
+ final boolean isAuthentication = operation.mClientMonitor
+ instanceof AuthenticationConsumer;
+ final boolean isDetection = operation.mClientMonitor instanceof DetectionConsumer;
+ return isAuthentication || isDetection;
+ }
+
/**
* @return the current operation
*/
diff --git a/core/java/android/os/CombinedVibrationEffect.aidl b/services/core/java/com/android/server/biometrics/sensors/DetectionConsumer.java
similarity index 66%
copy from core/java/android/os/CombinedVibrationEffect.aidl
copy to services/core/java/com/android/server/biometrics/sensors/DetectionConsumer.java
index 330733c..c71c954 100644
--- a/core/java/android/os/CombinedVibrationEffect.aidl
+++ b/services/core/java/com/android/server/biometrics/sensors/DetectionConsumer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,6 +14,11 @@
* limitations under the License.
*/
-package android.os;
+package com.android.server.biometrics.sensors;
-parcelable CombinedVibrationEffect;
+/**
+ * Interface that clients interested/eligible for interaction detection events should implement.
+ */
+public interface DetectionConsumer {
+ void onInteractionDetected();
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/ErrorConsumer.java b/services/core/java/com/android/server/biometrics/sensors/ErrorConsumer.java
new file mode 100644
index 0000000..9fe8bdc
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/ErrorConsumer.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.sensors;
+
+/**
+ * Interface that {@link BaseClientMonitor} subclasses eligible/interested in error callbacks should
+ * implement.
+ */
+public interface ErrorConsumer {
+ /**
+ * Notifies the client of errors from the HAL.
+ * @param errorCode defined by the HIDL interface
+ * @param vendorCode defined by the vendor
+ */
+ void onError(int errorCode, int vendorCode);
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/Interruptable.java b/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
index 70d9b26..fab98b6 100644
--- a/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
+++ b/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
@@ -19,8 +19,7 @@
import android.annotation.NonNull;
/**
- * Interface that {@link BaseClientMonitor} subclasses eligible/interested in error callbacks should
- * implement.
+ * Interface that {@link BaseClientMonitor} subclasses eligible for cancellation should implement.
*/
public interface Interruptable {
/**
@@ -29,13 +28,6 @@
void cancel();
/**
- * Notifies the client of errors from the HAL.
- * @param errorCode defined by the HIDL interface
- * @param vendorCode defined by the vendor
- */
- void onError(int errorCode, int vendorCode);
-
- /**
* Notifies the client that it needs to finish before
* {@link BaseClientMonitor#start(BaseClientMonitor.Callback)} was invoked. This usually happens
* if the client is still waiting in the pending queue and got notified that a subsequent
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
index 34a86d3..ada8476 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
@@ -296,7 +296,15 @@
return;
}
- // TODO(b/152413782): Implement this once it's supported in the HAL
+ final Pair<Integer, ServiceProvider> provider = getSingleProvider();
+ if (provider == null) {
+ Slog.w(TAG, "Null provider for detectFace");
+ return;
+ }
+
+ provider.second.scheduleFaceDetect(provider.first, token, userId,
+ new ClientMonitorCallbackConverter(receiver), opPackageName,
+ BiometricsProtoEnums.CLIENT_KEYGUARD);
}
@Override // Binder call
@@ -353,7 +361,13 @@
return;
}
- // TODO(b/152413782): Implement this once it's supported in the HAL
+ final Pair<Integer, ServiceProvider> provider = getSingleProvider();
+ if (provider == null) {
+ Slog.w(TAG, "Null provider for cancelFaceDetect");
+ return;
+ }
+
+ provider.second.cancelFaceDetect(provider.first, token);
}
@Override // Binder call
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
index 9b6fb0b..6d6c2e9 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
@@ -101,12 +101,17 @@
void cancelEnrollment(int sensorId, @NonNull IBinder token);
+ void scheduleFaceDetect(int sensorId, @NonNull IBinder token, int userId,
+ @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
+ int statsClient);
+
+ void cancelFaceDetect(int sensorId, @NonNull IBinder token);
+
void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId,
int cookie, @NonNull ClientMonitorCallbackConverter callback,
@NonNull String opPackageName, boolean restricted, int statsClient,
boolean allowBackgroundAuthentication);
-
void cancelAuthentication(int sensorId, @NonNull IBinder token);
void scheduleRemove(int sensorId, @NonNull IBinder token, int faceId, int userId,
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java
new file mode 100644
index 0000000..0ba731e
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.sensors.face.aidl;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.biometrics.common.ICancellationSignal;
+import android.hardware.biometrics.face.ISession;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.server.biometrics.BiometricsProto;
+import com.android.server.biometrics.sensors.AcquisitionClient;
+import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
+import com.android.server.biometrics.sensors.DetectionConsumer;
+
+/**
+ * Performs face detection without exposing any matching information (e.g. accept/reject have the
+ * same haptic, lockout counter is not increased).
+ */
+public class FaceDetectClient extends AcquisitionClient<ISession> implements DetectionConsumer {
+
+ private static final String TAG = "FaceDetectClient";
+
+ private final boolean mIsStrongBiometric;
+ @Nullable private ICancellationSignal mCancellationSignal;
+
+ public FaceDetectClient(@NonNull Context context, @NonNull LazyDaemon<ISession> lazyDaemon,
+ @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
+ @NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) {
+ super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
+ BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.ACTION_AUTHENTICATE,
+ statsClient);
+ mIsStrongBiometric = isStrongBiometric;
+ }
+
+ @Override
+ public void start(@NonNull Callback callback) {
+ super.start(callback);
+ startHalOperation();
+ }
+
+ @Override
+ protected void stopHalOperation() {
+ try {
+ mCancellationSignal.cancel();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception", e);
+ mCallback.onClientFinished(this, false /* success */);
+ }
+ }
+
+ @Override
+ protected void startHalOperation() {
+ try {
+ mCancellationSignal = getFreshDaemon().detectInteraction();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception when requesting face detect", e);
+ mCallback.onClientFinished(this, false /* success */);
+ }
+ }
+
+ @Override
+ public void onInteractionDetected() {
+ vibrateSuccess();
+
+ try {
+ getListener().onDetected(getSensorId(), getTargetUserId(), mIsStrongBiometric);
+ mCallback.onClientFinished(this, true /* success */);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception when sending onDetected", e);
+ mCallback.onClientFinished(this, false /* success */);
+ }
+ }
+
+ @Override
+ public int getProtoEnum() {
+ return BiometricsProto.CM_DETECT_INTERACTION;
+ }
+
+ @Override
+ public boolean interruptsPrecedingClients() {
+ return true;
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index 4fb71ff..b8bac40 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -110,7 +110,7 @@
Slog.e(getTag(), "Stopping background authentication, top: "
+ topPackage + " currentClient: " + client);
mSensors.valueAt(i).getScheduler()
- .cancelAuthentication(client.getToken());
+ .cancelAuthenticationOrDetection(client.getToken());
}
}
}
@@ -145,7 +145,7 @@
final FaceSensorPropertiesInternal internalProp = new FaceSensorPropertiesInternal(
prop.commonProps.sensorId, prop.commonProps.sensorStrength,
prop.commonProps.maxEnrollmentsPerUser, componentInfo, prop.sensorType,
- false /* supportsFaceDetection */, prop.halControlsPreview,
+ prop.supportsDetectInteraction, prop.halControlsPreview,
false /* resetLockoutRequiresChallenge */);
final Sensor sensor = new Sensor(getTag() + "/" + sensorId, this, mContext, mHandler,
internalProp);
@@ -346,6 +346,25 @@
}
@Override
+ public void scheduleFaceDetect(int sensorId, @NonNull IBinder token,
+ int userId, @NonNull ClientMonitorCallbackConverter callback,
+ @NonNull String opPackageName, int statsClient) {
+ mHandler.post(() -> {
+ final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
+ final FaceDetectClient client = new FaceDetectClient(mContext,
+ mSensors.get(sensorId).getLazySession(), token, callback, userId, opPackageName,
+ sensorId, isStrongBiometric, statsClient);
+ scheduleForSensor(sensorId, client);
+ });
+ }
+
+ @Override
+ public void cancelFaceDetect(int sensorId, @NonNull IBinder token) {
+ mHandler.post(() -> mSensors.get(sensorId).getScheduler()
+ .cancelAuthenticationOrDetection(token));
+ }
+
+ @Override
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback,
@NonNull String opPackageName, boolean restricted, int statsClient,
@@ -364,7 +383,8 @@
@Override
public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
- mHandler.post(() -> mSensors.get(sensorId).getScheduler().cancelAuthentication(token));
+ mHandler.post(() -> mSensors.get(sensorId).getScheduler()
+ .cancelAuthenticationOrDetection(token));
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
index 5e57950..f551930 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
@@ -27,6 +27,7 @@
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.HardwareAuthTokenUtils;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -37,7 +38,7 @@
* Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is
* cleared.
*/
-public class FaceResetLockoutClient extends HalClientMonitor<ISession> {
+public class FaceResetLockoutClient extends HalClientMonitor<ISession> implements ErrorConsumer {
private static final String TAG = "FaceResetLockoutClient";
@@ -88,4 +89,10 @@
public int getProtoEnum() {
return BiometricsProto.CM_RESET_LOCKOUT;
}
+
+ @Override
+ public void onError(int errorCode, int vendorCode) {
+ Slog.e(TAG, "Error during resetLockout: " + errorCode);
+ mCallback.onClientFinished(this, false /* success */);
+ }
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
index ee36775..d56fd12 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
@@ -52,6 +52,7 @@
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.EnumerateConsumer;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -215,14 +216,14 @@
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
+ ", vendorCode: " + vendorCode);
- if (!(client instanceof Interruptable)) {
+ if (!(client instanceof ErrorConsumer)) {
Slog.e(mTag, "onError for non-error consumer: "
+ Utils.getClientName(client));
return;
}
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(error, vendorCode);
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(error, vendorCode);
if (error == Error.HW_UNAVAILABLE) {
mCallback.onHardwareUnavailable();
@@ -337,7 +338,17 @@
@Override
public void onInteractionDetected() {
- // no-op
+ mHandler.post(() -> {
+ final BaseClientMonitor client = mScheduler.getCurrentClient();
+ if (!(client instanceof FaceDetectClient)) {
+ Slog.e(mTag, "onInteractionDetected for wrong client: "
+ + Utils.getClientName(client));
+ return;
+ }
+
+ final FaceDetectClient detectClient = (FaceDetectClient) client;
+ detectClient.onInteractionDetected();
+ });
}
@Override
@@ -571,8 +582,8 @@
final BaseClientMonitor client = mScheduler.getCurrentClient();
if (client instanceof Interruptable) {
Slog.e(mTag, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(FaceManager.FACE_ERROR_HW_UNAVAILABLE,
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(FaceManager.FACE_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */);
FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index 4ffbe06..2cb2939 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -64,6 +64,7 @@
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -227,14 +228,14 @@
+ ", client: " + (client != null ? client.getOwnerString() : null)
+ ", error: " + error
+ ", vendorCode: " + vendorCode);
- if (!(client instanceof Interruptable)) {
+ if (!(client instanceof ErrorConsumer)) {
Slog.e(TAG, "onError for non-error consumer: " + Utils.getClientName(
client));
return;
}
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(error, vendorCode);
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(error, vendorCode);
if (error == BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE) {
Slog.e(TAG, "Got ERROR_HW_UNAVAILABLE");
@@ -379,10 +380,10 @@
mCurrentUserId = UserHandle.USER_NULL;
final BaseClientMonitor client = mScheduler.getCurrentClient();
- if (client instanceof Interruptable) {
+ if (client instanceof ErrorConsumer) {
Slog.e(TAG, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */);
FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
@@ -638,6 +639,20 @@
}
@Override
+ public void scheduleFaceDetect(int sensorId, @NonNull IBinder token,
+ int userId, @NonNull ClientMonitorCallbackConverter callback,
+ @NonNull String opPackageName, int statsClient) {
+ throw new IllegalStateException("Face detect not supported by IBiometricsFace@1.0. Did you"
+ + "forget to check the supportsFaceDetection flag?");
+ }
+
+ @Override
+ public void cancelFaceDetect(int sensorId, @NonNull IBinder token) {
+ throw new IllegalStateException("Face detect not supported by IBiometricsFace@1.0. Did you"
+ + "forget to check the supportsFaceDetection flag?");
+ }
+
+ @Override
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
int userId, int cookie, @NonNull ClientMonitorCallbackConverter receiver,
@NonNull String opPackageName, boolean restricted, int statsClient,
@@ -657,7 +672,7 @@
@Override
public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
mHandler.post(() -> {
- mScheduler.cancelAuthentication(token);
+ mScheduler.cancelAuthenticationOrDetection(token);
});
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
index 9e9d0ee..45e93a0 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
@@ -58,6 +58,12 @@
}
@Override
+ public void start(@NonNull Callback callback) {
+ super.start(callback);
+ startHalOperation();
+ }
+
+ @Override
protected void stopHalOperation() {
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
try {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index 01fd641..9851ae0 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -115,7 +115,7 @@
Slog.e(getTag(), "Stopping background authentication, top: "
+ topPackage + " currentClient: " + client);
mSensors.valueAt(i).getScheduler()
- .cancelAuthentication(client.getToken());
+ .cancelAuthenticationOrDetection(client.getToken());
}
}
}
@@ -383,7 +383,8 @@
@Override
public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
- mHandler.post(() -> mSensors.get(sensorId).getScheduler().cancelAuthentication(token));
+ mHandler.post(() -> mSensors.get(sensorId).getScheduler()
+ .cancelAuthenticationOrDetection(token));
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
index b00c592..bab9506 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
@@ -27,6 +27,7 @@
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.HardwareAuthTokenUtils;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -37,7 +38,7 @@
* Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is
* cleared.
*/
-class FingerprintResetLockoutClient extends HalClientMonitor<ISession> {
+class FingerprintResetLockoutClient extends HalClientMonitor<ISession> implements ErrorConsumer {
private static final String TAG = "FingerprintResetLockoutClient";
@@ -88,4 +89,10 @@
public int getProtoEnum() {
return BiometricsProto.CM_RESET_LOCKOUT;
}
+
+ @Override
+ public void onError(int errorCode, int vendorCode) {
+ Slog.e(TAG, "Error during resetLockout: " + errorCode);
+ mCallback.onClientFinished(this, false /* success */);
+ }
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index 4862d849..6a9b125 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -50,6 +50,7 @@
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.EnumerateConsumer;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -190,14 +191,14 @@
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
+ ", vendorCode: " + vendorCode);
- if (!(client instanceof Interruptable)) {
+ if (!(client instanceof ErrorConsumer)) {
Slog.e(mTag, "onError for non-error consumer: "
+ Utils.getClientName(client));
return;
}
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(error, vendorCode);
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(error, vendorCode);
if (error == Error.HW_UNAVAILABLE) {
mCallback.onHardwareUnavailable();
@@ -549,10 +550,10 @@
public void onBinderDied() {
final BaseClientMonitor client = mScheduler.getCurrentClient();
- if (client instanceof Interruptable) {
+ if (client instanceof ErrorConsumer) {
Slog.e(mTag, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE,
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */);
FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 243cc7c..eb78245 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -68,6 +68,7 @@
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
+import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -143,7 +144,7 @@
&& !client.isAlreadyDone()) {
Slog.e(TAG, "Stopping background authentication, top: "
+ topPackage + " currentClient: " + client);
- mScheduler.cancelAuthentication(client.getToken());
+ mScheduler.cancelAuthenticationOrDetection(client.getToken());
}
}
});
@@ -262,13 +263,13 @@
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
+ ", vendorCode: " + vendorCode);
- if (!(client instanceof Interruptable)) {
+ if (!(client instanceof ErrorConsumer)) {
Slog.e(TAG, "onError for non-error consumer: " + Utils.getClientName(client));
return;
}
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(error, vendorCode);
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(error, vendorCode);
if (error == BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE) {
Slog.e(TAG, "Got ERROR_HW_UNAVAILABLE");
@@ -392,10 +393,10 @@
mCurrentUserId = UserHandle.USER_NULL;
final BaseClientMonitor client = mScheduler.getCurrentClient();
- if (client instanceof Interruptable) {
+ if (client instanceof ErrorConsumer) {
Slog.e(TAG, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
- final Interruptable interruptable = (Interruptable) client;
- interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ final ErrorConsumer errorConsumer = (ErrorConsumer) client;
+ errorConsumer.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */);
FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
@@ -644,7 +645,7 @@
@Override
public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
- mHandler.post(() -> mScheduler.cancelAuthentication(token));
+ mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token));
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
index 6776810..fd38bdd 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
@@ -69,7 +69,7 @@
return;
}
- int firstSdkInt = Build.VERSION.FIRST_SDK_INT;
+ int firstSdkInt = Build.VERSION.DEVICE_INITIAL_SDK_INT;
if (firstSdkInt < Build.VERSION_CODES.BASE) {
Slog.e(TAG, "First SDK version " + firstSdkInt + " is invalid; must be " +
"at least VERSION_CODES.BASE");
diff --git a/services/core/java/com/android/server/connectivity/FullScore.java b/services/core/java/com/android/server/connectivity/FullScore.java
index a8a83fc..52da566 100644
--- a/services/core/java/com/android/server/connectivity/FullScore.java
+++ b/services/core/java/com/android/server/connectivity/FullScore.java
@@ -91,17 +91,26 @@
/** @hide */
public static final int POLICY_IS_INVINCIBLE = 58;
+ // This network has been validated at least once since it was connected, but not explicitly
+ // avoided in UI.
+ // TODO : remove setAvoidUnvalidated and instead disconnect the network when the user
+ // chooses to move away from this network, and remove this flag.
+ /** @hide */
+ public static final int POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD = 57;
+
// To help iterate when printing
@VisibleForTesting
- static final int MIN_CS_MANAGED_POLICY = POLICY_IS_INVINCIBLE;
+ static final int MIN_CS_MANAGED_POLICY = POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD;
@VisibleForTesting
static final int MAX_CS_MANAGED_POLICY = POLICY_IS_VALIDATED;
// Mask for policies in NetworkScore. This should have all bits managed by NetworkScore set
// and all bits managed by FullScore unset. As bits are handled from 0 up in NetworkScore and
- // from 63 down in FullScore, cut at the 32rd bit for simplicity, but change this if some day
+ // from 63 down in FullScore, cut at the 32nd bit for simplicity, but change this if some day
// there are more than 32 bits handled on either side.
- private static final int EXTERNAL_POLICIES_MASK = 0x0000FFFF;
+ // YIELD_TO_BAD_WIFI is temporarily handled by ConnectivityService.
+ private static final long EXTERNAL_POLICIES_MASK =
+ 0x00000000FFFFFFFFL & ~(1L << POLICY_YIELD_TO_BAD_WIFI);
@VisibleForTesting
static @NonNull String policyNameOf(final int policy) {
@@ -115,6 +124,7 @@
case POLICY_TRANSPORT_PRIMARY: return "TRANSPORT_PRIMARY";
case POLICY_EXITING: return "EXITING";
case POLICY_IS_INVINCIBLE: return "INVINCIBLE";
+ case POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD: return "EVER_VALIDATED";
}
throw new IllegalArgumentException("Unknown policy : " + policy);
}
@@ -137,6 +147,7 @@
* @param score the score supplied by the agent
* @param caps the NetworkCapabilities of the network
* @param config the NetworkAgentConfig of the network
+ * @param everValidated whether this network has ever validated
* @param yieldToBadWiFi whether this network yields to a previously validated wifi gone bad
* @return a FullScore that is appropriate to use for ranking.
*/
@@ -145,12 +156,13 @@
// connectivity for backward compatibility.
public static FullScore fromNetworkScore(@NonNull final NetworkScore score,
@NonNull final NetworkCapabilities caps, @NonNull final NetworkAgentConfig config,
- final boolean yieldToBadWiFi) {
+ final boolean everValidated, final boolean yieldToBadWiFi) {
return withPolicies(score.getLegacyInt(), score.getPolicies(),
score.getKeepConnectedReason(),
caps.hasCapability(NET_CAPABILITY_VALIDATED),
caps.hasTransport(TRANSPORT_VPN),
caps.hasCapability(NET_CAPABILITY_NOT_METERED),
+ everValidated,
config.explicitlySelected,
config.acceptUnvalidated,
yieldToBadWiFi,
@@ -179,6 +191,8 @@
// Prospective scores are always unmetered, because unmetered networks are stronger
// than metered networks, and it's not known in advance whether the network is metered.
final boolean unmetered = true;
+ // If the offer may validate, then it should be considered to have validated at some point
+ final boolean everValidated = mayValidate;
// The network hasn't been chosen by the user (yet, at least).
final boolean everUserSelected = false;
// Don't assume the user will accept unvalidated connectivity.
@@ -189,8 +203,8 @@
// score.
final boolean invincible = score.getLegacyInt() > NetworkRanker.LEGACY_INT_MAX;
return withPolicies(score.getLegacyInt(), score.getPolicies(), KEEP_CONNECTED_NONE,
- mayValidate, vpn, unmetered, everUserSelected, acceptUnvalidated, yieldToBadWiFi,
- invincible);
+ mayValidate, vpn, unmetered, everValidated, everUserSelected, acceptUnvalidated,
+ yieldToBadWiFi, invincible);
}
/**
@@ -204,11 +218,14 @@
// telephony factory, so that it depends on the carrier. For now this is handled by
// connectivity for backward compatibility.
public FullScore mixInScore(@NonNull final NetworkCapabilities caps,
- @NonNull final NetworkAgentConfig config, final boolean yieldToBadWifi) {
+ @NonNull final NetworkAgentConfig config,
+ final boolean everValidated,
+ final boolean yieldToBadWifi) {
return withPolicies(mLegacyInt, mPolicies, mKeepConnectedReason,
caps.hasCapability(NET_CAPABILITY_VALIDATED),
caps.hasTransport(TRANSPORT_VPN),
caps.hasCapability(NET_CAPABILITY_NOT_METERED),
+ everValidated,
config.explicitlySelected,
config.acceptUnvalidated,
yieldToBadWifi,
@@ -224,6 +241,7 @@
final boolean isValidated,
final boolean isVpn,
final boolean isUnmetered,
+ final boolean everValidated,
final boolean everUserSelected,
final boolean acceptUnvalidated,
final boolean yieldToBadWiFi,
@@ -232,6 +250,7 @@
| (isValidated ? 1L << POLICY_IS_VALIDATED : 0)
| (isVpn ? 1L << POLICY_IS_VPN : 0)
| (isUnmetered ? 1L << POLICY_IS_UNMETERED : 0)
+ | (everValidated ? 1L << POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD : 0)
| (everUserSelected ? 1L << POLICY_EVER_USER_SELECTED : 0)
| (acceptUnvalidated ? 1L << POLICY_ACCEPT_UNVALIDATED : 0)
| (yieldToBadWiFi ? 1L << POLICY_YIELD_TO_BAD_WIFI : 0)
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 5d793fd..4d310cb 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -707,7 +707,8 @@
@NonNull final NetworkCapabilities nc) {
final NetworkCapabilities oldNc = networkCapabilities;
networkCapabilities = nc;
- mScore = mScore.mixInScore(networkCapabilities, networkAgentConfig, yieldToBadWiFi());
+ mScore = mScore.mixInScore(networkCapabilities, networkAgentConfig, everValidatedForYield(),
+ yieldToBadWiFi());
final NetworkMonitorManager nm = mNetworkMonitor;
if (nm != null) {
nm.notifyNetworkCapabilitiesChanged(nc);
@@ -893,7 +894,7 @@
// Caller must not mutate. This method is called frequently and making a defensive copy
// would be too expensive. This is used by NetworkRanker.Scoreable, so it can be compared
// against other scoreables.
- @Override public NetworkCapabilities getCaps() {
+ @Override public NetworkCapabilities getCapsNoCopy() {
return networkCapabilities;
}
@@ -919,7 +920,7 @@
*/
public void setScore(final NetworkScore score) {
mScore = FullScore.fromNetworkScore(score, networkCapabilities, networkAgentConfig,
- yieldToBadWiFi());
+ everValidatedForYield(), yieldToBadWiFi());
}
/**
@@ -927,8 +928,13 @@
*
* Call this after updating the network agent config.
*/
- public void updateScoreForNetworkAgentConfigUpdate() {
- mScore = mScore.mixInScore(networkCapabilities, networkAgentConfig, yieldToBadWiFi());
+ public void updateScoreForNetworkAgentUpdate() {
+ mScore = mScore.mixInScore(networkCapabilities, networkAgentConfig,
+ everValidatedForYield(), yieldToBadWiFi());
+ }
+
+ private boolean everValidatedForYield() {
+ return everValidated && !avoidUnvalidated;
}
/**
diff --git a/services/core/java/com/android/server/connectivity/NetworkOffer.java b/services/core/java/com/android/server/connectivity/NetworkOffer.java
index 5336593..8285e7a 100644
--- a/services/core/java/com/android/server/connectivity/NetworkOffer.java
+++ b/services/core/java/com/android/server/connectivity/NetworkOffer.java
@@ -76,7 +76,7 @@
/**
* Get the capabilities filter of this offer
*/
- @Override @NonNull public NetworkCapabilities getCaps() {
+ @Override @NonNull public NetworkCapabilities getCapsNoCopy() {
return caps;
}
@@ -133,7 +133,7 @@
* @param previousOffer the previous offer
*/
public void migrateFrom(@NonNull final NetworkOffer previousOffer) {
- if (!callback.equals(previousOffer.callback)) {
+ if (!callback.asBinder().equals(previousOffer.callback.asBinder())) {
throw new IllegalArgumentException("Can only migrate from a previous version of"
+ " the same offer");
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java
index 3aaff59..c123ea7 100644
--- a/services/core/java/com/android/server/connectivity/NetworkRanker.java
+++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java
@@ -26,6 +26,7 @@
import static com.android.server.connectivity.FullScore.POLICY_ACCEPT_UNVALIDATED;
import static com.android.server.connectivity.FullScore.POLICY_EVER_USER_SELECTED;
+import static com.android.server.connectivity.FullScore.POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD;
import static com.android.server.connectivity.FullScore.POLICY_IS_INVINCIBLE;
import static com.android.server.connectivity.FullScore.POLICY_IS_VALIDATED;
import static com.android.server.connectivity.FullScore.POLICY_IS_VPN;
@@ -58,7 +59,7 @@
/** Get score of this scoreable */
FullScore getScore();
/** Get capabilities of this scoreable */
- NetworkCapabilities getCaps();
+ NetworkCapabilities getCapsNoCopy();
}
private static final boolean USE_POLICY_RANKING = false;
@@ -158,11 +159,12 @@
if (accepted.size() == 1) return accepted.get(0);
if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted);
- // Yield to bad wifi policy : if any wifi has ever been validated, keep only networks
- // that don't yield to such a wifi network.
+ // Yield to bad wifi policy : if any wifi has ever been validated (even if it's now
+ // unvalidated), and unless it's been explicitly avoided when bad in UI, then keep only
+ // networks that don't yield to such a wifi network.
final boolean anyWiFiEverValidated = CollectionUtils.any(candidates,
- nai -> nai.getScore().hasPolicy(POLICY_EVER_USER_SELECTED)
- && nai.getCaps().hasTransport(TRANSPORT_WIFI));
+ nai -> nai.getScore().hasPolicy(POLICY_EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD)
+ && nai.getCapsNoCopy().hasTransport(TRANSPORT_WIFI));
if (anyWiFiEverValidated) {
partitionInto(candidates, nai -> !nai.getScore().hasPolicy(POLICY_YIELD_TO_BAD_WIFI),
accepted, rejected);
@@ -206,18 +208,18 @@
for (final Scoreable defaultSubNai : accepted) {
// Remove all networks without the DEFAULT_SUBSCRIPTION policy and the same transports
// as a network that has it.
- final int[] transports = defaultSubNai.getCaps().getTransportTypes();
+ final int[] transports = defaultSubNai.getCapsNoCopy().getTransportTypes();
candidates.removeIf(nai -> !nai.getScore().hasPolicy(POLICY_TRANSPORT_PRIMARY)
- && Arrays.equals(transports, nai.getCaps().getTransportTypes()));
+ && Arrays.equals(transports, nai.getCapsNoCopy().getTransportTypes()));
}
if (1 == candidates.size()) return candidates.get(0);
- // It's guaranteed candidates.size() > 0 because there is at least one with DEFAULT_SUB
- // policy and only those without it were removed.
+ // It's guaranteed candidates.size() > 0 because there is at least one with the
+ // TRANSPORT_PRIMARY policy and only those without it were removed.
// If some of the networks have a better transport than others, keep only the ones with
// the best transports.
for (final int transport : PREFERRED_TRANSPORTS_ORDER) {
- partitionInto(candidates, nai -> nai.getCaps().hasTransport(transport),
+ partitionInto(candidates, nai -> nai.getCapsNoCopy().hasTransport(transport),
accepted, rejected);
if (accepted.size() == 1) return accepted.get(0);
if (accepted.size() > 0 && rejected.size() > 0) {
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
index 3711679..28f208b 100644
--- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -133,7 +133,7 @@
* Get device first sdk version.
*/
public int getDeviceFirstSdkInt() {
- return Build.VERSION.FIRST_SDK_INT;
+ return Build.VERSION.DEVICE_INITIAL_SDK_INT;
}
}
@@ -286,7 +286,7 @@
for (UserHandle user : users) {
if (user == null) continue;
- list.add(UserHandle.getUid(user, app.getKey()));
+ list.add(user.getUid(app.getKey()));
}
}
try {
@@ -555,7 +555,7 @@
final UserHandle handle = UserHandle.of(userId);
if (handle == null) continue;
- final int uid = UserHandle.getUid(handle, appId);
+ final int uid = handle.getUid(appId);
if (range.contains(uid)) {
result.add(uid);
}
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 4bbd338..67779a2 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -27,6 +27,7 @@
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.DisplayManager;
+import android.hardware.fingerprint.IUdfpsHbmListener;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
@@ -40,14 +41,17 @@
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.view.Display;
import android.view.DisplayInfo;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
+import com.android.server.LocalServices;
import com.android.server.display.utils.AmbientFilter;
import com.android.server.display.utils.AmbientFilterFactory;
+import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.utils.DeviceConfigInterface;
import java.io.PrintWriter;
@@ -93,6 +97,7 @@
private final AppRequestObserver mAppRequestObserver;
private final SettingsObserver mSettingsObserver;
private final DisplayObserver mDisplayObserver;
+ private final UdfpsObserver mUdfpsObserver;
private final DeviceConfigInterface mDeviceConfig;
private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
@@ -133,6 +138,7 @@
mSettingsObserver = new SettingsObserver(context, handler);
mDisplayObserver = new DisplayObserver(context, handler);
mBrightnessObserver = new BrightnessObserver(context, handler);
+ mUdfpsObserver = new UdfpsObserver();
mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings();
mDeviceConfig = injector.getDeviceConfig();
mAlwaysRespectAppRequest = false;
@@ -149,6 +155,7 @@
mSettingsObserver.observe();
mDisplayObserver.observe();
mBrightnessObserver.observe(sensorManager);
+ mUdfpsObserver.observe();
synchronized (mLock) {
// We may have a listener already registered before the call to start, so go ahead and
// notify them to pick up our newly initialized state.
@@ -545,6 +552,7 @@
mSettingsObserver.dumpLocked(pw);
mAppRequestObserver.dumpLocked(pw);
mBrightnessObserver.dumpLocked(pw);
+ mUdfpsObserver.dumpLocked(pw);
}
}
@@ -566,7 +574,6 @@
}
final SparseArray<Vote> votes = getOrCreateVotesByDisplay(displayId);
- Vote currentVote = votes.get(priority);
if (vote != null) {
votes.put(priority, vote);
} else {
@@ -649,6 +656,11 @@
return mSettingsObserver;
}
+ @VisibleForTesting
+ UdfpsObserver getUdpfsObserver() {
+ return mUdfpsObserver;
+ }
+
@VisibleForTesting
DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings(
@@ -928,11 +940,15 @@
// LOW_POWER_MODE force display to [0, 60HZ] if Settings.Global.LOW_POWER_MODE is on.
public static final int PRIORITY_LOW_POWER_MODE = 6;
+ // The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order
+ // to function, so this needs to be the highest priority of all votes.
+ public static final int PRIORITY_UDFPS = 7;
+
// Whenever a new priority is added, remember to update MIN_PRIORITY, MAX_PRIORITY, and
// APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF, as well as priorityToString.
public static final int MIN_PRIORITY = PRIORITY_DEFAULT_REFRESH_RATE;
- public static final int MAX_PRIORITY = PRIORITY_LOW_POWER_MODE;
+ public static final int MAX_PRIORITY = PRIORITY_UDFPS;
// The cutoff for the app request refresh rate range. Votes with priorities lower than this
// value will not be considered when constructing the app request refresh rate range.
@@ -989,6 +1005,9 @@
return "PRIORITY_USER_SETTING_PEAK_REFRESH_RATE";
case PRIORITY_LOW_POWER_MODE:
return "PRIORITY_LOW_POWER_MODE";
+ case PRIORITY_UDFPS:
+ return "PRIORITY_UDFPS";
+
default:
return Integer.toString(priority);
}
@@ -1162,7 +1181,7 @@
}
final class AppRequestObserver {
- private SparseArray<Display.Mode> mAppRequestedModeByDisplay;
+ private final SparseArray<Display.Mode> mAppRequestedModeByDisplay;
AppRequestObserver() {
mAppRequestedModeByDisplay = new SparseArray<>();
@@ -1196,7 +1215,6 @@
updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, refreshRateVote);
updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
- return;
}
private Display.Mode findModeByIdLocked(int displayId, int modeId) {
@@ -1328,7 +1346,8 @@
private SensorManager mSensorManager;
private Sensor mLightSensor;
- private LightSensorEventListener mLightSensorListener = new LightSensorEventListener();
+ private final LightSensorEventListener mLightSensorListener =
+ new LightSensorEventListener();
// Take it as low brightness before valid sensor data comes
private float mAmbientLux = -1.0f;
private AmbientFilter mAmbientFilter;
@@ -1559,8 +1578,7 @@
mLightSensorListener.dumpLocked(pw);
if (mAmbientFilter != null) {
- IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
- ipw.setIndent(" ");
+ IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
mAmbientFilter.dump(ipw);
}
}
@@ -1907,7 +1925,7 @@
return false;
}
- private Runnable mInjectSensorEventRunnable = new Runnable() {
+ private final Runnable mInjectSensorEventRunnable = new Runnable() {
@Override
public void run() {
long now = SystemClock.uptimeMillis();
@@ -1926,6 +1944,83 @@
}
}
+ private class UdfpsObserver extends IUdfpsHbmListener.Stub {
+ private final SparseBooleanArray mLocalHbmEnabled = new SparseBooleanArray();
+ private final SparseBooleanArray mGlobalHbmEnabled = new SparseBooleanArray();
+
+ public void observe() {
+ StatusBarManagerInternal statusBar =
+ LocalServices.getService(StatusBarManagerInternal.class);
+ statusBar.setUdfpsHbmListener(this);
+ }
+
+ @Override
+ public void onHbmEnabled(int hbmType, int displayId) {
+ synchronized (mLock) {
+ updateHbmStateLocked(hbmType, displayId, true /*enabled*/);
+ }
+ }
+
+ @Override
+ public void onHbmDisabled(int hbmType, int displayId) {
+ synchronized (mLock) {
+ updateHbmStateLocked(hbmType, displayId, false /*enabled*/);
+ }
+ }
+
+ private void updateHbmStateLocked(int hbmType, int displayId, boolean enabled) {
+ switch (hbmType) {
+ case UdfpsObserver.LOCAL_HBM:
+ mLocalHbmEnabled.put(displayId, enabled);
+ break;
+ case UdfpsObserver.GLOBAL_HBM:
+ mGlobalHbmEnabled.put(displayId, enabled);
+ break;
+ default:
+ Slog.w(TAG, "Unknown HBM type reported. Ignoring.");
+ return;
+ }
+ updateVoteLocked(displayId);
+ }
+
+ private void updateVoteLocked(int displayId) {
+ final Vote vote;
+ if (mGlobalHbmEnabled.get(displayId)) {
+ vote = Vote.forRefreshRates(60f, 60f);
+ } else if (mLocalHbmEnabled.get(displayId)) {
+ Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
+ float maxRefreshRate = 0f;
+ for (Display.Mode mode : modes) {
+ if (mode.getRefreshRate() > maxRefreshRate) {
+ maxRefreshRate = mode.getRefreshRate();
+ }
+ }
+ vote = Vote.forRefreshRates(maxRefreshRate, maxRefreshRate);
+ } else {
+ vote = null;
+ }
+
+ DisplayModeDirector.this.updateVoteLocked(displayId, Vote.PRIORITY_UDFPS, vote);
+ }
+
+ void dumpLocked(PrintWriter pw) {
+ pw.println(" UdfpsObserver");
+ pw.println(" mLocalHbmEnabled: ");
+ for (int i = 0; i < mLocalHbmEnabled.size(); i++) {
+ final int displayId = mLocalHbmEnabled.keyAt(i);
+ final String enabled = mLocalHbmEnabled.valueAt(i) ? "enabled" : "disabled";
+ pw.println(" Display " + displayId + ": " + enabled);
+ }
+ pw.println(" mGlobalHbmEnabled: ");
+ for (int i = 0; i < mGlobalHbmEnabled.size(); i++) {
+ final int displayId = mGlobalHbmEnabled.keyAt(i);
+ final String enabled = mGlobalHbmEnabled.valueAt(i) ? "enabled" : "disabled";
+ pw.println(" Display " + displayId + ": " + enabled);
+ }
+
+ }
+ }
+
private class DeviceConfigDisplaySettings implements DeviceConfig.OnPropertiesChangedListener {
public DeviceConfigDisplaySettings() {
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index cb8541e..5cd0534 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -140,6 +140,7 @@
private static final int RAMP_STATE_SKIP_INITIAL = 1;
private static final int RAMP_STATE_SKIP_AUTOBRIGHT = 2;
+ private static final int REPORTED_TO_POLICY_UNREPORTED = -1;
private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0;
private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1;
private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
@@ -311,8 +312,8 @@
private long mScreenOnBlockStartRealTime;
private long mScreenOffBlockStartRealTime;
- // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields.
- private int mReportedScreenStateToPolicy;
+ // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_* fields.
+ private int mReportedScreenStateToPolicy = REPORTED_TO_POLICY_UNREPORTED;
// If the last recorded screen state was dozing or not.
private boolean mDozing;
@@ -1440,12 +1441,14 @@
private boolean setScreenState(int state, boolean reportOnly) {
final boolean isOff = (state == Display.STATE_OFF);
- if (mPowerState.getScreenState() != state) {
+ if (mPowerState.getScreenState() != state
+ || mReportedScreenStateToPolicy == REPORTED_TO_POLICY_UNREPORTED) {
// If we are trying to turn screen off, give policy a chance to do something before we
// actually turn the screen off.
if (isOff && !mScreenOffBecauseOfProximity) {
- if (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_ON) {
+ if (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_ON
+ || mReportedScreenStateToPolicy == REPORTED_TO_POLICY_UNREPORTED) {
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_OFF);
blockScreenOff();
mWindowManagerPolicy.screenTurningOff(mDisplayId, mPendingScreenOffUnblocker);
@@ -1456,7 +1459,7 @@
}
}
- if (!reportOnly) {
+ if (!reportOnly && mPowerState.getScreenState() != state) {
Trace.traceCounter(Trace.TRACE_TAG_POWER, "ScreenState", state);
// TODO(b/153319140) remove when we can get this from the above trace invocation
SystemProperties.set("debug.tracing.screen_state", String.valueOf(state));
@@ -1486,7 +1489,9 @@
mWindowManagerPolicy.screenTurnedOff(mDisplayId);
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
}
- if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {
+ if (!isOff
+ && (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF
+ || mReportedScreenStateToPolicy == REPORTED_TO_POLICY_UNREPORTED)) {
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_ON);
if (mPowerState.getColorFadeLevel() == 0.0f) {
blockScreenOn();
diff --git a/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java b/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
index cf9a79f..5457ef2 100644
--- a/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
+++ b/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
@@ -317,40 +317,45 @@
"Signature file argument is required.");
}
- // TODO: close fontFd and sigFd.
- ParcelFileDescriptor fontFd = shell.openFileForSystem(fontPath, "r");
- if (fontFd == null) {
- throw new SystemFontException(
- FontManager.RESULT_ERROR_FAILED_TO_OPEN_FONT_FILE,
- "Failed to open font file");
- }
-
- ParcelFileDescriptor sigFd = shell.openFileForSystem(signaturePath, "r");
- if (sigFd == null) {
- throw new SystemFontException(
- FontManager.RESULT_ERROR_FAILED_TO_OPEN_SIGNATURE_FILE,
- "Failed to open signature file");
- }
-
- try (FileInputStream sigFis = new FileInputStream(sigFd.getFileDescriptor())) {
- int len = sigFis.available();
- if (len > MAX_SIGNATURE_FILE_SIZE_BYTES) {
+ try (ParcelFileDescriptor fontFd = shell.openFileForSystem(fontPath, "r");
+ ParcelFileDescriptor sigFd = shell.openFileForSystem(signaturePath, "r")) {
+ if (fontFd == null) {
throw new SystemFontException(
- FontManager.RESULT_ERROR_SIGNATURE_TOO_LARGE,
- "Signature file is too large");
+ FontManager.RESULT_ERROR_FAILED_TO_OPEN_FONT_FILE,
+ "Failed to open font file");
}
- byte[] signature = new byte[len];
- if (sigFis.read(signature, 0, len) != len) {
+
+ if (sigFd == null) {
+ throw new SystemFontException(
+ FontManager.RESULT_ERROR_FAILED_TO_OPEN_SIGNATURE_FILE,
+ "Failed to open signature file");
+ }
+
+ byte[] signature;
+ try (FileInputStream sigFis = new FileInputStream(sigFd.getFileDescriptor())) {
+ int len = sigFis.available();
+ if (len > MAX_SIGNATURE_FILE_SIZE_BYTES) {
+ throw new SystemFontException(
+ FontManager.RESULT_ERROR_SIGNATURE_TOO_LARGE,
+ "Signature file is too large");
+ }
+ signature = new byte[len];
+ if (sigFis.read(signature, 0, len) != len) {
+ throw new SystemFontException(
+ FontManager.RESULT_ERROR_INVALID_SIGNATURE_FILE,
+ "Invalid read length");
+ }
+ } catch (IOException e) {
throw new SystemFontException(
FontManager.RESULT_ERROR_INVALID_SIGNATURE_FILE,
- "Invalid read length");
+ "Failed to read signature file.", e);
}
mService.update(
-1, Collections.singletonList(new FontUpdateRequest(fontFd, signature)));
} catch (IOException e) {
- throw new SystemFontException(
- FontManager.RESULT_ERROR_INVALID_SIGNATURE_FILE,
- "Failed to read signature file.", e);
+ // We should reach here only when close() threw IOException.
+ // shell.openFileForSystem() and FontManagerService.update() don't throw IOException.
+ Slog.w(TAG, "Error while closing files", e);
}
shell.getOutPrintWriter().println("Success"); // TODO: Output more details.
diff --git a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
index c9ec90f..c56f386 100644
--- a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
+++ b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
@@ -184,7 +184,7 @@
return;
}
FontFileInfo fontFileInfo = validateFontFile(files[0]);
- addFileToMapIfNewer(fontFileInfo, true /* deleteOldFile */);
+ addFileToMapIfSameOrNewer(fontFileInfo, true /* deleteOldFile */);
}
success = true;
} catch (Throwable t) {
@@ -367,7 +367,7 @@
"Failed to change mode to 711", e);
}
FontFileInfo fontFileInfo = validateFontFile(newFontFile);
- if (!addFileToMapIfNewer(fontFileInfo, false)) {
+ if (!addFileToMapIfSameOrNewer(fontFileInfo, false)) {
throw new SystemFontException(
FontManager.RESULT_ERROR_DOWNGRADING,
"Downgrading font file is forbidden.");
@@ -408,10 +408,10 @@
/**
* Add the given {@link FontFileInfo} to {@link #mFontFileInfoMap} if its font revision is
- * higher than the currently used font file (either in {@link #mFontFileInfoMap} or {@link
- * #mPreinstalledFontDirs}).
+ * equal to or higher than the revision of currently used font file (either in
+ * {@link #mFontFileInfoMap} or {@link #mPreinstalledFontDirs}).
*/
- private boolean addFileToMapIfNewer(FontFileInfo fontFileInfo, boolean deleteOldFile) {
+ private boolean addFileToMapIfSameOrNewer(FontFileInfo fontFileInfo, boolean deleteOldFile) {
FontFileInfo existingInfo = lookupFontFileInfo(fontFileInfo.getPostScriptName());
final boolean shouldAddToMap;
if (existingInfo == null) {
@@ -419,9 +419,9 @@
// Note that getPreinstalledFontRevision() returns -1 if there is no preinstalled font
// with 'name'.
long preInstalledRev = getPreinstalledFontRevision(fontFileInfo.getFile().getName());
- shouldAddToMap = preInstalledRev < fontFileInfo.getRevision();
+ shouldAddToMap = preInstalledRev <= fontFileInfo.getRevision();
} else {
- shouldAddToMap = existingInfo.getRevision() < fontFileInfo.getRevision();
+ shouldAddToMap = existingInfo.getRevision() <= fontFileInfo.getRevision();
}
if (shouldAddToMap) {
if (deleteOldFile && existingInfo != null) {
diff --git a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
index dedf2e2..049a339 100644
--- a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
@@ -49,10 +49,7 @@
switch (cmd.getOpcode()) {
case Constants.MESSAGE_REPORT_ARC_TERMINATED:
mState = STATE_ARC_TERMINATED;
- audioSystem().setArcStatus(false);
- if (audioSystem().getLocalActivePort() == Constants.CEC_SWITCH_ARC) {
- audioSystem().routeToInputFromPortId(audioSystem().getRoutingPort());
- }
+ audioSystem().processArcTermination();
finish();
return true;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
index 6fbb26c..cb05f8f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
@@ -319,7 +319,7 @@
Setting powerControlMode = registerSetting(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
- R.bool.config_cecSendStandbyOnSleep_userConfigurable);
+ R.bool.config_cecPowerControlMode_userConfigurable);
powerControlMode.registerValue(HdmiControlManager.POWER_CONTROL_MODE_TV,
R.bool.config_cecPowerControlModeTv_allowed,
R.bool.config_cecPowerControlModeTv_default);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 790c067..3678b19 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -358,8 +358,12 @@
@Constants.HandleMessageResult
protected int handleReportArcInitiate(HdmiCecMessage message) {
assertRunOnServiceThread();
- // TODO(amyjojo): implement report arc initiate handler
- HdmiLogger.debug(TAG + "Stub handleReportArcInitiate");
+ /*
+ * Ideally, we should have got this response before the {@link ArcInitiationActionFromAvr}
+ * has timed out. Even if the response is late, {@link ArcInitiationActionFromAvr
+ * #handleInitiateArcTimeout()} would not have disabled ARC. So nothing needs to be done
+ * here.
+ */
return Constants.HANDLED;
}
@@ -368,8 +372,7 @@
@Constants.HandleMessageResult
protected int handleReportArcTermination(HdmiCecMessage message) {
assertRunOnServiceThread();
- // TODO(amyjojo): implement report arc terminate handler
- HdmiLogger.debug(TAG + "Stub handleReportArcTermination");
+ processArcTermination();
return Constants.HANDLED;
}
@@ -712,6 +715,14 @@
mArcEstablished = enabled;
}
+ void processArcTermination() {
+ setArcStatus(false);
+ // Switch away from ARC input when ARC is terminated.
+ if (getLocalActivePort() == Constants.CEC_SWITCH_ARC) {
+ routeToInputFromPortId(getRoutingPort());
+ }
+ }
+
/** Switch hardware ARC circuit in the system. */
@ServiceThreadOnly
private void enableAudioReturnChannel(boolean enabled) {
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 0f13741..0a800e9 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -57,7 +57,7 @@
import android.media.AudioManager;
import android.os.Binder;
import android.os.Bundle;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
@@ -2033,23 +2033,23 @@
// Binder call
@Override
- public void vibrateCombined(int deviceId, CombinedVibrationEffect effect, IBinder token) {
+ public void vibrateCombined(int deviceId, CombinedVibration effect, IBinder token) {
VibratorToken v = getVibratorToken(deviceId, token);
synchronized (v) {
- if (!(effect instanceof CombinedVibrationEffect.Mono)
- && !(effect instanceof CombinedVibrationEffect.Stereo)) {
+ if (!(effect instanceof CombinedVibration.Mono)
+ && !(effect instanceof CombinedVibration.Stereo)) {
Slog.e(TAG, "Only Mono and Stereo effects are supported");
return;
}
v.mVibrating = true;
- if (effect instanceof CombinedVibrationEffect.Mono) {
- CombinedVibrationEffect.Mono mono = (CombinedVibrationEffect.Mono) effect;
+ if (effect instanceof CombinedVibration.Mono) {
+ CombinedVibration.Mono mono = (CombinedVibration.Mono) effect;
VibrationInfo info = new VibrationInfo(mono.getEffect());
nativeVibrate(mPtr, deviceId, info.getPattern(), info.getAmplitudes(),
info.getRepeatIndex(), v.mTokenValue);
- } else if (effect instanceof CombinedVibrationEffect.Stereo) {
- CombinedVibrationEffect.Stereo stereo = (CombinedVibrationEffect.Stereo) effect;
+ } else if (effect instanceof CombinedVibration.Stereo) {
+ CombinedVibration.Stereo stereo = (CombinedVibration.Stereo) effect;
SparseArray<VibrationEffect> effects = stereo.getEffects();
long[] pattern = new long[0];
int repeat = Integer.MIN_VALUE;
diff --git a/services/core/java/com/android/server/location/gnss/GnssPowerStats.java b/services/core/java/com/android/server/location/gnss/GnssPowerStats.java
index 924ffe1..4bff6cf 100644
--- a/services/core/java/com/android/server/location/gnss/GnssPowerStats.java
+++ b/services/core/java/com/android/server/location/gnss/GnssPowerStats.java
@@ -181,7 +181,7 @@
ipw.println("mJ");
}
if (capabilities.hasPowerOtherModes()) {
- for (int i = 1; i <= mOtherModesEnergyMilliJoule.length; i++) {
+ for (int i = 0; i < mOtherModesEnergyMilliJoule.length; i++) {
ipw.print("other mode [" + i + "] power: ");
ipw.print(mOtherModesEnergyMilliJoule[i]);
ipw.println("mJ");
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index c4a59c2..5d61fef 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -600,11 +600,10 @@
throws XmlPullParserException, IOException {
// read grants
int type;
- String version = "";
+ String version = XmlUtils.readStringAttribute(parser, ATT_VERSION);
readDefaults(parser);
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
String tag = parser.getName();
- version = XmlUtils.readStringAttribute(parser, ATT_VERSION);
if (type == XmlPullParser.END_TAG
&& getConfig().xmlTag.equals(tag)) {
break;
@@ -642,7 +641,7 @@
rebindServices(false, USER_ALL);
}
- private void upgradeDefaultsXmlVersion() {
+ void upgradeDefaultsXmlVersion() {
// check if any defaults are loaded
int defaultsSize = mDefaultComponents.size() + mDefaultPackages.size();
if (defaultsSize == 0) {
@@ -1770,10 +1769,17 @@
UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
if (userManager != null) {
int currentUserId = ActivityManager.getCurrentUser();
- List<UserInfo> profiles = userManager.getProfiles(currentUserId);
+ List<UserInfo> unlockedProfiles = new ArrayList<>();
+ for (UserInfo user : userManager.getProfiles(currentUserId)) {
+ // Dependencies throw if we call APIs on a locked user. Only include
+ // unlocked users.
+ if (userManager.isUserUnlocked(user.id)) {
+ unlockedProfiles.add(user);
+ }
+ }
synchronized (mCurrentProfiles) {
mCurrentProfiles.clear();
- for (UserInfo user : profiles) {
+ for (UserInfo user : unlockedProfiles) {
mCurrentProfiles.put(user.id, user);
}
}
diff --git a/services/core/java/com/android/server/notification/NASLearnMoreActivity.java b/services/core/java/com/android/server/notification/NASLearnMoreActivity.java
new file mode 100644
index 0000000..744a44f
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NASLearnMoreActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import com.android.internal.R;
+
+
+public class NASLearnMoreActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showLearnMoreDialog();
+ }
+
+ private void showLearnMoreDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ AlertDialog alertDialog = builder.setMessage(
+ R.string.nas_upgrade_notification_learn_more_content)
+ .setPositiveButton(R.string.ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ NASLearnMoreActivity.this.finish();
+ }
+ })
+ .create();
+ alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ alertDialog.show();
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 2f4cbd5..3ddfe6c 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -212,6 +212,7 @@
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.DeviceConfig;
@@ -265,6 +266,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.messages.nano.SystemMessageProto;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.SomeArgs;
@@ -619,6 +621,12 @@
private NotificationRecordLogger mNotificationRecordLogger;
private InstanceIdSequence mNotificationInstanceIdSequence;
private Set<String> mMsgPkgsAllowedAsConvos = new HashSet();
+ protected static final String ACTION_ENABLE_NAS =
+ "android.server.notification.action.ENABLE_NAS";
+ protected static final String ACTION_DISABLE_NAS =
+ "android.server.notification.action.DISABLE_NAS";
+ protected static final String ACTION_LEARNMORE_NAS =
+ "android.server.notification.action.LEARNMORE_NAS";
static class Archive {
final SparseArray<Boolean> mEnabled;
@@ -725,6 +733,105 @@
setDefaultAssistantForUser(userId);
}
+ protected void migrateDefaultNASShowNotificationIfNecessary() {
+ final List<UserInfo> activeUsers = mUm.getUsers();
+ for (UserInfo userInfo : activeUsers) {
+ int userId = userInfo.getUserHandle().getIdentifier();
+ if (isNASMigrationDone(userId)) {
+ continue;
+ }
+ if (mAssistants.hasUserSet(userId)) {
+ mAssistants.loadDefaultsFromConfig(false);
+ ComponentName defaultFromConfig = mAssistants.getDefaultFromConfig();
+ List<ComponentName> allowedComponents = mAssistants.getAllowedComponents(userId);
+ if (allowedComponents.contains(defaultFromConfig)) {
+ setNASMigrationDone(userId);
+ mAssistants.resetDefaultFromConfig();
+ continue;
+ }
+ //User selected different NAS or none, need onboarding
+ enqueueNotificationInternal(getContext().getPackageName(),
+ getContext().getOpPackageName(), Binder.getCallingUid(),
+ Binder.getCallingPid(), TAG,
+ SystemMessageProto.SystemMessage.NOTE_NAS_UPGRADE,
+ createNASUpgradeNotification(userId), userId);
+ }
+ }
+ }
+
+ protected Notification createNASUpgradeNotification(int userId) {
+ final Bundle extras = new Bundle();
+ extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
+ getContext().getResources().getString(R.string.global_action_settings));
+ int title = R.string.nas_upgrade_notification_title;
+ int content = R.string.nas_upgrade_notification_content;
+
+ Intent onboardingIntent = new Intent(Settings.ACTION_NOTIFICATION_ASSISTANT_SETTINGS);
+ onboardingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+
+ Intent enableIntent = new Intent(ACTION_ENABLE_NAS);
+ enableIntent.putExtra(Intent.EXTRA_USER_ID, userId);
+ PendingIntent enableNASPendingIntent = PendingIntent.getBroadcast(getContext(),
+ 0, enableIntent, PendingIntent.FLAG_IMMUTABLE);
+
+ Intent disableIntent = new Intent(ACTION_DISABLE_NAS);
+ disableIntent.putExtra(Intent.EXTRA_USER_ID, userId);
+ PendingIntent disableNASPendingIntent = PendingIntent.getBroadcast(getContext(),
+ 0, disableIntent, PendingIntent.FLAG_IMMUTABLE);
+
+ Intent learnMoreIntent = new Intent(ACTION_LEARNMORE_NAS);
+ learnMoreIntent.putExtra(Intent.EXTRA_USER_ID, userId);
+ PendingIntent learnNASPendingIntent = PendingIntent.getBroadcast(getContext(),
+ 0, learnMoreIntent, PendingIntent.FLAG_IMMUTABLE);
+
+ Notification.Action enableNASAction = new Notification.Action.Builder(
+ 0,
+ getContext().getResources().getString(
+ R.string.nas_upgrade_notification_enable_action),
+ enableNASPendingIntent).build();
+
+ Notification.Action disableNASAction = new Notification.Action.Builder(
+ 0,
+ getContext().getResources().getString(
+ R.string.nas_upgrade_notification_disable_action),
+ disableNASPendingIntent).build();
+
+ Notification.Action learnMoreNASAction = new Notification.Action.Builder(
+ 0,
+ getContext().getResources().getString(
+ R.string.nas_upgrade_notification_learn_more_action),
+ learnNASPendingIntent).build();
+
+
+ return new Notification.Builder(getContext(), SystemNotificationChannels.ALERTS)
+ .setAutoCancel(false)
+ .setOngoing(true)
+ .setTicker(getContext().getResources().getString(title))
+ .setSmallIcon(R.drawable.ic_settings_24dp)
+ .setContentTitle(getContext().getResources().getString(title))
+ .setContentText(getContext().getResources().getString(content))
+ .setContentIntent(PendingIntent.getActivity(getContext(), 0, onboardingIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))
+ .setLocalOnly(true)
+ .setStyle(new Notification.BigTextStyle())
+ .addAction(enableNASAction)
+ .addAction(disableNASAction)
+ .addAction(learnMoreNASAction)
+ .build();
+ }
+
+ @VisibleForTesting
+ void setNASMigrationDone(int userId) {
+ Settings.Secure.putIntForUser(getContext().getContentResolver(),
+ Settings.Secure.NAS_SETTINGS_UPDATED, 1, userId);
+ }
+
+ @VisibleForTesting
+ boolean isNASMigrationDone(int userId) {
+ return (Settings.Secure.getIntForUser(getContext().getContentResolver(),
+ Settings.Secure.NAS_SETTINGS_UPDATED, 0, userId) == 1);
+ }
+
protected void setDefaultAssistantForUser(int userId) {
String overrideDefaultAssistantString = DeviceConfig.getProperty(
DeviceConfig.NAMESPACE_SYSTEMUI,
@@ -970,23 +1077,8 @@
(status & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0;
if (disableNotificationEffects(null) != null) {
// cancel whatever's going on
- final long identity = Binder.clearCallingIdentity();
- try {
- final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
- if (player != null) {
- player.stopAsync();
- }
- } catch (RemoteException e) {
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
-
- final long identity2 = Binder.clearCallingIdentity();
- try {
- mVibrator.cancel();
- } finally {
- Binder.restoreCallingIdentity(identity2);
- }
+ clearSoundLocked();
+ clearVibrateLocked();
}
}
}
@@ -1332,26 +1424,16 @@
return;
}
- int flags = data.getFlags();
boolean flagChanged = false;
if (data.isNotificationSuppressed() != isNotifSuppressed) {
flagChanged = true;
- if (isNotifSuppressed) {
- flags |= Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
- } else {
- flags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
- }
+ data.setSuppressNotification(isNotifSuppressed);
}
if (data.isBubbleSuppressed() != isBubbleSuppressed) {
flagChanged = true;
- if (isBubbleSuppressed) {
- flags |= Notification.BubbleMetadata.FLAG_SUPPRESS_BUBBLE;
- } else {
- flags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_BUBBLE;
- }
+ data.setSuppressBubble(isBubbleSuppressed);
}
if (flagChanged) {
- data.setFlags(flags);
r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
mHandler.post(
new EnqueueNotificationRunnable(r.getUser().getIdentifier(), r,
@@ -1486,7 +1568,10 @@
mVibrateNotificationKey = null;
final long identity = Binder.clearCallingIdentity();
try {
- mVibrator.cancel();
+ // Stop all vibrations with usage of class alarm (ringtone, alarm, notification usages).
+ int usageFilter =
+ VibrationAttributes.USAGE_CLASS_ALARM | ~VibrationAttributes.USAGE_CLASS_MASK;
+ mVibrator.cancel(usageFilter);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -1695,6 +1780,8 @@
}
} else if (action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ // Work profile user may now be locked. Refresh cache.
+ mUserProfiles.updateCache(context);
if (userHandle >= 0) {
cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, true, userHandle,
REASON_PROFILE_TURNED_OFF, null);
@@ -1750,6 +1837,41 @@
}
};
+ private final BroadcastReceiver mNASIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, -1);
+ if (ACTION_ENABLE_NAS.equals(action)) {
+ mAssistants.resetDefaultFromConfig();
+ setNotificationAssistantAccessGrantedForUserInternal(
+ CollectionUtils.firstOrNull(mAssistants.getDefaultComponents()),
+ userId, true, true);
+ setNASMigrationDone(userId);
+ cancelNotificationInternal(getContext().getPackageName(),
+ getContext().getOpPackageName(), Binder.getCallingUid(),
+ Binder.getCallingPid(), TAG,
+ SystemMessageProto.SystemMessage.NOTE_NAS_UPGRADE, userId);
+ } else if (ACTION_DISABLE_NAS.equals(action)) {
+ //Set default NAS to be null if user selected none during migration
+ mAssistants.clearDefaults();
+ setNotificationAssistantAccessGrantedForUserInternal(
+ null, userId, true, true);
+ setNASMigrationDone(userId);
+ cancelNotificationInternal(getContext().getPackageName(),
+ getContext().getOpPackageName(), Binder.getCallingUid(),
+ Binder.getCallingPid(), TAG,
+ SystemMessageProto.SystemMessage.NOTE_NAS_UPGRADE, userId);
+ } else if (ACTION_LEARNMORE_NAS.equals(action)) {
+ Intent i = new Intent(getContext(), NASLearnMoreActivity.class);
+ i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getContext().sendBroadcastAsUser(
+ new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), UserHandle.of(userId));
+ getContext().startActivity(i);
+ }
+ }
+ };
+
private final class SettingsObserver extends ContentObserver {
private final Uri NOTIFICATION_BADGING_URI
= Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BADGING);
@@ -2273,6 +2395,12 @@
IntentFilter localeChangedFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
getContext().registerReceiver(mLocaleChangeReceiver, localeChangedFilter);
+
+ IntentFilter nasFilter = new IntentFilter();
+ nasFilter.addAction(ACTION_ENABLE_NAS);
+ nasFilter.addAction(ACTION_DISABLE_NAS);
+ nasFilter.addAction(ACTION_LEARNMORE_NAS);
+ getContext().registerReceiver(mNASIntentReceiver, nasFilter);
}
/**
@@ -2284,6 +2412,7 @@
getContext().unregisterReceiver(mNotificationTimeoutReceiver);
getContext().unregisterReceiver(mRestoreReceiver);
getContext().unregisterReceiver(mLocaleChangeReceiver);
+ getContext().unregisterReceiver(mNASIntentReceiver);
if (mDeviceConfigChangedListener != null) {
DeviceConfig.removeOnPropertiesChangedListener(mDeviceConfigChangedListener);
@@ -2539,6 +2668,7 @@
mConditionProviders.onBootPhaseAppsCanStart();
mHistoryManager.onBootPhaseAppsCanStart();
registerDeviceConfigChange();
+ migrateDefaultNASShowNotificationIfNecessary();
} else if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
mSnoozeHelper.scheduleRepostsForPersistedNotifications(System.currentTimeMillis());
}
@@ -5031,6 +5161,28 @@
}
@Override
+ public ComponentName getDefaultNotificationAssistant() {
+ checkCallerIsSystem();
+ ArraySet<ComponentName> defaultComponents = mAssistants.getDefaultComponents();
+ if (defaultComponents.size() > 1) {
+ Slog.w(TAG, "More than one default NotificationAssistant: "
+ + defaultComponents.size());
+ }
+ return CollectionUtils.firstOrNull(defaultComponents);
+ }
+
+ @Override
+ public void resetDefaultNotificationAssistant(boolean loadFromConfig) {
+ checkCallerIsSystem();
+ if (loadFromConfig) {
+ mAssistants.resetDefaultFromConfig();
+ } else {
+ mAssistants.clearDefaults();
+ }
+ }
+
+
+ @Override
public boolean hasEnabledNotificationListener(String packageName, int userId) {
checkCallerIsSystem();
return mListeners.isPackageAllowed(packageName, userId);
@@ -8140,29 +8292,12 @@
// sound
if (canceledKey.equals(mSoundNotificationKey)) {
- mSoundNotificationKey = null;
- final long identity = Binder.clearCallingIdentity();
- try {
- final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
- if (player != null) {
- player.stopAsync();
- }
- } catch (RemoteException e) {
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
+ clearSoundLocked();
}
// vibrate
if (canceledKey.equals(mVibrateNotificationKey)) {
- mVibrateNotificationKey = null;
- final long identity = Binder.clearCallingIdentity();
- try {
- mVibrator.cancel();
- }
- finally {
- Binder.restoreCallingIdentity(identity);
- }
+ clearVibrateLocked();
}
// light
@@ -9219,8 +9354,14 @@
@GuardedBy("mLock")
private Set<String> mAllowedAdjustments = new ArraySet<>();
+ protected ComponentName mDefaultFromConfig = null;
+
@Override
protected void loadDefaultsFromConfig() {
+ loadDefaultsFromConfig(true);
+ }
+
+ protected void loadDefaultsFromConfig(boolean addToDefault) {
ArraySet<String> assistants = new ArraySet<>();
assistants.addAll(Arrays.asList(mContext.getResources().getString(
com.android.internal.R.string.config_defaultAssistantAccessComponent)
@@ -9238,11 +9379,22 @@
ArraySet<ComponentName> approved = queryPackageForServices(packageName,
MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, USER_SYSTEM);
if (approved.contains(assistantCn)) {
- addDefaultComponentOrPackage(assistantCn.flattenToString());
+ if (addToDefault) {
+ // add the default loaded from config file to mDefaultComponents and
+ // mDefaultPackages
+ addDefaultComponentOrPackage(assistantCn.flattenToString());
+ } else {
+ // otherwise, store in the mDefaultFromConfig for NAS settings migration
+ mDefaultFromConfig = assistantCn;
+ }
}
}
}
+ ComponentName getDefaultFromConfig() {
+ return mDefaultFromConfig;
+ }
+
public NotificationAssistants(Context context, Object lock, UserProfiles up,
IPackageManager pm) {
super(context, lock, up, pm);
@@ -9724,12 +9876,26 @@
for (UserInfo userInfo : activeUsers) {
int userId = userInfo.getUserHandle().getIdentifier();
if (!hasUserSet(userId)) {
+ if (!isNASMigrationDone(userId)) {
+ resetDefaultFromConfig();
+ setNASMigrationDone(userId);
+ }
Slog.d(TAG, "Approving default notification assistant for user " + userId);
setDefaultAssistantForUser(userId);
}
}
}
+ protected void resetDefaultFromConfig() {
+ clearDefaults();
+ loadDefaultsFromConfig();
+ }
+
+ protected void clearDefaults() {
+ mDefaultComponents.clear();
+ mDefaultPackages.clear();
+ }
+
@Override
protected void setPackageOrComponentEnabled(String pkgOrComponent, int userId,
boolean isPrimary, boolean enabled, boolean userSet) {
diff --git a/services/core/java/com/android/server/os/SchedulingPolicyService.java b/services/core/java/com/android/server/os/SchedulingPolicyService.java
index c3ed7d7..e53c436 100644
--- a/services/core/java/com/android/server/os/SchedulingPolicyService.java
+++ b/services/core/java/com/android/server/os/SchedulingPolicyService.java
@@ -92,6 +92,12 @@
prio > PRIORITY_MAX || Process.getThreadGroupLeader(tid) != pid) {
return PackageManager.PERMISSION_DENIED;
}
+ // If the calling UID is audio server, and this call is not for an app,
+ // then it must be for the audio HAL. Validate the UID of the thread.
+ if (Binder.getCallingUid() == Process.AUDIOSERVER_UID && !isForApp
+ && Process.getUidForPid(tid) != Process.AUDIOSERVER_UID) {
+ return PackageManager.PERMISSION_DENIED;
+ }
if (Binder.getCallingUid() != Process.BLUETOOTH_UID) {
try {
// make good use of our CAP_SYS_NICE capability
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 27e0ffc..91a66ac 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -978,7 +978,6 @@
// Flag for bubble to make behaviour match documentLaunchMode=always.
intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT);
intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
- intents[0].putExtra(Intent.EXTRA_IS_BUBBLED, true);
}
intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 9715acb..321c5ca 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -356,6 +356,7 @@
import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog;
+import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.permission.persistence.RuntimePermissionsPersistence;
@@ -1449,21 +1450,21 @@
/** Token for keys in mPendingEnableRollback. */
private int mPendingEnableRollbackToken = 0;
- @Watched
+ @Watched(manual = true)
volatile boolean mSystemReady;
- @Watched
+ @Watched(manual = true)
private volatile boolean mSafeMode;
volatile boolean mHasSystemUidErrors;
@Watched
private final WatchedSparseBooleanArray mWebInstantAppsDisabled =
new WatchedSparseBooleanArray();
- @Watched
+ @Watched(manual = true)
private ApplicationInfo mAndroidApplication;
- @Watched
+ @Watched(manual = true)
final ActivityInfo mResolveActivity = new ActivityInfo();
final ResolveInfo mResolveInfo = new ResolveInfo();
- @Watched
+ @Watched(manual = true)
private ComponentName mResolveComponentName;
AndroidPackage mPlatformPackage;
ComponentName mCustomResolverComponentName;
@@ -1479,9 +1480,9 @@
final ComponentName mInstantAppResolverSettingsComponent;
/** Activity used to install instant applications */
- @Watched
+ @Watched(manual = true)
private ActivityInfo mInstantAppInstallerActivity;
- @Watched
+ @Watched(manual = true)
private final ResolveInfo mInstantAppInstallerInfo = new ResolveInfo();
private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>>
@@ -1686,9 +1687,8 @@
private final DomainVerificationConnection mDomainVerificationConnection =
new DomainVerificationConnection();
- private class DomainVerificationConnection implements
- DomainVerificationService.Connection, DomainVerificationProxyV1.Connection,
- DomainVerificationProxyV2.Connection {
+ private class DomainVerificationConnection implements DomainVerificationService.Connection,
+ DomainVerificationProxyV1.Connection, DomainVerificationProxyV2.Connection {
@Override
public void scheduleWriteSettings() {
@@ -1734,20 +1734,75 @@
@Nullable
@Override
- public PackageSetting getPackageSettingLocked(@NonNull String pkgName) {
- return PackageManagerService.this.getPackageSetting(pkgName);
- }
-
- @Nullable
- @Override
- public AndroidPackage getPackageLocked(@NonNull String pkgName) {
- return PackageManagerService.this.getPackage(pkgName);
- }
-
- @Nullable
- @Override
public AndroidPackage getPackage(@NonNull String packageName) {
- return getPackageLocked(packageName);
+ return PackageManagerService.this.getPackage(packageName);
+ }
+
+ @NonNull
+ @Override
+ public void withPackageSettings(@NonNull Consumer<Function<String, PackageSetting>> block) {
+ final Computer snapshot = snapshotComputer();
+
+ // This method needs to either lock or not lock consistently throughout the method,
+ // so if the live computer is returned, force a wrapping sync block.
+ if (snapshot == mLiveComputer) {
+ synchronized (mLock) {
+ block.accept(snapshot::getPackageSetting);
+ }
+ } else {
+ block.accept(snapshot::getPackageSetting);
+ }
+ }
+
+ @Override
+ public <Output> Output withPackageSettingsReturning(
+ @NonNull FunctionalUtils.ThrowingFunction<Function<String, PackageSetting>, Output>
+ block) {
+ final Computer snapshot = snapshotComputer();
+
+ // This method needs to either lock or not lock consistently throughout the method,
+ // so if the live computer is returned, force a wrapping sync block.
+ if (snapshot == mLiveComputer) {
+ synchronized (mLock) {
+ return block.apply(snapshot::getPackageSetting);
+ }
+ } else {
+ return block.apply(snapshot::getPackageSetting);
+ }
+ }
+
+ @Override
+ public <ExceptionType extends Exception> void withPackageSettingsThrowing(
+ @NonNull ThrowingConsumer<Function<String, PackageSetting>, ExceptionType> block)
+ throws ExceptionType {
+ final Computer snapshot = snapshotComputer();
+
+ // This method needs to either lock or not lock consistently throughout the method,
+ // so if the live computer is returned, force a wrapping sync block.
+ if (snapshot == mLiveComputer) {
+ synchronized (mLock) {
+ block.accept(snapshot::getPackageSetting);
+ }
+ } else {
+ block.accept(snapshot::getPackageSetting);
+ }
+ }
+
+ @Override
+ public <Output, ExceptionType extends Exception> Output
+ withPackageSettingsReturningThrowing(@NonNull ThrowingFunction<Function<String,
+ PackageSetting>, Output, ExceptionType> block) throws ExceptionType {
+ final Computer snapshot = snapshotComputer();
+
+ // This method needs to either lock or not lock consistently throughout the method,
+ // so if the live computer is returned, force a wrapping sync block.
+ if (snapshot == mLiveComputer) {
+ synchronized (mLock) {
+ return block.apply(snapshot::getPackageSetting);
+ }
+ } else {
+ return block.apply(snapshot::getPackageSetting);
+ }
}
@Override
@@ -2012,7 +2067,7 @@
// Cached attributes. The names in this class are the same as the
// names in PackageManagerService; see that class for documentation.
- private final Settings mSettings;
+ protected final Settings mSettings;
private final WatchedSparseIntArray mIsolatedOwners;
private final WatchedArrayMap<String, AndroidPackage> mPackages;
private final WatchedArrayMap<ComponentName, ParsedInstrumentation>
@@ -4669,6 +4724,17 @@
mLock = mService.mLock;
}
+ /**
+ * Explicilty snapshot {@link Settings#mPackages} for cases where the caller must not lock
+ * in order to get package data. It is expected that the caller locks itself to be able
+ * to block on changes to the package data and bring itself up to date once the change
+ * propagates to it. Use with heavy caution.
+ * @return
+ */
+ private Map<String, PackageSetting> snapshotPackageSettings() {
+ return mSettings.snapshot().mPackages;
+ }
+
public @NonNull List<ResolveInfo> queryIntentServicesInternalBody(Intent intent,
String resolvedType, int flags, int userId, int callingUid,
String instantAppPkgName) {
@@ -4800,7 +4866,7 @@
// Compute read-only functions, based on live data. This attribute may be modified multiple
// times during the PackageManagerService constructor but it should not be modified thereafter.
- private Computer mLiveComputer;
+ private ComputerLocked mLiveComputer;
// A lock-free cache for frequently called functions.
private volatile Computer mSnapshotComputer;
// If true, the snapshot is invalid (stale). The attribute is static since it may be
@@ -21760,6 +21826,7 @@
clearPackagePreferredActivities(ps.name, nextUserId);
mPermissionManager.onPackageUninstalled(ps.name, ps.appId, pkg, sharedUserPkgs,
nextUserId);
+ mDomainVerificationManager.clearPackageForUser(ps.name, nextUserId);
}
if (outInfo != null) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 8015063..8b5abf3 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -602,7 +602,7 @@
/** Returns true if standard APK Verity is enabled. */
static boolean isApkVerityEnabled() {
- return Build.VERSION.FIRST_SDK_INT >= Build.VERSION_CODES.R
+ return Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.R
|| SystemProperties.getInt("ro.apk_verity.mode", FSVERITY_DISABLED)
== FSVERITY_ENABLED;
}
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 19c56f8..e222df0 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -19,18 +19,33 @@
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.Person;
+import android.app.appsearch.AppSearchManager;
+import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSession;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.GetByUriRequest;
import android.app.appsearch.PackageIdentifier;
+import android.app.appsearch.PutDocumentsRequest;
+import android.app.appsearch.RemoveByUriRequest;
+import android.app.appsearch.ReportUsageRequest;
+import android.app.appsearch.SearchResult;
+import android.app.appsearch.SearchResults;
+import android.app.appsearch.SearchSpec;
+import android.app.appsearch.SetSchemaRequest;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.LocusId;
+import android.content.pm.AppSearchPerson;
+import android.content.pm.AppSearchShortcutInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.graphics.drawable.Icon;
+import android.os.Binder;
import android.os.PersistableBundle;
+import android.os.StrictMode;
import android.text.format.Formatter;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -41,10 +56,11 @@
import android.util.TypedXmlSerializer;
import android.util.Xml;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.infra.AndroidFuture;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
+import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.pm.ShortcutService.DumpFilter;
@@ -64,13 +80,17 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Predicate;
/**
@@ -95,6 +115,7 @@
private static final String ATTR_NAME = "name";
private static final String ATTR_CALL_COUNT = "call-count";
private static final String ATTR_LAST_RESET = "last-reset";
+ private static final String ATTR_SCHEMA_VERSON = "schema-version";
private static final String ATTR_ID = "id";
private static final String ATTR_ACTIVITY = "activity";
private static final String ATTR_TITLE = "title";
@@ -137,9 +158,9 @@
private static final String KEY_BITMAP_BYTES = "bitmapBytes";
/**
- * All the shortcuts from the package, keyed on IDs.
+ * An temp in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs.
*/
- private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>();
+ final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>();
/**
* All the share targets from the package
@@ -167,8 +188,7 @@
*/
private final Map<String, PackageIdentifier> mPackageIdentifiers = new ArrayMap<>(0);
- @GuardedBy("mLock")
- private AppSearchSession mAppSearchSession;
+ private boolean mIsInitilized;
private ShortcutPackage(ShortcutUser shortcutUser,
int packageUserId, String packageName, ShortcutPackageInfo spi) {
@@ -199,7 +219,9 @@
}
public int getShortcutCount() {
- return mShortcuts.size();
+ final int[] count = new int[1];
+ forEachShortcut(si -> count[0]++);
+ return count[0];
}
@Override
@@ -213,17 +235,23 @@
// - Unshadow all shortcuts.
// - Set disabled reason.
// - Disable if needed.
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- ShortcutInfo si = mShortcuts.valueAt(i);
- mutateShortcut(si.getId(), si, shortcut -> {
- shortcut.clearFlags(ShortcutInfo.FLAG_SHADOW);
+ final String query = String.format("%s:-%s AND %s:%s",
+ AppSearchShortcutInfo.KEY_FLAGS, ShortcutInfo.FLAG_SHADOW,
+ AppSearchShortcutInfo.KEY_DISABLED_REASON, restoreBlockReason);
+ forEachShortcutMutateIf(query, si -> {
+ if (restoreBlockReason == ShortcutInfo.DISABLED_REASON_NOT_DISABLED
+ && !si.hasFlags(ShortcutInfo.FLAG_SHADOW)
+ && si.getDisabledReason() == restoreBlockReason) {
+ return false;
+ }
+ si.clearFlags(ShortcutInfo.FLAG_SHADOW);
- shortcut.setDisabledReason(restoreBlockReason);
- if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
- shortcut.addFlags(ShortcutInfo.FLAG_DISABLED);
- }
- });
- }
+ si.setDisabledReason(restoreBlockReason);
+ if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
+ si.addFlags(ShortcutInfo.FLAG_DISABLED);
+ }
+ return true;
+ });
// Because some launchers may not have been restored (e.g. allowBackup=false),
// we need to re-calculate the pinned shortcuts.
refreshPinnedFlags();
@@ -233,8 +261,10 @@
* Note this does *not* provide a correct view to the calling launcher.
*/
@Nullable
- public ShortcutInfo findShortcutById(String id) {
- return mShortcuts.get(id);
+ public ShortcutInfo findShortcutById(@Nullable final String id) {
+ if (id == null) return null;
+ final List<ShortcutInfo> ret = getShortcutById(Collections.singleton(id));
+ return ret.isEmpty() ? null : ret.get(0);
}
public boolean isShortcutExistsAndInvisibleToPublisher(String id) {
@@ -300,8 +330,9 @@
* Delete a shortcut by ID. This will *always* remove it even if it's immutable or invisible.
*/
private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) {
- final ShortcutInfo shortcut = mShortcuts.remove(id);
+ final ShortcutInfo shortcut = findShortcutById(id);
if (shortcut != null) {
+ removeShortcut(id);
mShortcutUser.mService.removeIconLocked(shortcut);
shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_PINNED
| ShortcutInfo.FLAG_MANIFEST | ShortcutInfo.FLAG_CACHED_ALL);
@@ -321,7 +352,7 @@
// Extract Icon and update the icon res ID and the bitmap path.
s.saveIconAndFixUpShortcutLocked(newShortcut);
s.fixUpShortcutResourceNamesAndValues(newShortcut);
- mShortcuts.put(newShortcut.getId(), newShortcut);
+ saveShortcut(newShortcut);
}
/**
@@ -410,6 +441,15 @@
}
forceReplaceShortcutInner(newShortcut);
+ mShortcutUser.mService.injectPostToHandler(() -> awaitInAppSearch("reportUsage",
+ session -> {
+ final AndroidFuture<Boolean> future = new AndroidFuture<>();
+ session.reportUsage(
+ new ReportUsageRequest.Builder(getPackageName())
+ .setUri(newShortcut.getId()).build(),
+ mShortcutUser.mExecutor, result -> future.complete(result.isSuccess()));
+ return future;
+ }));
return deleted;
}
@@ -419,19 +459,17 @@
* @return List of removed shortcuts.
*/
private List<ShortcutInfo> removeOrphans() {
- List<ShortcutInfo> removeList = null;
-
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
-
- if (si.isAlive()) continue;
-
- if (removeList == null) {
- removeList = new ArrayList<>();
- }
+ final List<ShortcutInfo> removeList = new ArrayList<>(1);
+ final String query = String.format("%s OR %s OR %s OR %s",
+ AppSearchShortcutInfo.QUERY_IS_PINNED,
+ AppSearchShortcutInfo.QUERY_IS_DYNAMIC,
+ AppSearchShortcutInfo.QUERY_IS_MANIFEST,
+ AppSearchShortcutInfo.QUERY_IS_CACHED);
+ forEachShortcut(query, si -> {
+ if (si.isAlive()) return;
removeList.add(si);
- }
- if (removeList != null) {
+ });
+ if (!removeList.isEmpty()) {
for (int i = removeList.size() - 1; i >= 0; i--) {
forceDeleteShortcutInner(removeList.get(i).getId());
}
@@ -447,21 +485,27 @@
*/
public List<ShortcutInfo> deleteAllDynamicShortcuts(boolean ignoreInvisible) {
final long now = mShortcutUser.mService.injectCurrentTimeMillis();
-
- boolean changed = false;
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
- if (si.isDynamic() && (!ignoreInvisible || si.isVisibleToPublisher())) {
- changed = true;
-
- mutateShortcut(si.getId(), si, shortcut -> {
- shortcut.setTimestamp(now);
- shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
- shortcut.setRank(0); // It may still be pinned, so clear the rank.
- });
- }
+ final String query;
+ if (!ignoreInvisible) {
+ query = AppSearchShortcutInfo.QUERY_IS_DYNAMIC;
+ } else {
+ query = String.format("%s %s",
+ AppSearchShortcutInfo.QUERY_IS_DYNAMIC,
+ AppSearchShortcutInfo.QUERY_IS_VISIBLE_TO_PUBLISHER);
}
- if (changed) {
+ final boolean[] changed = new boolean[1];
+ forEachShortcutMutateIf(query, si -> {
+ if (si.isDynamic() && (!ignoreInvisible || si.isVisibleToPublisher())) {
+ changed[0] = true;
+
+ si.setTimestamp(now);
+ si.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
+ si.setRank(0); // It may still be pinned, so clear the rank.
+ return true;
+ }
+ return false;
+ });
+ if (changed[0]) {
return removeOrphans();
}
return null;
@@ -606,45 +650,32 @@
* <p>Then remove all shortcuts that are not dynamic and no longer pinned either.
*/
public void refreshPinnedFlags() {
- final List<ShortcutInfo> shortcuts = new ArrayList<>(mShortcuts.values());
- final Map<String, ShortcutInfo> shortcutMap = new ArrayMap<>(shortcuts.size());
- for (ShortcutInfo si : shortcuts) {
- shortcutMap.put(si.getId(), si);
- }
final Set<String> pinnedShortcuts = new ArraySet<>();
- // First, for the pinned set for each launcher, keep track of their id one by one.
+ // First, gather the pinned set from each launcher.
mShortcutUser.forAllLaunchers(launcherShortcuts -> {
final ArraySet<String> pinned = launcherShortcuts.getPinnedShortcutIds(
getPackageName(), getPackageUserId());
if (pinned == null || pinned.size() == 0) {
return;
}
- for (int i = pinned.size() - 1; i >= 0; i--) {
- final String id = pinned.valueAt(i);
- final ShortcutInfo si = shortcutMap.get(id);
- if (si == null) {
- // This happens if a launcher pinned shortcuts from this package, then backup&
- // restored, but this package doesn't allow backing up.
- // In that case the launcher ends up having a dangling pinned shortcuts.
- // That's fine, when the launcher is restored, we'll fix it.
- continue;
- }
- pinnedShortcuts.add(si.getId());
+ pinnedShortcuts.addAll(pinned);
+ });
+ // Then, update the pinned state if necessary.
+ final List<ShortcutInfo> pinned = getShortcutById(pinnedShortcuts);
+ pinned.forEach(si -> {
+ if (!si.isPinned()) {
+ si.addFlags(ShortcutInfo.FLAG_PINNED);
}
});
- // Then, update the pinned state if necessary
- for (int i = shortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = shortcuts.get(i);
- if (pinnedShortcuts.contains(si.getId()) && !si.isPinned()) {
- mutateShortcut(si.getId(), si,
- shortcut -> shortcut.addFlags(ShortcutInfo.FLAG_PINNED));
- }
+ saveShortcut(pinned);
+ forEachShortcutMutateIf(AppSearchShortcutInfo.QUERY_IS_PINNED, si -> {
if (!pinnedShortcuts.contains(si.getId()) && si.isPinned()) {
- mutateShortcut(si.getId(), si, shortcut ->
- shortcut.clearFlags(ShortcutInfo.FLAG_PINNED));
+ si.clearFlags(ShortcutInfo.FLAG_PINNED);
+ return true;
}
- }
+ return false;
+ });
// Lastly, remove the ones that are no longer pinned, cached nor dynamic.
removeOrphans();
@@ -734,9 +765,9 @@
/**
* Find all shortcuts that match {@code query}.
*/
- public void findAll(@NonNull List<ShortcutInfo> result,
- @Nullable Predicate<ShortcutInfo> query, int cloneFlag) {
- findAll(result, query, cloneFlag, null, 0, /*getPinnedByAnyLauncher=*/ false);
+ public void findAll(@NonNull List<ShortcutInfo> result, @Nullable String query,
+ @Nullable Predicate<ShortcutInfo> filter, int cloneFlag) {
+ findAll(result, query, filter, cloneFlag, null, 0, /*getPinnedByAnyLauncher=*/ false);
}
/**
@@ -747,6 +778,64 @@
* adjusted for the caller too.
*/
public void findAll(@NonNull List<ShortcutInfo> result,
+ @Nullable String query, @Nullable Predicate<ShortcutInfo> filter, int cloneFlag,
+ @Nullable String callingLauncher, int launcherUserId, boolean getPinnedByAnyLauncher) {
+ if (getPackageInfo().isShadow()) {
+ // Restored and the app not installed yet, so don't return any.
+ return;
+ }
+ final ShortcutService s = mShortcutUser.mService;
+
+ // Set of pinned shortcuts by the calling launcher.
+ final ArraySet<String> pinnedByCallerSet = (callingLauncher == null) ? null
+ : s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId)
+ .getPinnedShortcutIds(getPackageName(), getPackageUserId());
+ forEachShortcut(query == null ? "" : query, si ->
+ filter(result, filter, cloneFlag, callingLauncher, pinnedByCallerSet,
+ getPinnedByAnyLauncher, si));
+ }
+
+ /**
+ * Find all shortcuts that has id matching {@code ids}.
+ */
+ public void findAllByIds(@NonNull final List<ShortcutInfo> result,
+ @NonNull final Collection<String> ids, @Nullable final Predicate<ShortcutInfo> filter,
+ final int cloneFlag) {
+ findAllByIds(result, ids, filter, cloneFlag, null, 0, /*getPinnedByAnyLauncher=*/ false);
+ }
+
+ /**
+ * Find all shortcuts that has id matching {@code ids}.
+ *
+ * This will also provide a "view" for each launcher -- a non-dynamic shortcut that's not pinned
+ * by the calling launcher will not be included in the result, and also "isPinned" will be
+ * adjusted for the caller too.
+ */
+ public void findAllByIds(@NonNull List<ShortcutInfo> result,
+ @NonNull final Collection<String> ids, @Nullable final Predicate<ShortcutInfo> query,
+ int cloneFlag, @Nullable String callingLauncher, int launcherUserId,
+ boolean getPinnedByAnyLauncher) {
+ if (getPackageInfo().isShadow()) {
+ // Restored and the app not installed yet, so don't return any.
+ return;
+ }
+ final ShortcutService s = mShortcutUser.mService;
+
+ // Set of pinned shortcuts by the calling launcher.
+ final ArraySet<String> pinnedByCallerSet = (callingLauncher == null) ? null
+ : s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId)
+ .getPinnedShortcutIds(getPackageName(), getPackageUserId());
+ final List<ShortcutInfo> shortcuts = getShortcutById(ids);
+ for (ShortcutInfo si : shortcuts) {
+ filter(result, query, cloneFlag, callingLauncher, pinnedByCallerSet,
+ getPinnedByAnyLauncher, si);
+ }
+ }
+
+ /**
+ * Find all pinned shortcuts that match {@code query}.
+ */
+ public void findAllPinned(@NonNull List<ShortcutInfo> result,
@Nullable Predicate<ShortcutInfo> query, int cloneFlag,
@Nullable String callingLauncher, int launcherUserId, boolean getPinnedByAnyLauncher) {
if (getPackageInfo().isShadow()) {
@@ -759,39 +848,44 @@
final ArraySet<String> pinnedByCallerSet = (callingLauncher == null) ? null
: s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId)
.getPinnedShortcutIds(getPackageName(), getPackageUserId());
+ mShortcuts.values().forEach(si -> filter(result, query, cloneFlag, callingLauncher,
+ pinnedByCallerSet, getPinnedByAnyLauncher, si));
+ }
- for (int i = 0; i < mShortcuts.size(); i++) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
- // Need to adjust PINNED flag depending on the caller.
- // Basically if the caller is a launcher (callingLauncher != null) and the launcher
- // isn't pinning it, then we need to clear PINNED for this caller.
- final boolean isPinnedByCaller = (callingLauncher == null)
- || ((pinnedByCallerSet != null) && pinnedByCallerSet.contains(si.getId()));
+ private void filter(@NonNull final List<ShortcutInfo> result,
+ @Nullable final Predicate<ShortcutInfo> query, final int cloneFlag,
+ @Nullable final String callingLauncher,
+ @NonNull final ArraySet<String> pinnedByCallerSet,
+ final boolean getPinnedByAnyLauncher, @NonNull final ShortcutInfo si) {
+ // Need to adjust PINNED flag depending on the caller.
+ // Basically if the caller is a launcher (callingLauncher != null) and the launcher
+ // isn't pinning it, then we need to clear PINNED for this caller.
+ final boolean isPinnedByCaller = (callingLauncher == null)
+ || ((pinnedByCallerSet != null) && pinnedByCallerSet.contains(si.getId()));
- if (!getPinnedByAnyLauncher) {
- if (si.isFloating() && !si.isCached()) {
- if (!isPinnedByCaller) {
- continue;
- }
- }
- }
- final ShortcutInfo clone = si.clone(cloneFlag);
-
- // Fix up isPinned for the caller. Note we need to do it before the "test" callback,
- // since it may check isPinned.
- // However, if getPinnedByAnyLauncher is set, we do it after the test.
- if (!getPinnedByAnyLauncher) {
+ if (!getPinnedByAnyLauncher) {
+ if (si.isFloating() && !si.isCached()) {
if (!isPinnedByCaller) {
- clone.clearFlags(ShortcutInfo.FLAG_PINNED);
+ return;
}
}
- if (query == null || query.test(clone)) {
- if (!isPinnedByCaller) {
- clone.clearFlags(ShortcutInfo.FLAG_PINNED);
- }
- result.add(clone);
+ }
+ final ShortcutInfo clone = si.clone(cloneFlag);
+
+ // Fix up isPinned for the caller. Note we need to do it before the "test" callback,
+ // since it may check isPinned.
+ // However, if getPinnedByAnyLauncher is set, we do it after the test.
+ if (!getPinnedByAnyLauncher) {
+ if (!isPinnedByCaller) {
+ clone.clearFlags(ShortcutInfo.FLAG_PINNED);
}
}
+ if (query == null || query.test(clone)) {
+ if (!isPinnedByCaller) {
+ clone.clearFlags(ShortcutInfo.FLAG_PINNED);
+ }
+ result.add(clone);
+ }
}
public void resetThrottling() {
@@ -822,8 +916,8 @@
// Get the list of all dynamic shortcuts in this package.
final ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
- findAll(shortcuts, ShortcutInfo::isNonManifestVisible,
- ShortcutInfo.CLONE_REMOVE_FOR_APP_PREDICTION);
+ findAll(shortcuts, AppSearchShortcutInfo.QUERY_IS_NON_MANIFEST_VISIBLE,
+ ShortcutInfo::isNonManifestVisible, ShortcutInfo.CLONE_REMOVE_FOR_APP_PREDICTION);
final List<ShortcutManager.ShareShortcutInfo> result = new ArrayList<>();
for (int i = 0; i < shortcuts.size(); i++) {
@@ -861,14 +955,14 @@
* the app's Xml resource.
*/
int getSharingShortcutCount() {
- if (mShortcuts.isEmpty() || mShareTargets.isEmpty()) {
+ if (getShortcutCount() == 0 || mShareTargets.isEmpty()) {
return 0;
}
// Get the list of all dynamic shortcuts in this package
final ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
- findAll(shortcuts, ShortcutInfo::isNonManifestVisible,
- ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
+ findAll(shortcuts, AppSearchShortcutInfo.QUERY_IS_NON_MANIFEST_VISIBLE,
+ ShortcutInfo::isNonManifestVisible, ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
int sharingShortcutCount = 0;
for (int i = 0; i < shortcuts.size(); i++) {
@@ -899,14 +993,12 @@
* Return the filenames (excluding path names) of icon bitmap files from this package.
*/
public ArraySet<String> getUsedBitmapFiles() {
- final ArraySet<String> usedFiles = new ArraySet<>(mShortcuts.size());
-
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ final ArraySet<String> usedFiles = new ArraySet<>(1);
+ forEachShortcut(AppSearchShortcutInfo.QUERY_HAS_BITMAP_PATH, si -> {
if (si.getBitmapPath() != null) {
usedFiles.add(getFileName(si.getBitmapPath()));
}
- }
+ });
return usedFiles;
}
@@ -923,30 +1015,29 @@
* @return false if any of the target activities are no longer enabled.
*/
private boolean areAllActivitiesStillEnabled() {
- if (mShortcuts.size() == 0) {
- return true;
- }
final ShortcutService s = mShortcutUser.mService;
// Normally the number of target activities is 1 or so, so no need to use a complex
// structure like a set.
final ArrayList<ComponentName> checked = new ArrayList<>(4);
+ final boolean[] reject = new boolean[1];
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ forEachShortcutStopWhen(si -> {
final ComponentName activity = si.getActivity();
if (checked.contains(activity)) {
- continue; // Already checked.
+ return false; // Already checked.
}
checked.add(activity);
if ((activity != null)
&& !s.injectIsActivityEnabledAndExported(activity, getOwnerUserId())) {
- return false;
+ reject[0] = true;
+ return true; // Found at least 1 activity is disabled, so skip the rest.
}
- }
- return true;
+ return false;
+ });
+ return !reject[0];
}
/**
@@ -1029,32 +1120,34 @@
// See if there are any shortcuts that were prevented restoring because the app was of a
// lower version, and re-enable them.
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
- if (si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_VERSION_LOWER) {
- continue;
- }
- if (getPackageInfo().getBackupSourceVersionCode() > newVersionCode) {
- if (ShortcutService.DEBUG) {
- Slog.d(TAG, String.format("Shortcut %s require version %s, still not restored.",
- si.getId(), getPackageInfo().getBackupSourceVersionCode()));
- }
- continue;
- }
- Slog.i(TAG, String.format("Restoring shortcut: %s", si.getId()));
- mutateShortcut(si.getId(), si, shortcut -> {
- shortcut.clearFlags(ShortcutInfo.FLAG_DISABLED);
- shortcut.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED);
- });
+ {
+ forEachShortcutMutateIf(
+ AppSearchShortcutInfo.QUERY_DISABLED_REASON_VERSION_LOWER, si -> {
+ if (si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_VERSION_LOWER) {
+ return false;
+ }
+ if (getPackageInfo().getBackupSourceVersionCode() > newVersionCode) {
+ if (ShortcutService.DEBUG) {
+ Slog.d(TAG,
+ String.format(
+ "Shortcut %s require version %s, still not restored.",
+ si.getId(),
+ getPackageInfo().getBackupSourceVersionCode()));
+ }
+ return false;
+ }
+ Slog.i(TAG, String.format("Restoring shortcut: %s", si.getId()));
+ si.clearFlags(ShortcutInfo.FLAG_DISABLED);
+ si.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED);
+ return true;
+ });
}
// For existing shortcuts, update timestamps if they have any resources.
// Also check if shortcuts' activities are still main activities. Otherwise, disable them.
if (!isNewApp) {
- Resources publisherRes = null;
-
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ final Resources publisherRes = getPackageResources();
+ forEachShortcutMutateIf(si -> {
// Disable dynamic shortcuts whose target activity is gone.
if (si.isDynamic()) {
if (si.getActivity() == null) {
@@ -1067,33 +1160,26 @@
getPackageName(), si.getId()));
if (disableDynamicWithId(si.getId(), /*ignoreInvisible*/ false,
ShortcutInfo.DISABLED_REASON_APP_CHANGED) != null) {
- continue; // Actually removed.
+ return false; // Actually removed.
}
// Still pinned, so fall-through and possibly update the resources.
}
}
- if (si.hasAnyResources()) {
- if (publisherRes == null) {
- publisherRes = getPackageResources();
- if (publisherRes == null) {
- break; // Resources couldn't be loaded.
- }
- }
-
- final Resources res = publisherRes;
- mutateShortcut(si.getId(), si, shortcut -> {
- if (!shortcut.isOriginallyFromManifest()) {
- shortcut.lookupAndFillInResourceIds(res);
- }
-
- // If this shortcut is not from a manifest, then update all resource IDs
- // from resource names. (We don't allow resource strings for
- // non-manifest at the moment, but icons can still be resources.)
- shortcut.setTimestamp(s.injectCurrentTimeMillis());
- });
+ if (!si.hasAnyResources() || publisherRes == null) {
+ return false;
}
- }
+
+ if (!si.isOriginallyFromManifest()) {
+ si.lookupAndFillInResourceIds(publisherRes);
+ }
+
+ // If this shortcut is not from a manifest, then update all resource IDs
+ // from resource names. (We don't allow resource strings for
+ // non-manifest at the moment, but icons can still be resources.)
+ si.setTimestamp(s.injectCurrentTimeMillis());
+ return true;
+ });
}
// (Re-)publish manifest shortcut.
@@ -1119,17 +1205,12 @@
boolean changed = false;
// Keep the previous IDs.
- ArraySet<String> toDisableList = null;
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
-
+ final ArraySet<String> toDisableList = new ArraySet<>(1);
+ forEachShortcut(AppSearchShortcutInfo.QUERY_IS_MANIFEST, si -> {
if (si.isManifestShortcut()) {
- if (toDisableList == null) {
- toDisableList = new ArraySet<>();
- }
toDisableList.add(si.getId());
}
- }
+ });
// Publish new ones.
if (newManifestShortcutList != null) {
@@ -1169,7 +1250,7 @@
// regardless.
forceReplaceShortcutInner(newShortcut); // This will clean up the old one too.
- if (!newDisabled && toDisableList != null) {
+ if (!newDisabled && !toDisableList.isEmpty()) {
// Still alive, don't remove.
toDisableList.remove(id);
}
@@ -1177,7 +1258,7 @@
}
// Disable the previous manifest shortcuts that are no longer in the manifest.
- if (toDisableList != null) {
+ if (!toDisableList.isEmpty()) {
if (ShortcutService.DEBUG) {
Slog.d(TAG, String.format(
"Package %s: disabling %d stale shortcuts", getPackageName(),
@@ -1266,25 +1347,21 @@
private ArrayMap<ComponentName, ArrayList<ShortcutInfo>> sortShortcutsToActivities() {
final ArrayMap<ComponentName, ArrayList<ShortcutInfo>> activitiesToShortcuts
= new ArrayMap<>();
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ forEachShortcut(AppSearchShortcutInfo.QUERY_IS_NOT_FLOATING, si -> {
if (si.isFloating()) {
- continue; // Ignore floating shortcuts, which are not tied to any activities.
+ return; // Ignore floating shortcuts, which are not tied to any activities.
}
final ComponentName activity = si.getActivity();
if (activity == null) {
mShortcutUser.mService.wtf("null activity detected.");
- continue;
+ return;
}
- ArrayList<ShortcutInfo> list = activitiesToShortcuts.get(activity);
- if (list == null) {
- list = new ArrayList<>();
- activitiesToShortcuts.put(activity, list);
- }
+ ArrayList<ShortcutInfo> list = activitiesToShortcuts.computeIfAbsent(activity,
+ k -> new ArrayList<>());
list.add(si);
- }
+ });
return activitiesToShortcuts;
}
@@ -1320,14 +1397,20 @@
// (If it's for update, then don't count dynamic shortcuts, since they'll be replaced
// anyway.)
final ArrayMap<ComponentName, Integer> counts = new ArrayMap<>(4);
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo shortcut = mShortcuts.valueAt(i);
+ final String query;
+ if (operation != ShortcutService.OPERATION_SET) {
+ query = AppSearchShortcutInfo.QUERY_IS_MANIFEST + " OR "
+ + AppSearchShortcutInfo.QUERY_IS_DYNAMIC;
+ } else {
+ query = AppSearchShortcutInfo.QUERY_IS_MANIFEST;
+ }
+ forEachShortcut(query, shortcut -> {
if (shortcut.isManifestShortcut()) {
incrementCountForActivity(counts, shortcut.getActivity(), 1);
} else if (shortcut.isDynamic() && (operation != ShortcutService.OPERATION_SET)) {
incrementCountForActivity(counts, shortcut.getActivity(), 1);
}
- }
+ });
for (int i = newList.size() - 1; i >= 0; i--) {
final ShortcutInfo newShortcut = newList.get(i);
@@ -1340,7 +1423,7 @@
continue; // Activity can be null for update.
}
- final ShortcutInfo original = mShortcuts.get(newShortcut.getId());
+ final ShortcutInfo original = findShortcutById(newShortcut.getId());
if (original == null) {
if (operation == ShortcutService.OPERATION_UPDATE) {
continue; // When updating, ignore if there's no target.
@@ -1379,31 +1462,17 @@
public void resolveResourceStrings() {
final ShortcutService s = mShortcutUser.mService;
- List<ShortcutInfo> changedShortcuts = null;
+ final Resources publisherRes = getPackageResources();
+ final List<ShortcutInfo> changedShortcuts = new ArrayList<>(1);
- Resources publisherRes = null;
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
-
- if (si.hasStringResources()) {
- if (publisherRes == null) {
- publisherRes = getPackageResources();
- if (publisherRes == null) {
- break; // Resources couldn't be loaded.
- }
- }
-
- final Resources res = publisherRes;
- mutateShortcut(si.getId(), si, shortcut -> {
- shortcut.resolveResourceStrings(res);
- shortcut.setTimestamp(s.injectCurrentTimeMillis());
- });
-
- if (changedShortcuts == null) {
- changedShortcuts = new ArrayList<>(1);
- }
+ if (publisherRes != null) {
+ forEachShortcutMutateIf(AppSearchShortcutInfo.QUERY_HAS_STRING_RESOURCE, si -> {
+ if (!si.hasStringResources()) return false;
+ si.resolveResourceStrings(publisherRes);
+ si.setTimestamp(s.injectCurrentTimeMillis());
changedShortcuts.add(si);
- }
+ return true;
+ });
}
if (!CollectionUtils.isEmpty(changedShortcuts)) {
s.packageShortcutsChanged(getPackageName(), getPackageUserId(), changedShortcuts, null);
@@ -1412,10 +1481,7 @@
/** Clears the implicit ranks for all shortcuts. */
public void clearAllImplicitRanks() {
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
- mutateShortcut(si.getId(), si, ShortcutInfo::clearImplicitRankAndRankChangedFlag);
- }
+ forEachShortcutMutate(ShortcutInfo::clearImplicitRankAndRankChangedFlag);
}
/**
@@ -1455,17 +1521,14 @@
final long now = s.injectCurrentTimeMillis();
// First, clear ranks for floating shortcuts.
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
- if (si.isFloating()) {
- if (si.getRank() != 0) {
- mutateShortcut(si.getId(), si, shortcut -> {
- shortcut.setTimestamp(now);
- shortcut.setRank(0);
- });
- }
+ forEachShortcutMutateIf(AppSearchShortcutInfo.QUERY_IS_FLOATING_AND_HAS_RANK, si -> {
+ if (si.isFloating() && si.getRank() != 0) {
+ si.setTimestamp(now);
+ si.setRank(0);
+ return true;
}
- }
+ return false;
+ });
// Then adjust ranks. Ranks are unique for each activity, so we first need to sort
// shortcuts to each activity.
@@ -1507,13 +1570,14 @@
/** @return true if there's any shortcuts that are not manifest shortcuts. */
public boolean hasNonManifestShortcuts() {
final boolean[] condition = new boolean[1];
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ forEachShortcutStopWhen(AppSearchShortcutInfo.QUERY_IS_NOT_MANIFEST, si -> {
if (!si.isDeclaredInManifest()) {
+ condition[0] = true;
return true;
}
- }
- return false;
+ return false;
+ });
+ return condition[0];
}
public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) {
@@ -1553,11 +1617,8 @@
pw.print(prefix);
pw.println(" Shortcuts:");
- long totalBitmapSize = 0;
- final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
- final int size = shortcuts.size();
- for (int i = 0; i < size; i++) {
- final ShortcutInfo si = shortcuts.valueAt(i);
+ final long[] totalBitmapSize = new long[1];
+ forEachShortcut(si -> {
pw.println(si.toDumpString(prefix + " "));
if (si.getBitmapPath() != null) {
final long len = new File(si.getBitmapPath()).length();
@@ -1566,15 +1627,15 @@
pw.print("bitmap size=");
pw.println(len);
- totalBitmapSize += len;
+ totalBitmapSize[0] += len;
}
- }
+ });
pw.print(prefix);
pw.print(" ");
pw.print("Total bitmap size: ");
- pw.print(totalBitmapSize);
+ pw.print(totalBitmapSize[0]);
pw.print(" (");
- pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize));
+ pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize[0]));
pw.println(")");
}
@@ -1589,46 +1650,39 @@
| (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0)
| (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0);
- final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
- final int size = shortcuts.size();
- for (int i = 0; i < size; i++) {
- final ShortcutInfo si = shortcuts.valueAt(i);
+ forEachShortcut(si -> {
if ((si.getFlags() & shortcutFlags) != 0) {
pw.println(si.toDumpString(""));
}
- }
+ });
}
@Override
public JSONObject dumpCheckin(boolean clear) throws JSONException {
final JSONObject result = super.dumpCheckin(clear);
- int numDynamic = 0;
- int numPinned = 0;
- int numManifest = 0;
- int numBitmaps = 0;
- long totalBitmapSize = 0;
+ final int[] numDynamic = new int[1];
+ final int[] numPinned = new int[1];
+ final int[] numManifest = new int[1];
+ final int[] numBitmaps = new int[1];
+ final long[] totalBitmapSize = new long[1];
- final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
- final int size = shortcuts.size();
- for (int i = 0; i < size; i++) {
- final ShortcutInfo si = shortcuts.valueAt(i);
-
- if (si.isDynamic()) numDynamic++;
- if (si.isDeclaredInManifest()) numManifest++;
- if (si.isPinned()) numPinned++;
+ forEachShortcut(si -> {
+ if (si.isDynamic()) numDynamic[0]++;
+ if (si.isDeclaredInManifest()) numManifest[0]++;
+ if (si.isPinned()) numPinned[0]++;
if (si.getBitmapPath() != null) {
- numBitmaps++;
- totalBitmapSize += new File(si.getBitmapPath()).length();
+ numBitmaps[0]++;
+ totalBitmapSize[0] += new File(si.getBitmapPath()).length();
}
- }
+ });
- result.put(KEY_DYNAMIC, numDynamic);
- result.put(KEY_MANIFEST, numManifest);
- result.put(KEY_PINNED, numPinned);
- result.put(KEY_BITMAPS, numBitmaps);
- result.put(KEY_BITMAP_BYTES, totalBitmapSize);
+ result.put(KEY_DYNAMIC, numDynamic[0]);
+ result.put(KEY_MANIFEST, numManifest[0]);
+ result.put(KEY_PINNED, numPinned[0]);
+ result.put(KEY_BITMAPS, numBitmaps[0]);
+ result.put(KEY_BITMAP_BYTES, totalBitmapSize[0]);
// TODO Log update frequency too.
@@ -1638,10 +1692,10 @@
@Override
public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup)
throws IOException, XmlPullParserException {
- final int size = getShortcutCount();
+ final int size = mShortcuts.size();
final int shareTargetSize = mShareTargets.size();
- if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0) {
+ if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0 && getShortcutCount() == 0) {
return; // nothing to write.
}
@@ -1650,11 +1704,19 @@
ShortcutService.writeAttr(out, ATTR_NAME, getPackageName());
ShortcutService.writeAttr(out, ATTR_CALL_COUNT, mApiCallCount);
ShortcutService.writeAttr(out, ATTR_LAST_RESET, mLastResetTime);
+ if (!forBackup) {
+ /**
+ * Schema version should not be included in the backup because:
+ * 1. Schemas in AppSearch are created from scratch on new device
+ * 2. Shortcuts are restored from xml file (as opposed to from AppSearch) on new device
+ */
+ ShortcutService.writeAttr(out, ATTR_SCHEMA_VERSON, (mIsInitilized)
+ ? AppSearchShortcutInfo.SCHEMA_VERSION : 0);
+ }
getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup);
for (int j = 0; j < size; j++) {
- saveShortcut(out, mShortcuts.valueAt(j), forBackup,
- getPackageInfo().isBackupAllowed());
+ saveShortcut(out, mShortcuts.valueAt(j), forBackup, getPackageInfo().isBackupAllowed());
}
if (!forBackup) {
@@ -1771,12 +1833,14 @@
}
final Intent[] intentsNoExtras = si.getIntentsNoExtras();
final PersistableBundle[] intentsExtras = si.getIntentPersistableExtrases();
- final int numIntents = intentsNoExtras.length;
- for (int i = 0; i < numIntents; i++) {
- out.startTag(null, TAG_INTENT);
- ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
- ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
- out.endTag(null, TAG_INTENT);
+ if (intentsNoExtras != null && intentsExtras != null) {
+ final int numIntents = intentsNoExtras.length;
+ for (int i = 0; i < numIntents; i++) {
+ out.startTag(null, TAG_INTENT);
+ ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
+ ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
+ out.endTag(null, TAG_INTENT);
+ }
}
ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras());
@@ -1839,6 +1903,7 @@
final ShortcutPackage ret = new ShortcutPackage(shortcutUser,
shortcutUser.getUserId(), packageName);
+ ret.mIsInitilized = ShortcutService.parseIntAttribute(parser, ATTR_SCHEMA_VERSON, 0) > 0;
ret.mApiCallCount =
ShortcutService.parseIntAttribute(parser, ATTR_CALL_COUNT);
ret.mLastResetTime =
@@ -2060,7 +2125,9 @@
@VisibleForTesting
List<ShortcutInfo> getAllShortcutsForTest() {
- return new ArrayList<>(mShortcuts.values());
+ final List<ShortcutInfo> ret = new ArrayList<>(1);
+ forEachShortcut(ret::add);
+ return ret;
}
@VisibleForTesting
@@ -2072,7 +2139,7 @@
public void verifyStates() {
super.verifyStates();
- boolean failed = false;
+ final boolean[] failed = new boolean[1];
final ShortcutService s = mShortcutUser.mService;
@@ -2083,7 +2150,7 @@
for (int outer = all.size() - 1; outer >= 0; outer--) {
final ArrayList<ShortcutInfo> list = all.valueAt(outer);
if (list.size() > mShortcutUser.mService.getMaxActivityShortcuts()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": activity " + all.keyAt(outer)
+ " has " + all.valueAt(outer).size() + " shortcuts.");
}
@@ -2103,61 +2170,60 @@
}
// Verify each shortcut's status.
- for (int i = mShortcuts.size() - 1; i >= 0; i--) {
- final ShortcutInfo si = mShortcuts.valueAt(i);
+ forEachShortcut(si -> {
if (!(si.isDeclaredInManifest() || si.isDynamic() || si.isPinned() || si.isCached())) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is not manifest, dynamic or pinned.");
}
if (si.isDeclaredInManifest() && si.isDynamic()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is both dynamic and manifest at the same time.");
}
if (si.getActivity() == null && !si.isFloating()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has null activity, but not floating.");
}
if ((si.isDynamic() || si.isManifestShortcut()) && !si.isEnabled()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is not floating, but is disabled.");
}
if (si.isFloating() && si.getRank() != 0) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is floating, but has rank=" + si.getRank());
}
if (si.getIcon() != null) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " still has an icon");
}
if (si.hasAdaptiveBitmap() && !(si.hasIconFile() || si.hasIconUri())) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has adaptive bitmap but was not saved to a file nor has icon uri.");
}
if (si.hasIconFile() && si.hasIconResource()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both resource and bitmap icons");
}
if (si.hasIconFile() && si.hasIconUri()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both url and bitmap icons");
}
if (si.hasIconUri() && si.hasIconResource()) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both url and resource icons");
}
if (si.isEnabled()
!= (si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_NOT_DISABLED)) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " isEnabled() and getDisabledReason() disagree: "
+ si.isEnabled() + " vs " + si.getDisabledReason());
@@ -2165,18 +2231,18 @@
if ((si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_VERSION_LOWER)
&& (getPackageInfo().getBackupSourceVersionCode()
== ShortcutInfo.VERSION_CODE_UNKNOWN)) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " RESTORED_VERSION_LOWER with no backup source version code.");
}
if (s.isDummyMainActivity(si.getActivity())) {
- failed = true;
+ failed[0] = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has a dummy target activity");
}
- }
+ });
- if (failed) {
+ if (failed[0]) {
throw new IllegalStateException("See logcat for errors");
}
}
@@ -2187,6 +2253,8 @@
} else {
mPackageIdentifiers.remove(packageName);
}
+ awaitInAppSearch(true, "Update visibility",
+ session -> AndroidFuture.completedFuture(true));
}
void mutateShortcut(@NonNull final String id, @Nullable final ShortcutInfo shortcut,
@@ -2196,23 +2264,309 @@
synchronized (mLock) {
if (shortcut != null) {
transform.accept(shortcut);
- } else {
- transform.accept(findShortcutById(id));
}
- // TODO: Load ShortcutInfo from AppSearch, apply transformation logic and save
+ final ShortcutInfo si = findShortcutById(id);
+ if (si == null) {
+ return;
+ }
+ transform.accept(si);
+ saveShortcut(si);
}
}
+ private void saveShortcut(@NonNull final ShortcutInfo... shortcuts) {
+ Objects.requireNonNull(shortcuts);
+ saveShortcut(Arrays.asList(shortcuts));
+ }
+
+ private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) {
+ Objects.requireNonNull(shortcuts);
+ shortcuts.forEach(si -> {
+ if (si.isPinned()) {
+ mShortcuts.put(si.getId(), si);
+ } else {
+ mShortcuts.remove(si.getId());
+ }
+ });
+ saveToAppSearch(shortcuts);
+ }
+
+ private void saveToAppSearch(@NonNull final Collection<ShortcutInfo> shortcuts) {
+ Objects.requireNonNull(shortcuts);
+ if (shortcuts.isEmpty()) {
+ // No need to invoke AppSearch when there's nothing to save.
+ return;
+ }
+ awaitInAppSearch("Saving shortcuts", session -> {
+ final AndroidFuture<Boolean> future = new AndroidFuture<>();
+ session.put(new PutDocumentsRequest.Builder()
+ .addGenericDocuments(
+ AppSearchShortcutInfo.toGenericDocuments(shortcuts))
+ .build(),
+ mShortcutUser.mExecutor,
+ result -> {
+ if (!result.isSuccess()) {
+ for (AppSearchResult<Void> k : result.getFailures().values()) {
+ Slog.e(TAG, k.getErrorMessage());
+ }
+ future.completeExceptionally(new RuntimeException(
+ "Failed to save shortcuts"));
+ return;
+ }
+ future.complete(true);
+ });
+ return future;
+ });
+ }
+
/**
* Removes shortcuts from AppSearch.
*/
void removeShortcuts() {
+ awaitInAppSearch("Removing all shortcuts from " + getPackageName(), session -> {
+ final AndroidFuture<Boolean> future = new AndroidFuture<>();
+ session.remove("", getSearchSpec(), mShortcutUser.mExecutor, result -> {
+ if (!result.isSuccess()) {
+ future.completeExceptionally(
+ new RuntimeException(result.getErrorMessage()));
+ return;
+ }
+ future.complete(true);
+ });
+ return future;
+ });
+ }
+
+ private void removeShortcut(@NonNull final String id) {
+ Objects.requireNonNull(id);
+ mShortcuts.remove(id);
+ awaitInAppSearch("Removing shortcut with id=" + id, session -> {
+ final AndroidFuture<Boolean> future = new AndroidFuture<>();
+ session.remove(new RemoveByUriRequest.Builder(getPackageName()).addUris(id).build(),
+ mShortcutUser.mExecutor, result -> {
+ if (!result.isSuccess()) {
+ final Map<String, AppSearchResult<Void>> failures =
+ result.getFailures();
+ for (String key : failures.keySet()) {
+ Slog.e(TAG, "Failed deleting " + key + ", error message:"
+ + failures.get(key).getErrorMessage());
+ }
+ future.completeExceptionally(new RuntimeException(
+ "Failed to delete shortcut: " + id));
+ return;
+ }
+ future.complete(true);
+ });
+ return future;
+ });
+ }
+
+ @NonNull
+ private List<ShortcutInfo> getShortcutById(@NonNull final Collection<String> ids) {
+ final List<String> shortcutIds = new ArrayList<>(1);
+ for (String id : ids) {
+ if (id != null) {
+ shortcutIds.add(id);
+ }
+ }
+ return awaitInAppSearch("Getting shortcut by id", session -> {
+ final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>();
+ session.getByUri(
+ new GetByUriRequest.Builder(getPackageName()).addUris(shortcutIds).build(),
+ mShortcutUser.mExecutor,
+ results -> {
+ final List<ShortcutInfo> ret = new ArrayList<>(1);
+ Map<String, GenericDocument> documents = results.getSuccesses();
+ for (GenericDocument doc : documents.values()) {
+ final ShortcutInfo info = new AppSearchShortcutInfo(doc)
+ .toShortcutInfo(mShortcutUser.getUserId());
+ ret.add(info);
+ }
+ future.complete(ret);
+ });
+ return future;
+ });
+ }
+
+ private void forEachShortcut(@NonNull final Consumer<ShortcutInfo> cb) {
+ forEachShortcut("", cb);
+ }
+
+ private void forEachShortcut(
+ @NonNull final String query, @NonNull final Consumer<ShortcutInfo> cb) {
+ forEachShortcutStopWhen(query, si -> {
+ cb.accept(si);
+ return false;
+ });
+ }
+
+ private void forEachShortcutMutate(@NonNull final Consumer<ShortcutInfo> cb) {
+ forEachShortcutMutateIf(si -> {
+ cb.accept(si);
+ return true;
+ });
+ }
+
+ private void forEachShortcutMutateIf(@NonNull final Function<ShortcutInfo, Boolean> cb) {
+ forEachShortcutMutateIf("", cb);
+ }
+
+ private void forEachShortcutMutateIf(@NonNull final String query,
+ @NonNull final Function<ShortcutInfo, Boolean> cb) {
+ final SearchResults res = awaitInAppSearch("Mutating shortcuts", session ->
+ AndroidFuture.completedFuture(session.search(query, getSearchSpec())));
+ if (res == null) return;
+ List<ShortcutInfo> shortcuts = getNextPage(res);
+ while (!shortcuts.isEmpty()) {
+ final List<ShortcutInfo> changed = new ArrayList<>(1);
+ for (ShortcutInfo si : shortcuts) {
+ if (cb.apply(si)) changed.add(si);
+ }
+ saveShortcut(changed);
+ shortcuts = getNextPage(res);
+ }
+ }
+
+ private void forEachShortcutStopWhen(
+ @NonNull final Function<ShortcutInfo, Boolean> cb) {
+ forEachShortcutStopWhen("", cb);
+ }
+
+ private void forEachShortcutStopWhen(
+ @NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) {
+ final SearchResults res = awaitInAppSearch("Iterating shortcuts", session ->
+ AndroidFuture.completedFuture(session.search(query, getSearchSpec())));
+ if (res == null) return;
+ List<ShortcutInfo> shortcuts = getNextPage(res);
+ while (!shortcuts.isEmpty()) {
+ for (ShortcutInfo si : shortcuts) {
+ if (cb.apply(si)) return;
+ }
+ shortcuts = getNextPage(res);
+ }
+ }
+
+ private List<ShortcutInfo> getNextPage(@NonNull final SearchResults res) {
+ final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>();
+ final List<ShortcutInfo> ret = new ArrayList<>();
+ final long callingIdentity = Binder.clearCallingIdentity();
+ try {
+ res.getNextPage(mShortcutUser.mExecutor, nextPage -> {
+ if (!nextPage.isSuccess()) {
+ future.complete(ret);
+ return;
+ }
+ final List<SearchResult> results = nextPage.getResultValue();
+ if (results.isEmpty()) {
+ future.complete(ret);
+ return;
+ }
+ final List<ShortcutInfo> page = new ArrayList<>(results.size());
+ for (SearchResult result : results) {
+ final ShortcutInfo si = new AppSearchShortcutInfo(result.getGenericDocument())
+ .toShortcutInfo(mShortcutUser.getUserId());
+ page.add(si);
+ }
+ ret.addAll(page);
+ future.complete(ret);
+ });
+ return ConcurrentUtils.waitForFutureNoInterrupt(future,
+ "Getting next batch of shortcuts");
+ } finally {
+ Binder.restoreCallingIdentity(callingIdentity);
+ }
+ }
+
+ @Nullable
+ private <T> T awaitInAppSearch(
+ @NonNull final String description,
+ @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
+ return awaitInAppSearch(false, description, cb);
+ }
+
+ @Nullable
+ private <T> T awaitInAppSearch(
+ final boolean forceReset,
+ @NonNull final String description,
+ @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
+ synchronized (mLock) {
+ final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
+ final long callingIdentity = Binder.clearCallingIdentity();
+ final AppSearchManager.SearchContext searchContext =
+ new AppSearchManager.SearchContext.Builder(getPackageName()).build();
+ try (AppSearchSession session = ConcurrentUtils.waitForFutureNoInterrupt(
+ mShortcutUser.getAppSearch(searchContext), "Resetting app search")) {
+ StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+ .detectAll()
+ .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site
+ .build());
+ final boolean wasInitialized = mIsInitilized;
+ if (!wasInitialized || forceReset) {
+ ConcurrentUtils.waitForFutureNoInterrupt(
+ setupSchema(session), "Setting up schema");
+ }
+ mIsInitilized = true;
+ if (!wasInitialized) {
+ restoreParsedShortcuts(false);
+ }
+ return ConcurrentUtils.waitForFutureNoInterrupt(cb.apply(session), description);
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to initiate app search for shortcut package "
+ + getPackageName() + " user " + mShortcutUser.getUserId(), e);
+ return null;
+ } finally {
+ Binder.restoreCallingIdentity(callingIdentity);
+ StrictMode.setThreadPolicy(oldPolicy);
+ }
+ }
+ }
+
+ @NonNull
+ private AndroidFuture<AppSearchSession> setupSchema(
+ @NonNull final AppSearchSession session) {
+ SetSchemaRequest.Builder schemaBuilder = new SetSchemaRequest.Builder()
+ .addSchemas(AppSearchPerson.SCHEMA, AppSearchShortcutInfo.SCHEMA);
+ for (PackageIdentifier pi : mPackageIdentifiers.values()) {
+ schemaBuilder = schemaBuilder
+ .setSchemaTypeVisibilityForPackage(
+ AppSearchPerson.SCHEMA_TYPE, true, pi)
+ .setSchemaTypeVisibilityForPackage(
+ AppSearchShortcutInfo.SCHEMA_TYPE, true, pi);
+ }
+ final AndroidFuture<AppSearchSession> future = new AndroidFuture<>();
+ session.setSchema(
+ schemaBuilder.build(), mShortcutUser.mExecutor, mShortcutUser.mExecutor, result -> {
+ if (!result.isSuccess()) {
+ future.completeExceptionally(
+ new IllegalArgumentException(result.getErrorMessage()));
+ return;
+ }
+ future.complete(session);
+ });
+ return future;
+ }
+
+ @NonNull
+ private SearchSpec getSearchSpec() {
+ return new SearchSpec.Builder()
+ .addFilterSchemas(AppSearchShortcutInfo.SCHEMA_TYPE)
+ .addFilterNamespaces(getPackageName())
+ .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+ .build();
}
/**
- * Merge/replace shortcuts parsed from xml file.
+ * Replace shortcuts parsed from xml file.
*/
- void restoreParsedShortcuts(final boolean replace) {
+ void restoreParsedShortcuts() {
+ restoreParsedShortcuts(true);
+ }
+
+ private void restoreParsedShortcuts(final boolean replace) {
+ if (replace) {
+ removeShortcuts();
+ }
+ saveToAppSearch(mShortcuts.values());
}
private boolean verifyRanksSequential(List<ShortcutInfo> list) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 8e999de..dcf730d 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -39,6 +39,7 @@
import android.content.IntentSender.SendIntentException;
import android.content.LocusId;
import android.content.pm.ActivityInfo;
+import android.content.pm.AppSearchShortcutInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.IPackageManager;
@@ -1050,8 +1051,7 @@
file.failWrite(os);
}
- final ShortcutUser user = getUserShortcutsLocked(userId);
- user.logSharingShortcutStats(mMetricsLogger);
+ getUserShortcutsLocked(userId).logSharingShortcutStats(mMetricsLogger);
}
@GuardedBy("mLock")
@@ -1306,7 +1306,7 @@
mUsers.put(userId, userPackages);
// Also when a user's data is first accessed, scan all packages.
- checkPackageChanges(userId);
+ injectPostToHandler(() -> checkPackageChanges(userId));
}
return userPackages;
}
@@ -1934,7 +1934,8 @@
}
ArrayList<ShortcutInfo> cachedOrPinned = new ArrayList<>();
- ps.findAll(cachedOrPinned, (ShortcutInfo si) -> si.isVisibleToPublisher()
+ ps.findAll(cachedOrPinned, AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
+ (ShortcutInfo si) -> si.isVisibleToPublisher()
&& si.isDynamic() && (si.isCached() || si.isPinned()),
ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
@@ -2431,8 +2432,9 @@
final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
// Dynamic shortcuts that are either cached or pinned will not get deleted.
- ps.findAll(changedShortcuts, (ShortcutInfo si) -> si.isVisibleToPublisher()
- && si.isDynamic() && (si.isCached() || si.isPinned()),
+ ps.findAll(changedShortcuts, AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
+ (ShortcutInfo si) -> si.isVisibleToPublisher()
+ && si.isDynamic() && (si.isCached() || si.isPinned()),
ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
removedShortcuts = ps.deleteAllDynamicShortcuts(/*ignoreInvisible=*/ true);
@@ -2511,8 +2513,11 @@
| (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0)
| (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0);
+ final String query = AppSearchShortcutInfo.QUERY_IS_VISIBLE_TO_PUBLISHER + " "
+ + createQuery(matchDynamic, matchPinned, matchManifest, matchCached);
+
callback.complete(getShortcutsWithQueryLocked(
- packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR,
+ packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR, query,
(ShortcutInfo si) ->
si.isVisibleToPublisher() && (si.getFlags() & shortcutFlags) != 0));
}
@@ -2588,12 +2593,13 @@
@GuardedBy("mLock")
private ParceledListSlice<ShortcutInfo> getShortcutsWithQueryLocked(@NonNull String packageName,
- @UserIdInt int userId, int cloneFlags, @NonNull Predicate<ShortcutInfo> query) {
+ @UserIdInt int userId, int cloneFlags, @NonNull final String query,
+ @NonNull Predicate<ShortcutInfo> filter) {
final ArrayList<ShortcutInfo> ret = new ArrayList<>();
final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
- ps.findAll(ret, query, cloneFlags);
+ ps.findAll(ret, query, filter, cloneFlags);
return new ParceledListSlice<>(setReturnedByServer(ret));
}
@@ -2851,6 +2857,28 @@
}
}
+ private String createQuery(final boolean matchDynamic, final boolean matchPinned,
+ final boolean matchManifest, final boolean matchCached) {
+
+ final List<String> queries = new ArrayList<>(1);
+ if (matchDynamic) {
+ queries.add(AppSearchShortcutInfo.QUERY_IS_DYNAMIC);
+ }
+ if (matchPinned) {
+ queries.add(AppSearchShortcutInfo.QUERY_IS_PINNED);
+ }
+ if (matchManifest) {
+ queries.add(AppSearchShortcutInfo.QUERY_IS_MANIFEST);
+ }
+ if (matchCached) {
+ queries.add(AppSearchShortcutInfo.QUERY_IS_CACHED);
+ }
+ if (queries.isEmpty()) {
+ return "";
+ }
+ return "(" + String.join(" OR ", queries) + ")";
+ }
+
/**
* Remove all the information associated with a package. This will really remove all the
* information, including the restore information (i.e. it'll remove packages even if they're
@@ -2963,18 +2991,12 @@
int callingPid, int callingUid) {
final ArraySet<String> ids = shortcutIds == null ? null
: new ArraySet<>(shortcutIds);
- final ArraySet<LocusId> locIds = locusIds == null ? null
- : new ArraySet<>(locusIds);
final ShortcutUser user = getUserShortcutsLocked(userId);
final ShortcutPackage p = user.getPackageShortcutsIfExists(packageName);
if (p == null) {
return; // No need to instantiate ShortcutPackage.
}
- final boolean matchDynamic = (queryFlags & ShortcutQuery.FLAG_MATCH_DYNAMIC) != 0;
- final boolean matchPinned = (queryFlags & ShortcutQuery.FLAG_MATCH_PINNED) != 0;
- final boolean matchManifest = (queryFlags & ShortcutQuery.FLAG_MATCH_MANIFEST) != 0;
- final boolean matchCached = (queryFlags & ShortcutQuery.FLAG_MATCH_CACHED) != 0;
final boolean canAccessAllShortcuts =
canSeeAnyPinnedShortcut(callingPackage, launcherUserId, callingPid, callingUid);
@@ -2982,38 +3004,73 @@
final boolean getPinnedByAnyLauncher =
canAccessAllShortcuts &&
((queryFlags & ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER) != 0);
+ queryFlags |= (getPinnedByAnyLauncher ? ShortcutQuery.FLAG_MATCH_PINNED : 0);
- p.findAll(ret,
- (ShortcutInfo si) -> {
- if (si.getLastChangedTimestamp() < changedSince) {
- return false;
- }
- if (ids != null && !ids.contains(si.getId())) {
- return false;
- }
- if (locIds != null && !locIds.contains(si.getLocusId())) {
- return false;
- }
- if (componentName != null) {
- if (si.getActivity() != null
- && !si.getActivity().equals(componentName)) {
- return false;
- }
- }
- if (matchDynamic && si.isDynamic()) {
- return true;
- }
- if ((matchPinned || getPinnedByAnyLauncher) && si.isPinned()) {
- return true;
- }
- if (matchManifest && si.isDeclaredInManifest()) {
- return true;
- }
- if (matchCached && si.isCached()) {
- return true;
- }
+ final boolean matchPinnedOnly =
+ ((queryFlags & ShortcutQuery.FLAG_MATCH_PINNED) != 0)
+ && ((queryFlags & ShortcutQuery.FLAG_MATCH_CACHED) == 0)
+ && ((queryFlags & ShortcutQuery.FLAG_MATCH_DYNAMIC) == 0)
+ && ((queryFlags & ShortcutQuery.FLAG_MATCH_MANIFEST) == 0);
+
+ final Predicate<ShortcutInfo> filter = getFilterFromQuery(ids, locusIds, changedSince,
+ componentName, queryFlags, getPinnedByAnyLauncher);
+ if (matchPinnedOnly) {
+ p.findAllPinned(ret, filter, cloneFlag, callingPackage, launcherUserId,
+ getPinnedByAnyLauncher);
+ } else if (ids != null && !ids.isEmpty()) {
+ p.findAllByIds(ret, ids, filter, cloneFlag, callingPackage, launcherUserId,
+ getPinnedByAnyLauncher);
+ } else {
+ final boolean matchDynamic = (queryFlags & ShortcutQuery.FLAG_MATCH_DYNAMIC) != 0;
+ final boolean matchPinned = (queryFlags & ShortcutQuery.FLAG_MATCH_PINNED) != 0;
+ final boolean matchManifest = (queryFlags & ShortcutQuery.FLAG_MATCH_MANIFEST) != 0;
+ final boolean matchCached = (queryFlags & ShortcutQuery.FLAG_MATCH_CACHED) != 0;
+ p.findAll(ret, createQuery(matchDynamic, matchPinned, matchManifest, matchCached),
+ filter, cloneFlag, callingPackage, launcherUserId, getPinnedByAnyLauncher);
+ }
+ }
+
+ private Predicate<ShortcutInfo> getFilterFromQuery(@Nullable ArraySet<String> ids,
+ @Nullable List<LocusId> locusIds, long changedSince,
+ @Nullable ComponentName componentName, int queryFlags,
+ boolean getPinnedByAnyLauncher) {
+ final ArraySet<LocusId> locIds = locusIds == null ? null
+ : new ArraySet<>(locusIds);
+
+ final boolean matchDynamic = (queryFlags & ShortcutQuery.FLAG_MATCH_DYNAMIC) != 0;
+ final boolean matchPinned = (queryFlags & ShortcutQuery.FLAG_MATCH_PINNED) != 0;
+ final boolean matchManifest = (queryFlags & ShortcutQuery.FLAG_MATCH_MANIFEST) != 0;
+ final boolean matchCached = (queryFlags & ShortcutQuery.FLAG_MATCH_CACHED) != 0;
+ return si -> {
+ if (si.getLastChangedTimestamp() < changedSince) {
+ return false;
+ }
+ if (ids != null && !ids.contains(si.getId())) {
+ return false;
+ }
+ if (locIds != null && !locIds.contains(si.getLocusId())) {
+ return false;
+ }
+ if (componentName != null) {
+ if (si.getActivity() != null
+ && !si.getActivity().equals(componentName)) {
return false;
- }, cloneFlag, callingPackage, launcherUserId, getPinnedByAnyLauncher);
+ }
+ }
+ if (matchDynamic && si.isDynamic()) {
+ return true;
+ }
+ if ((matchPinned || getPinnedByAnyLauncher) && si.isPinned()) {
+ return true;
+ }
+ if (matchManifest && si.isDeclaredInManifest()) {
+ return true;
+ }
+ if (matchCached && si.isCached()) {
+ return true;
+ }
+ return false;
+ };
}
@Override
@@ -3054,7 +3111,7 @@
}
final ArrayList<ShortcutInfo> list = new ArrayList<>(1);
- p.findAll(list,
+ p.findAllByIds(list, Collections.singletonList(shortcutId),
(ShortcutInfo si) -> shortcutId.equals(si.getId()),
/* clone flags=*/ 0, callingPackage, launcherUserId, getPinnedByAnyLauncher);
return list.size() == 0 ? null : list.get(0);
@@ -3084,9 +3141,11 @@
if (sp != null) {
// List the shortcuts that are pinned only, these will get removed.
removedShortcuts = new ArrayList<>();
- sp.findAll(removedShortcuts, (ShortcutInfo si) -> si.isVisibleToPublisher()
- && si.isPinned() && !si.isCached() && !si.isDynamic()
- && !si.isDeclaredInManifest(), ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO,
+ sp.findAll(removedShortcuts, AppSearchShortcutInfo.QUERY_IS_VISIBLE_PINNED_ONLY,
+ (ShortcutInfo si) -> si.isVisibleToPublisher()
+ && si.isPinned() && !si.isCached() && !si.isDynamic()
+ && !si.isDeclaredInManifest(),
+ ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO,
callingPackage, launcherUserId, false);
}
// Get list of shortcuts that will get unpinned.
@@ -5081,6 +5140,17 @@
}
@VisibleForTesting
+ void updatePackageShortcutForTest(String packageName, String shortcutId, int userId,
+ Consumer<ShortcutInfo> cb) {
+ synchronized (mLock) {
+ final ShortcutPackage pkg = getPackageShortcutForTest(packageName, userId);
+ if (pkg == null) return;
+
+ pkg.mutateShortcut(shortcutId, null, cb);
+ }
+ }
+
+ @VisibleForTesting
ShortcutLauncher getLauncherShortcutForTest(String packageName, int userId) {
synchronized (mLock) {
final ShortcutUser user = mUsers.get(userId);
@@ -5162,7 +5232,7 @@
}
List<ShortcutInfo> result = new ArrayList<>();
- ps.findAll(result, (ShortcutInfo si) -> resultIds.contains(si.getId()),
+ ps.findAllByIds(result, resultIds, (ShortcutInfo si) -> resultIds.contains(si.getId()),
ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
return result;
}
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index 5f0aa03..069944d 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -457,7 +457,6 @@
case ShortcutPackage.TAG_ROOT: {
final ShortcutPackage shortcuts = ShortcutPackage.loadFromXml(
s, ret, parser, fromBackup);
- shortcuts.restoreParsedShortcuts(false);
// Don't use addShortcut(), we don't need to save the icon.
ret.mPackages.put(shortcuts.getPackageName(), shortcuts);
@@ -492,7 +491,6 @@
final ShortcutPackage sp = ShortcutPackage.loadFromFile(s, ret, f, fromBackup);
if (sp != null) {
ret.mPackages.put(sp.getPackageName(), sp);
- sp.restoreParsedShortcuts(false);
}
});
@@ -575,7 +573,7 @@
Log.w(TAG, "Shortcuts for package " + sp.getPackageName() + " are being restored."
+ " Existing non-manifeset shortcuts will be overwritten.");
}
- sp.restoreParsedShortcuts(true);
+ sp.restoreParsedShortcuts();
addPackage(sp);
restoredPackages[0]++;
restoredShortcuts[0] += sp.getShortcutCount();
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
index 7318273..0f99e19 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
@@ -28,6 +28,7 @@
import android.content.pm.ResolveInfo;
import android.content.pm.verify.domain.DomainVerificationInfo;
import android.content.pm.verify.domain.DomainVerificationManager;
+import android.content.pm.verify.domain.DomainVerificationState;
import android.os.Binder;
import android.os.UserHandle;
import android.util.IndentingPrintWriter;
@@ -35,8 +36,10 @@
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
+import com.android.internal.util.FunctionalUtils;
+import com.android.server.pm.PackageManagerService;
import com.android.server.pm.PackageSetting;
-import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.Settings;
import com.android.server.pm.verify.domain.models.DomainVerificationPkgState;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy;
@@ -46,6 +49,7 @@
import java.util.List;
import java.util.Set;
import java.util.UUID;
+import java.util.function.Consumer;
import java.util.function.Function;
public interface DomainVerificationManagerInternal {
@@ -108,9 +112,10 @@
int APPROVAL_LEVEL_INSTANT_APP = 5;
/**
- * Defines the possible values for {@link #approvalLevelForDomain(PackageSetting, Intent, int)}
- * which sorts packages by approval priority. A higher numerical value means the package should
- * override all lower values. This means that comparison using less/greater than IS valid.
+ * Defines the possible values for
+ * {@link #approvalLevelForDomain(PackageSetting, Intent, List, int, int)} which sorts packages
+ * by approval priority. A higher numerical value means the package should override all lower
+ * values. This means that comparison using less/greater than IS valid.
*
* Negative values are possible, although not implemented, reserved if explicit disable of a
* package for a domain needs to be tracked.
@@ -184,7 +189,7 @@
/**
* Migrates verification state from a previous install to a new one. It is expected that the
* {@link PackageSetting#getDomainSetId()} already be set to the correct value, usually from
- * {@link #generateNewId()}. This will preserve {@link DomainVerificationManager#STATE_SUCCESS}
+ * {@link #generateNewId()}. This will preserve {@link DomainVerificationState#STATE_SUCCESS}
* domains under the assumption that the new package will pass the same server side config as
* the previous package, as they have matching signatures.
* <p>
@@ -228,6 +233,11 @@
void clearPackage(@NonNull String packageName);
/**
+ * Remove all state for the given package for the given user.
+ */
+ void clearPackageForUser(@NonNull String packageName, @UserIdInt int userId);
+
+ /**
* Delete all the state for a user. This can be because the user has been removed from the
* device, or simply that the state for a user should be deleted.
*/
@@ -271,7 +281,7 @@
/**
* Until the legacy APIs are entirely removed, returns the legacy state from the previously
- * written info stored in {@link com.android.server.pm.Settings}.
+ * written info stored in {@link Settings}.
*/
int getLegacyState(@NonNull String packageName, @UserIdInt int userId);
@@ -283,15 +293,12 @@
* @param userId the specific user to print, or null to skip printing user selection
* states, supports {@link android.os.UserHandle#USER_ALL}
* @param pkgSettingFunction the method by which to retrieve package data; if this is called
- * from {@link com.android.server.pm.PackageManagerService}, it is
- * expected to pass in the snapshot of {@link PackageSetting} objects,
- * or if null is passed, the manager may decide to lock {@link
- * com.android.server.pm.PackageManagerService} through {@link
- * Connection#getPackageSettingLocked(String)}
+ * from {@link PackageManagerService}, it is
+ * expected to pass in the snapshot of {@link PackageSetting} objects
*/
void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName,
@Nullable @UserIdInt Integer userId,
- @Nullable Function<String, PackageSetting> pkgSettingFunction)
+ @NonNull Function<String, PackageSetting> pkgSettingFunction)
throws NameNotFoundException;
@NonNull
@@ -363,17 +370,46 @@
*/
void schedule(int code, @Nullable Object object);
- // TODO(b/178733426): Make DomainVerificationService PMS snapshot aware so it can avoid
- // locking package state at all. This can be as simple as removing this method in favor of
- // accepting a PackageSetting function in at every method call, although should probably
- // be abstracted to a wrapper class.
- @Nullable
- PackageSetting getPackageSettingLocked(@NonNull String pkgName);
+ /**
+ * Run a function block that requires access to {@link PackageSetting} data. This will
+ * ensure the {@link PackageManagerService} is taken before
+ * {@link DomainVerificationManagerInternal}'s lock is taken to avoid deadlock.
+ */
+ void withPackageSettings(@NonNull Consumer<Function<String, PackageSetting>> block);
- @Nullable
- AndroidPackage getPackageLocked(@NonNull String pkgName);
+ /**
+ * Variant which returns a value to the caller.
+ * @see #withPackageSettings(Consumer)
+ */
+ <Output> Output withPackageSettingsReturning(
+ @NonNull FunctionalUtils.ThrowingFunction<Function<String, PackageSetting>, Output>
+ block);
+
+ /**
+ * Variant which throws.
+ * @see #withPackageSettings(Consumer)
+ */
+ <ExceptionType extends Exception> void withPackageSettingsThrowing(
+ @NonNull ThrowingConsumer<Function<String, PackageSetting>, ExceptionType> block)
+ throws ExceptionType;
+
+ /**
+ * Variant which returns a value to the caller and throws.
+ * @see #withPackageSettings(Consumer)
+ */
+ <Output, ExceptionType extends Exception> Output withPackageSettingsReturningThrowing(
+ @NonNull ThrowingFunction<Function<String, PackageSetting>, Output, ExceptionType>
+ block) throws ExceptionType;
@UserIdInt
int[] getAllUserIds();
+
+ interface ThrowingConsumer<Input, ExceptionType extends Exception> {
+ void accept(Input input) throws ExceptionType;
+ }
+
+ interface ThrowingFunction<Input, Output, ExceptionType extends Exception> {
+ Output apply(Input input) throws ExceptionType;
+ }
}
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationPersistence.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationPersistence.java
index abb8d2f..f0ad98c 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationPersistence.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationPersistence.java
@@ -18,10 +18,12 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.pm.Signature;
import android.content.pm.verify.domain.DomainVerificationState;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.PackageUtils;
import android.util.SparseArray;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
@@ -36,6 +38,7 @@
import java.io.IOException;
import java.util.Collection;
import java.util.UUID;
+import java.util.function.Function;
public class DomainVerificationPersistence {
@@ -49,6 +52,7 @@
private static final String ATTR_PACKAGE_NAME = "packageName";
private static final String ATTR_ID = "id";
private static final String ATTR_HAS_AUTO_VERIFY_DOMAINS = "hasAutoVerifyDomains";
+ private static final String ATTR_SIGNATURE = "signature";
private static final String TAG_USER_STATES = "user-states";
public static final String TAG_USER_STATE = "user-state";
@@ -62,10 +66,18 @@
public static final String ATTR_NAME = "name";
public static final String ATTR_STATE = "state";
+ /**
+ * @param pkgNameToSignature Converts package name to a string representation of its signature.
+ * Usually this is the SHA-256 hash from
+ * {@link PackageUtils#computeSignaturesSha256Digest(Signature[])},
+ * but can be an arbitrary string for testing purposes. Pass non-null
+ * to write out signatures, or null to ignore.
+ */
public static void writeToXml(@NonNull TypedXmlSerializer xmlSerializer,
@NonNull DomainVerificationStateMap<DomainVerificationPkgState> attached,
@NonNull ArrayMap<String, DomainVerificationPkgState> pending,
- @NonNull ArrayMap<String, DomainVerificationPkgState> restored) throws IOException {
+ @NonNull ArrayMap<String, DomainVerificationPkgState> restored,
+ @Nullable Function<String, String> pkgNameToSignature) throws IOException {
try (SettingsXml.Serializer serializer = SettingsXml.serializer(xmlSerializer)) {
try (SettingsXml.WriteSection ignored = serializer.startSection(
TAG_DOMAIN_VERIFICATIONS)) {
@@ -86,25 +98,26 @@
}
try (SettingsXml.WriteSection activeSection = serializer.startSection(TAG_ACTIVE)) {
- writePackageStates(activeSection, active);
+ writePackageStates(activeSection, active, pkgNameToSignature);
}
try (SettingsXml.WriteSection restoredSection = serializer.startSection(
TAG_RESTORED)) {
- writePackageStates(restoredSection, restored.values());
+ writePackageStates(restoredSection, restored.values(), pkgNameToSignature);
}
}
}
}
private static void writePackageStates(@NonNull SettingsXml.WriteSection section,
- @NonNull Collection<DomainVerificationPkgState> states) throws IOException {
+ @NonNull Collection<DomainVerificationPkgState> states,
+ @Nullable Function<String, String> pkgNameToSignature) throws IOException {
if (states.isEmpty()) {
return;
}
for (DomainVerificationPkgState state : states) {
- writePkgStateToXml(section, state);
+ writePkgStateToXml(section, state, pkgNameToSignature);
}
}
@@ -146,11 +159,12 @@
* been entered.
*/
@Nullable
- public static DomainVerificationPkgState createPkgStateFromXml(
+ private static DomainVerificationPkgState createPkgStateFromXml(
@NonNull SettingsXml.ReadSection section) {
String packageName = section.getString(ATTR_PACKAGE_NAME);
String idString = section.getString(ATTR_ID);
boolean hasAutoVerifyDomains = section.getBoolean(ATTR_HAS_AUTO_VERIFY_DOMAINS);
+ String signature = section.getString(ATTR_SIGNATURE);
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(idString)) {
return null;
}
@@ -172,7 +186,7 @@
}
return new DomainVerificationPkgState(packageName, id, hasAutoVerifyDomains, stateMap,
- userStates);
+ userStates, signature);
}
private static void readUserStates(@NonNull SettingsXml.ReadSection section,
@@ -196,14 +210,26 @@
}
}
- public static void writePkgStateToXml(@NonNull SettingsXml.WriteSection parentSection,
- @NonNull DomainVerificationPkgState pkgState) throws IOException {
+ private static void writePkgStateToXml(@NonNull SettingsXml.WriteSection parentSection,
+ @NonNull DomainVerificationPkgState pkgState,
+ @Nullable Function<String, String> pkgNameToSignature) throws IOException {
+ String packageName = pkgState.getPackageName();
+ String signature = pkgNameToSignature == null
+ ? null : pkgNameToSignature.apply(packageName);
+ if (signature == null) {
+ // If a package isn't available to get its signature, fallback to the previously stored
+ // result, which can occur if the package has been marked for restore but hasn't
+ // been installed on the new device yet.
+ signature = pkgState.getBackupSignatureHash();
+ }
+
try (SettingsXml.WriteSection ignored =
parentSection.startSection(TAG_PACKAGE_STATE)
- .attribute(ATTR_PACKAGE_NAME, pkgState.getPackageName())
+ .attribute(ATTR_PACKAGE_NAME, packageName)
.attribute(ATTR_ID, pkgState.getId().toString())
.attribute(ATTR_HAS_AUTO_VERIFY_DOMAINS,
- pkgState.isHasAutoVerifyDomains())) {
+ pkgState.isHasAutoVerifyDomains())
+ .attribute(ATTR_SIGNATURE, signature)) {
writeStateMap(parentSection, pkgState.getStateMap());
writeUserStates(parentSection, pkgState.getUserStates());
}
@@ -245,7 +271,7 @@
* entered.
*/
@Nullable
- public static DomainVerificationInternalUserState createUserStateFromXml(
+ private static DomainVerificationInternalUserState createUserStateFromXml(
@NonNull SettingsXml.ReadSection section) {
int userId = section.getInt(ATTR_USER_ID);
if (userId == -1) {
@@ -274,7 +300,7 @@
}
}
- public static void writeUserStateToXml(@NonNull SettingsXml.WriteSection parentSection,
+ private static void writeUserStateToXml(@NonNull SettingsXml.WriteSection parentSection,
@NonNull DomainVerificationInternalUserState userState) throws IOException {
try (SettingsXml.WriteSection section =
parentSection.startSection(TAG_USER_STATE)
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
index 63515b9..4ae79a2 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
@@ -29,6 +29,7 @@
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageUserState;
import android.content.pm.ResolveInfo;
import android.content.pm.parsing.component.ParsedActivity;
import android.content.pm.verify.domain.DomainOwner;
@@ -37,10 +38,12 @@
import android.content.pm.verify.domain.DomainVerificationState;
import android.content.pm.verify.domain.DomainVerificationUserState;
import android.content.pm.verify.domain.IDomainVerificationManager;
+import android.os.Build;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;
+import android.util.PackageUtils;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -50,10 +53,12 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.CollectionUtils;
+import com.android.internal.util.FunctionalUtils;
import com.android.server.SystemConfig;
import com.android.server.SystemService;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.PackageSetting;
+import com.android.server.pm.Settings;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState;
import com.android.server.pm.verify.domain.models.DomainVerificationPkgState;
@@ -72,6 +77,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
+import java.util.function.Consumer;
import java.util.function.Function;
public class DomainVerificationService extends SystemService
@@ -99,9 +105,9 @@
* immediately attached once its available.
* <p>
* Generally this should be not accessed directly. Prefer calling {@link
- * #getAndValidateAttachedLocked(UUID, Set, boolean, int, Integer)}.
+ * #getAndValidateAttachedLocked(UUID, Set, boolean, int, Integer, Function)}.
*
- * @see #getAndValidateAttachedLocked(UUID, Set, boolean, int, Integer)
+ * @see #getAndValidateAttachedLocked(UUID, Set, boolean, int, Integer, Function)
**/
@GuardedBy("mLock")
@NonNull
@@ -168,7 +174,12 @@
@Override
public void setConnection(@NonNull Connection connection) {
- mConnection = connection;
+ if (Build.IS_USERDEBUG || Build.IS_ENG) {
+ mConnection = new LockSafeConnection(connection);
+ } else {
+ mConnection = connection;
+ }
+
mEnforcer.setCallback(mConnection);
}
@@ -249,41 +260,44 @@
public DomainVerificationInfo getDomainVerificationInfo(@NonNull String packageName)
throws NameNotFoundException {
mEnforcer.assertApprovedQuerent(mConnection.getCallingUid(), mProxy);
- synchronized (mLock) {
- AndroidPackage pkg = mConnection.getPackageLocked(packageName);
- if (pkg == null) {
- throw DomainVerificationUtils.throwPackageUnavailable(packageName);
+ return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ PackageSetting pkgSetting = pkgSettings.apply(packageName);
+ AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg();
+ if (pkg == null) {
+ throw DomainVerificationUtils.throwPackageUnavailable(packageName);
+ }
+
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
+ if (pkgState == null) {
+ return null;
+ }
+
+ ArrayMap<String, Integer> hostToStateMap = new ArrayMap<>(pkgState.getStateMap());
+
+ // TODO(b/159952358): Should the domain list be cached?
+ ArraySet<String> domains = mCollector.collectValidAutoVerifyDomains(pkg);
+ if (domains.isEmpty()) {
+ return null;
+ }
+
+ int size = domains.size();
+ for (int index = 0; index < size; index++) {
+ hostToStateMap.putIfAbsent(domains.valueAt(index),
+ DomainVerificationState.STATE_NO_RESPONSE);
+ }
+
+ final int mapSize = hostToStateMap.size();
+ for (int index = 0; index < mapSize; index++) {
+ int internalValue = hostToStateMap.valueAt(index);
+ int publicValue = DomainVerificationState.convertToInfoState(internalValue);
+ hostToStateMap.setValueAt(index, publicValue);
+ }
+
+ // TODO(b/159952358): Do not return if no values are editable (all ignored states)?
+ return new DomainVerificationInfo(pkgState.getId(), packageName, hostToStateMap);
}
-
- DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
- if (pkgState == null) {
- return null;
- }
-
- ArrayMap<String, Integer> hostToStateMap = new ArrayMap<>(pkgState.getStateMap());
-
- // TODO(b/159952358): Should the domain list be cached?
- ArraySet<String> domains = mCollector.collectValidAutoVerifyDomains(pkg);
- if (domains.isEmpty()) {
- return null;
- }
-
- int size = domains.size();
- for (int index = 0; index < size; index++) {
- hostToStateMap.putIfAbsent(domains.valueAt(index),
- DomainVerificationState.STATE_NO_RESPONSE);
- }
-
- final int mapSize = hostToStateMap.size();
- for (int index = 0; index < mapSize; index++) {
- int internalValue = hostToStateMap.valueAt(index);
- int publicValue = DomainVerificationState.convertToInfoState(internalValue);
- hostToStateMap.setValueAt(index, publicValue);
- }
-
- // TODO(b/159952358): Do not return if no values are editable (all ignored states)?
- return new DomainVerificationInfo(pkgState.getId(), packageName, hostToStateMap);
- }
+ });
}
@DomainVerificationManager.Error
@@ -306,44 +320,47 @@
@NonNull Set<String> domains, int state)
throws NameNotFoundException {
mEnforcer.assertApprovedVerifier(callingUid, mProxy);
- synchronized (mLock) {
- List<String> verifiedDomains = new ArrayList<>();
+ return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ List<String> verifiedDomains = new ArrayList<>();
- GetAttachedResult result = getAndValidateAttachedLocked(domainSetId, domains,
- true /* forAutoVerify */, callingUid, null /* userId */);
- if (result.isError()) {
- return result.getErrorCode();
- }
-
- DomainVerificationPkgState pkgState = result.getPkgState();
- ArrayMap<String, Integer> stateMap = pkgState.getStateMap();
- for (String domain : domains) {
- Integer previousState = stateMap.get(domain);
- if (previousState != null
- && !DomainVerificationState.isModifiable(previousState)) {
- continue;
+ GetAttachedResult result = getAndValidateAttachedLocked(domainSetId, domains,
+ true /* forAutoVerify */, callingUid, null /* userId */,
+ pkgSettings);
+ if (result.isError()) {
+ return result.getErrorCode();
}
- if (DomainVerificationState.isVerified(state)) {
- verifiedDomains.add(domain);
+ DomainVerificationPkgState pkgState = result.getPkgState();
+ ArrayMap<String, Integer> stateMap = pkgState.getStateMap();
+ for (String domain : domains) {
+ Integer previousState = stateMap.get(domain);
+ if (previousState != null
+ && !DomainVerificationState.isModifiable(previousState)) {
+ continue;
+ }
+
+ if (DomainVerificationState.isVerified(state)) {
+ verifiedDomains.add(domain);
+ }
+
+ stateMap.put(domain, state);
}
- stateMap.put(domain, state);
+ int size = verifiedDomains.size();
+ for (int index = 0; index < size; index++) {
+ removeUserStatesForDomain(verifiedDomains.get(index));
+ }
}
- int size = verifiedDomains.size();
- for (int index = 0; index < size; index++) {
- removeUserStatesForDomain(verifiedDomains.get(index));
- }
- }
-
- mConnection.scheduleWriteSettings();
- return DomainVerificationManager.STATUS_OK;
+ mConnection.scheduleWriteSettings();
+ return DomainVerificationManager.STATUS_OK;
+ });
}
@Override
public void setDomainVerificationStatusInternal(@Nullable String packageName, int state,
- @Nullable ArraySet<String> domains) throws NameNotFoundException {
+ @Nullable final ArraySet<String> domains) throws NameNotFoundException {
mEnforcer.assertInternal(mConnection.getCallingUid());
switch (state) {
@@ -357,55 +374,78 @@
"State must be one of NO_RESPONSE, SUCCESS, APPROVED, or DENIED");
}
+ ArraySet<String> verifiedDomains = new ArraySet<>();
if (packageName == null) {
- synchronized (mLock) {
- ArraySet<String> validDomains = new ArraySet<>();
+ mConnection.withPackageSettings(pkgSettings -> {
+ synchronized (mLock) {
+ ArraySet<String> validDomains = new ArraySet<>();
- int size = mAttachedPkgStates.size();
- for (int index = 0; index < size; index++) {
- DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
- String pkgName = pkgState.getPackageName();
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName);
+ int size = mAttachedPkgStates.size();
+ for (int index = 0; index < size; index++) {
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
+ String pkgName = pkgState.getPackageName();
+ PackageSetting pkgSetting = pkgSettings.apply(pkgName);
+ if (pkgSetting == null || pkgSetting.getPkg() == null) {
+ continue;
+ }
+
+ AndroidPackage pkg = pkgSetting.getPkg();
+
+ validDomains.clear();
+
+ ArraySet<String> autoVerifyDomains =
+ mCollector.collectValidAutoVerifyDomains(pkg);
+ if (domains == null) {
+ validDomains.addAll(autoVerifyDomains);
+ } else {
+ validDomains.addAll(domains);
+ validDomains.retainAll(autoVerifyDomains);
+ }
+
+ if (DomainVerificationState.isVerified(state)) {
+ verifiedDomains.addAll(validDomains);
+ }
+
+ setDomainVerificationStatusInternal(pkgState, state, validDomains);
+ }
+ }
+ });
+ } else {
+ mConnection.withPackageSettingsThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
+ if (pkgState == null) {
+ throw DomainVerificationUtils.throwPackageUnavailable(packageName);
+ }
+
+ PackageSetting pkgSetting = pkgSettings.apply(packageName);
if (pkgSetting == null || pkgSetting.getPkg() == null) {
- continue;
+ throw DomainVerificationUtils.throwPackageUnavailable(packageName);
}
AndroidPackage pkg = pkgSetting.getPkg();
-
- validDomains.clear();
-
- ArraySet<String> autoVerifyDomains =
- mCollector.collectValidAutoVerifyDomains(pkg);
+ final ArraySet<String> validDomains;
if (domains == null) {
- validDomains.addAll(autoVerifyDomains);
+ validDomains = mCollector.collectValidAutoVerifyDomains(pkg);
} else {
- validDomains.addAll(domains);
- validDomains.retainAll(autoVerifyDomains);
+ validDomains = domains;
+ validDomains.retainAll(mCollector.collectValidAutoVerifyDomains(pkg));
+ }
+
+ if (DomainVerificationState.isVerified(state)) {
+ verifiedDomains.addAll(validDomains);
}
setDomainVerificationStatusInternal(pkgState, state, validDomains);
}
- }
- } else {
- synchronized (mLock) {
- DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
- if (pkgState == null) {
- throw DomainVerificationUtils.throwPackageUnavailable(packageName);
- }
+ });
+ }
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(packageName);
- if (pkgSetting == null || pkgSetting.getPkg() == null) {
- throw DomainVerificationUtils.throwPackageUnavailable(packageName);
- }
-
- AndroidPackage pkg = pkgSetting.getPkg();
- if (domains == null) {
- domains = mCollector.collectValidAutoVerifyDomains(pkg);
- } else {
- domains.retainAll(mCollector.collectValidAutoVerifyDomains(pkg));
- }
-
- setDomainVerificationStatusInternal(pkgState, state, domains);
+ // Mirror SystemApi behavior of revoking user selection for approved domains.
+ if (DomainVerificationState.isVerified(state)) {
+ final int size = verifiedDomains.size();
+ for (int index = 0; index < size; index++) {
+ removeUserStatesForDomain(verifiedDomains.valueAt(index));
}
}
@@ -499,123 +539,63 @@
public int setDomainVerificationUserSelection(@NonNull UUID domainSetId,
@NonNull Set<String> domains, boolean enabled, @UserIdInt int userId)
throws NameNotFoundException {
- synchronized (mLock) {
- final int callingUid = mConnection.getCallingUid();
- // Pass null for package name here and do the app visibility enforcement inside
- // getAndValidateAttachedLocked instead, since this has to fail with the same invalid
- // ID reason if the target app is invisible
- if (!mEnforcer.assertApprovedUserSelector(callingUid, mConnection.getCallingUserId(),
- null /* packageName */, userId)) {
- return DomainVerificationManager.ERROR_DOMAIN_SET_ID_INVALID;
- }
-
- GetAttachedResult result = getAndValidateAttachedLocked(domainSetId, domains,
- false /* forAutoVerify */, callingUid, userId);
- if (result.isError()) {
- return result.getErrorCode();
- }
-
- DomainVerificationPkgState pkgState = result.getPkgState();
- DomainVerificationInternalUserState userState = pkgState.getOrCreateUserState(userId);
-
- // Disable other packages if approving this one. Note that this check is only done for
- // enabling. This allows an escape hatch in case multiple packages somehow get selected.
- // They can be disabled without blocking in a circular dependency.
- if (enabled) {
- // Cache the approved packages from the 1st pass because the search is expensive
- ArrayMap<String, List<String>> domainToApprovedPackages = new ArrayMap<>();
-
- for (String domain : domains) {
- if (userState.getEnabledHosts().contains(domain)) {
- continue;
- }
-
- Pair<List<String>, Integer> packagesToLevel = getApprovedPackages(domain,
- userId, APPROVAL_LEVEL_NONE + 1, mConnection::getPackageSettingLocked);
- int highestApproval = packagesToLevel.second;
- if (highestApproval > APPROVAL_LEVEL_SELECTION) {
- return DomainVerificationManager.ERROR_UNABLE_TO_APPROVE;
- }
-
- domainToApprovedPackages.put(domain, packagesToLevel.first);
- }
-
- // The removal for other packages must be done in a 2nd pass after it's determined
- // that no higher priority owners exist for all of the domains in the set.
- int mapSize = domainToApprovedPackages.size();
- for (int mapIndex = 0; mapIndex < mapSize; mapIndex++) {
- String domain = domainToApprovedPackages.keyAt(mapIndex);
- List<String> approvedPackages = domainToApprovedPackages.valueAt(mapIndex);
- int approvedSize = approvedPackages.size();
- for (int approvedIndex = 0; approvedIndex < approvedSize; approvedIndex++) {
- String approvedPackage = approvedPackages.get(approvedIndex);
- DomainVerificationPkgState approvedPkgState =
- mAttachedPkgStates.get(approvedPackage);
- if (approvedPkgState == null) {
- continue;
- }
-
- DomainVerificationInternalUserState approvedUserState =
- approvedPkgState.getUserState(userId);
- if (approvedUserState == null) {
- continue;
- }
-
- approvedUserState.removeHost(domain);
- }
- }
- }
-
- if (enabled) {
- userState.addHosts(domains);
- } else {
- userState.removeHosts(domains);
- }
+ final int callingUid = mConnection.getCallingUid();
+ // Pass null for package name here and do the app visibility enforcement inside
+ // getAndValidateAttachedLocked instead, since this has to fail with the same invalid
+ // ID reason if the target app is invisible
+ if (!mEnforcer.assertApprovedUserSelector(callingUid, mConnection.getCallingUserId(),
+ null /* packageName */, userId)) {
+ return DomainVerificationManager.ERROR_DOMAIN_SET_ID_INVALID;
}
- mConnection.scheduleWriteSettings();
- return DomainVerificationManager.STATUS_OK;
+ return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ GetAttachedResult result = getAndValidateAttachedLocked(domainSetId, domains,
+ false /* forAutoVerify */, callingUid, userId, pkgSettings);
+ if (result.isError()) {
+ return result.getErrorCode();
+ }
+
+ DomainVerificationPkgState pkgState = result.getPkgState();
+ DomainVerificationInternalUserState userState = pkgState.getOrCreateUserState(
+ userId);
+
+ // Disable other packages if approving this one. Note that this check is only done
+ // for enabling. This allows an escape hatch in case multiple packages somehow get
+ // selected. They can be disabled without blocking in a circular dependency.
+ if (enabled) {
+ int statusCode = revokeOtherUserSelectionsLocked(userState, userId, domains,
+ pkgSettings);
+ if (statusCode != DomainVerificationManager.STATUS_OK) {
+ return statusCode;
+ }
+ }
+
+ if (enabled) {
+ userState.addHosts(domains);
+ } else {
+ userState.removeHosts(domains);
+ }
+ }
+
+ mConnection.scheduleWriteSettings();
+ return DomainVerificationManager.STATUS_OK;
+ });
}
@Override
public void setDomainVerificationUserSelectionInternal(@UserIdInt int userId,
- @Nullable String packageName, boolean enabled, @Nullable ArraySet<String> domains)
+ @NonNull String packageName, boolean enabled, @Nullable ArraySet<String> domains)
throws NameNotFoundException {
mEnforcer.assertInternal(mConnection.getCallingUid());
-
-
- if (packageName == null) {
- synchronized (mLock) {
- Set<String> validDomains = new ArraySet<>();
- int size = mAttachedPkgStates.size();
- for (int index = 0; index < size; index++) {
- DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
- String pkgName = pkgState.getPackageName();
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName);
- AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg();
- if (pkg == null) {
- continue;
- }
-
- if (domains == null) {
- validDomains = mCollector.collectAllWebDomains(pkg);
- } else {
- validDomains.clear();
- validDomains.addAll(domains);
- }
-
- setDomainVerificationUserSelectionInternal(userId, pkgState,
- pkg, enabled, validDomains);
- }
- }
- } else {
+ mConnection.withPackageSettingsThrowing(pkgSettings -> {
synchronized (mLock) {
DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
if (pkgState == null) {
throw DomainVerificationUtils.throwPackageUnavailable(packageName);
}
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(packageName);
+ PackageSetting pkgSetting = pkgSettings.apply(packageName);
AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg();
if (pkg == null) {
throw DomainVerificationUtils.throwPackageUnavailable(packageName);
@@ -624,38 +604,85 @@
Set<String> validDomains =
domains == null ? mCollector.collectAllWebDomains(pkg) : domains;
- setDomainVerificationUserSelectionInternal(userId, pkgState, pkgSetting.getPkg(),
- enabled, validDomains);
+ validDomains.retainAll(mCollector.collectAllWebDomains(pkg));
+
+ if (userId == UserHandle.USER_ALL) {
+ for (int aUserId : mConnection.getAllUserIds()) {
+ DomainVerificationInternalUserState userState =
+ pkgState.getOrCreateUserState(aUserId);
+ revokeOtherUserSelectionsLocked(userState, aUserId, validDomains,
+ pkgSettings);
+ if (enabled) {
+ userState.addHosts(validDomains);
+ } else {
+ userState.removeHosts(validDomains);
+ }
+ }
+ } else {
+ DomainVerificationInternalUserState userState =
+ pkgState.getOrCreateUserState(userId);
+ revokeOtherUserSelectionsLocked(userState, userId, validDomains, pkgSettings);
+ if (enabled) {
+ userState.addHosts(validDomains);
+ } else {
+ userState.removeHosts(validDomains);
+ }
+ }
}
- }
+ });
mConnection.scheduleWriteSettings();
}
- private void setDomainVerificationUserSelectionInternal(int userId,
- @NonNull DomainVerificationPkgState pkgState, @NonNull AndroidPackage pkg,
- boolean enabled, Set<String> domains) {
- domains.retainAll(mCollector.collectAllWebDomains(pkg));
+ @GuardedBy("mLock")
+ private int revokeOtherUserSelectionsLocked(
+ @NonNull DomainVerificationInternalUserState userState, @UserIdInt int userId,
+ @NonNull Set<String> domains,
+ @NonNull Function<String, PackageSetting> pkgSettingFunction) {
+ // Cache the approved packages from the 1st pass because the search is expensive
+ ArrayMap<String, List<String>> domainToApprovedPackages = new ArrayMap<>();
- if (userId == UserHandle.USER_ALL) {
- for (int aUserId : mConnection.getAllUserIds()) {
- DomainVerificationInternalUserState userState =
- pkgState.getOrCreateUserState(aUserId);
- if (enabled) {
- userState.addHosts(domains);
- } else {
- userState.removeHosts(domains);
- }
+ for (String domain : domains) {
+ if (userState.getEnabledHosts().contains(domain)) {
+ continue;
}
- } else {
- DomainVerificationInternalUserState userState =
- pkgState.getOrCreateUserState(userId);
- if (enabled) {
- userState.addHosts(domains);
- } else {
- userState.removeHosts(domains);
+
+ Pair<List<String>, Integer> packagesToLevel = getApprovedPackagesLocked(domain,
+ userId, APPROVAL_LEVEL_NONE + 1, pkgSettingFunction);
+ int highestApproval = packagesToLevel.second;
+ if (highestApproval > APPROVAL_LEVEL_SELECTION) {
+ return DomainVerificationManager.ERROR_UNABLE_TO_APPROVE;
+ }
+
+ domainToApprovedPackages.put(domain, packagesToLevel.first);
+ }
+
+ // The removal for other packages must be done in a 2nd pass after it's determined
+ // that no higher priority owners exist for all of the domains in the set.
+ int mapSize = domainToApprovedPackages.size();
+ for (int mapIndex = 0; mapIndex < mapSize; mapIndex++) {
+ String domain = domainToApprovedPackages.keyAt(mapIndex);
+ List<String> approvedPackages = domainToApprovedPackages.valueAt(mapIndex);
+ int approvedSize = approvedPackages.size();
+ for (int approvedIndex = 0; approvedIndex < approvedSize; approvedIndex++) {
+ String approvedPackage = approvedPackages.get(approvedIndex);
+ DomainVerificationPkgState approvedPkgState =
+ mAttachedPkgStates.get(approvedPackage);
+ if (approvedPkgState == null) {
+ continue;
+ }
+
+ DomainVerificationInternalUserState approvedUserState =
+ approvedPkgState.getUserState(userId);
+ if (approvedUserState == null) {
+ continue;
+ }
+
+ approvedUserState.removeHost(domain);
}
}
+
+ return DomainVerificationManager.STATUS_OK;
}
@Nullable
@@ -666,46 +693,52 @@
mConnection.getCallingUserId(), packageName, userId)) {
throw DomainVerificationUtils.throwPackageUnavailable(packageName);
}
- synchronized (mLock) {
- AndroidPackage pkg = mConnection.getPackageLocked(packageName);
- if (pkg == null) {
- throw DomainVerificationUtils.throwPackageUnavailable(packageName);
- }
- DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
- if (pkgState == null) {
- return null;
- }
-
- ArraySet<String> webDomains = mCollector.collectAllWebDomains(pkg);
- int webDomainsSize = webDomains.size();
-
- Map<String, Integer> domains = new ArrayMap<>(webDomainsSize);
- ArrayMap<String, Integer> stateMap = pkgState.getStateMap();
- DomainVerificationInternalUserState userState = pkgState.getUserState(userId);
- Set<String> enabledHosts = userState == null ? emptySet() : userState.getEnabledHosts();
-
- for (int index = 0; index < webDomainsSize; index++) {
- String host = webDomains.valueAt(index);
- Integer state = stateMap.get(host);
-
- int domainState;
- if (state != null && DomainVerificationState.isVerified(state)) {
- domainState = DomainVerificationUserState.DOMAIN_STATE_VERIFIED;
- } else if (enabledHosts.contains(host)) {
- domainState = DomainVerificationUserState.DOMAIN_STATE_SELECTED;
- } else {
- domainState = DomainVerificationUserState.DOMAIN_STATE_NONE;
+ return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ PackageSetting pkgSetting = pkgSettings.apply(packageName);
+ AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg();
+ if (pkg == null) {
+ throw DomainVerificationUtils.throwPackageUnavailable(packageName);
}
- domains.put(host, domainState);
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
+ if (pkgState == null) {
+ return null;
+ }
+
+ ArraySet<String> webDomains = mCollector.collectAllWebDomains(pkg);
+ int webDomainsSize = webDomains.size();
+
+ Map<String, Integer> domains = new ArrayMap<>(webDomainsSize);
+ ArrayMap<String, Integer> stateMap = pkgState.getStateMap();
+ DomainVerificationInternalUserState userState = pkgState.getUserState(userId);
+ Set<String> enabledHosts =
+ userState == null ? emptySet() : userState.getEnabledHosts();
+
+ for (int index = 0; index < webDomainsSize; index++) {
+ String host = webDomains.valueAt(index);
+ Integer state = stateMap.get(host);
+
+ int domainState;
+ if (state != null && DomainVerificationState.isVerified(state)) {
+ domainState = DomainVerificationUserState.DOMAIN_STATE_VERIFIED;
+ } else if (enabledHosts.contains(host)) {
+ domainState = DomainVerificationUserState.DOMAIN_STATE_SELECTED;
+ } else {
+ domainState = DomainVerificationUserState.DOMAIN_STATE_NONE;
+ }
+
+ domains.put(host, domainState);
+ }
+
+ boolean linkHandlingAllowed =
+ userState == null || userState.isLinkHandlingAllowed();
+
+ return new DomainVerificationUserState(pkgState.getId(), packageName,
+ UserHandle.of(userId), linkHandlingAllowed, domains);
}
-
- boolean linkHandlingAllowed = userState == null || userState.isLinkHandlingAllowed();
-
- return new DomainVerificationUserState(pkgState.getId(), packageName,
- UserHandle.of(userId), linkHandlingAllowed, domains);
- }
+ });
}
public List<DomainOwner> getOwnersForDomain(@NonNull String domain, @UserIdInt int userId) {
@@ -713,67 +746,68 @@
userId);
SparseArray<List<String>> levelToPackages = new SparseArray<>();
+ return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
+ // First, collect the raw approval level values
+ synchronized (mLock) {
+ final int size = mAttachedPkgStates.size();
+ for (int index = 0; index < size; index++) {
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
+ String packageName = pkgState.getPackageName();
+ PackageSetting pkgSetting = pkgSettings.apply(packageName);
+ if (pkgSetting == null) {
+ continue;
+ }
- // First, collect the raw approval level values
- synchronized (mLock) {
- final int size = mAttachedPkgStates.size();
+ int level = approvalLevelForDomain(pkgSetting, domain, userId, domain);
+ if (level <= APPROVAL_LEVEL_NONE) {
+ continue;
+ }
+ List<String> list = levelToPackages.get(level);
+ if (list == null) {
+ list = new ArrayList<>();
+ levelToPackages.put(level, list);
+ }
+ list.add(packageName);
+ }
+ }
+
+ final int size = levelToPackages.size();
+ if (size == 0) {
+ return emptyList();
+ }
+
+ // Then sort them ascending by first installed time, with package name as tie breaker
for (int index = 0; index < size; index++) {
- DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
- String packageName = pkgState.getPackageName();
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(packageName);
- if (pkgSetting == null) {
- continue;
- }
+ levelToPackages.valueAt(index).sort((first, second) -> {
+ PackageSetting firstPkgSetting = pkgSettings.apply(first);
+ PackageSetting secondPkgSetting = pkgSettings.apply(second);
- int level = approvalLevelForDomain(pkgSetting, domain, userId, domain);
- if (level <= APPROVAL_LEVEL_NONE) {
- continue;
- }
- List<String> list = levelToPackages.get(level);
- if (list == null) {
- list = new ArrayList<>();
- levelToPackages.put(level, list);
- }
- list.add(packageName);
+ long firstInstallTime =
+ firstPkgSetting == null ? -1L : firstPkgSetting.getFirstInstallTime();
+ long secondInstallTime =
+ secondPkgSetting == null ? -1L : secondPkgSetting.getFirstInstallTime();
+
+ if (firstInstallTime != secondInstallTime) {
+ return (int) (firstInstallTime - secondInstallTime);
+ }
+
+ return first.compareToIgnoreCase(second);
+ });
}
- }
- final int size = levelToPackages.size();
- if (size == 0) {
- return emptyList();
- }
-
- // Then sort them ascending by first installed time, with package name as the tie breaker
- for (int index = 0; index < size; index++) {
- levelToPackages.valueAt(index).sort((first, second) -> {
- PackageSetting firstPkgSetting = mConnection.getPackageSettingLocked(first);
- PackageSetting secondPkgSetting = mConnection.getPackageSettingLocked(second);
-
- long firstInstallTime =
- firstPkgSetting == null ? -1L : firstPkgSetting.getFirstInstallTime();
- long secondInstallTime =
- secondPkgSetting == null ? -1L : secondPkgSetting.getFirstInstallTime();
-
- if (firstInstallTime != secondInstallTime) {
- return (int) (firstInstallTime - secondInstallTime);
+ List<DomainOwner> owners = new ArrayList<>();
+ for (int index = 0; index < size; index++) {
+ int level = levelToPackages.keyAt(index);
+ boolean overrideable = level <= APPROVAL_LEVEL_SELECTION;
+ List<String> packages = levelToPackages.valueAt(index);
+ int packagesSize = packages.size();
+ for (int packageIndex = 0; packageIndex < packagesSize; packageIndex++) {
+ owners.add(new DomainOwner(packages.get(packageIndex), overrideable));
}
-
- return first.compareToIgnoreCase(second);
- });
- }
-
- List<DomainOwner> owners = new ArrayList<>();
- for (int index = 0; index < size; index++) {
- int level = levelToPackages.keyAt(index);
- boolean overrideable = level <= APPROVAL_LEVEL_SELECTION;
- List<String> packages = levelToPackages.valueAt(index);
- int packagesSize = packages.size();
- for (int packageIndex = 0; packageIndex < packagesSize; packageIndex++) {
- owners.add(new DomainOwner(packages.get(packageIndex), overrideable));
}
- }
- return owners;
+ return owners;
+ });
}
@NonNull
@@ -809,7 +843,8 @@
+ ", new pkg = " + newPkg, new Exception());
DomainVerificationPkgState newPkgState = new DomainVerificationPkgState(
- pkgName, newDomainSetId, true, newStateMap, newUserStates);
+ pkgName, newDomainSetId, true, newStateMap, newUserStates,
+ null /* signature */);
mAttachedPkgStates.put(pkgName, newDomainSetId, newPkgState);
return;
}
@@ -861,7 +896,8 @@
sendBroadcast = hasAutoVerifyDomains && needsBroadcast;
mAttachedPkgStates.put(pkgName, newDomainSetId, new DomainVerificationPkgState(
- pkgName, newDomainSetId, hasAutoVerifyDomains, newStateMap, newUserStates));
+ pkgName, newDomainSetId, hasAutoVerifyDomains, newStateMap, newUserStates,
+ null /* signature */));
}
if (sendBroadcast) {
@@ -889,6 +925,11 @@
sendBroadcast = false;
} else {
pkgState = mSettings.removeRestoredState(pkgName);
+ if (pkgState != null && !Objects.equals(pkgState.getBackupSignatureHash(),
+ PackageUtils.computeSignaturesSha256Digest(newPkgSetting.getSignatures()))) {
+ // If restoring and the signatures don't match, drop the state
+ pkgState = null;
+ }
}
AndroidPackage pkg = newPkgSetting.getPkg();
@@ -986,9 +1027,22 @@
@Override
public void writeSettings(@NonNull TypedXmlSerializer serializer) throws IOException {
- synchronized (mLock) {
- mSettings.writeSettings(serializer, mAttachedPkgStates);
- }
+ mConnection.withPackageSettingsThrowing(pkgSettings -> {
+ synchronized (mLock) {
+ mSettings.writeSettings(serializer, mAttachedPkgStates, pkgName -> {
+ PackageSetting pkgSetting = pkgSettings.apply(pkgName);
+ if (pkgSetting == null) {
+ // If querying for a user restored package that isn't installed on the
+ // device yet, there will be no signature to write out. In that case,
+ // it's expected that this returns null and it falls back to the restored
+ // state's stored signature if it exists.
+ return null;
+ }
+
+ return PackageUtils.computeSignaturesSha256Digest(pkgSetting.getSignatures());
+ });
+ }
+ });
mLegacySettings.writeSettings(serializer);
}
@@ -1046,6 +1100,21 @@
public void clearPackage(@NonNull String packageName) {
synchronized (mLock) {
mAttachedPkgStates.remove(packageName);
+ mSettings.removePackage(packageName);
+ }
+
+ mConnection.scheduleWriteSettings();
+ }
+
+ @Override
+ public void clearPackageForUser(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ final DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
+ if (pkgState != null) {
+ pkgState.removeUser(userId);
+ }
+
+ mSettings.removePackageForUser(packageName, userId);
}
mConnection.scheduleWriteSettings();
@@ -1073,21 +1142,15 @@
@Override
public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName,
@Nullable Integer userId) throws NameNotFoundException {
- // This method is only used by DomainVerificationShell, which doesn't lock PMS, so it's
- // safe to pass mConnection directly here and lock PMS. This method is not exposed
- // to the general system server/PMS.
- printState(writer, packageName, userId, mConnection::getPackageSettingLocked);
+ mConnection.withPackageSettingsThrowing(
+ pkgSettings -> printState(writer, packageName, userId, pkgSettings));
}
@Override
public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName,
@Nullable @UserIdInt Integer userId,
- @Nullable Function<String, PackageSetting> pkgSettingFunction)
+ @NonNull Function<String, PackageSetting> pkgSettingFunction)
throws NameNotFoundException {
- if (pkgSettingFunction == null) {
- pkgSettingFunction = mConnection::getPackageSettingLocked;
- }
-
synchronized (mLock) {
mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates);
}
@@ -1136,7 +1199,9 @@
@GuardedBy("mLock")
private GetAttachedResult getAndValidateAttachedLocked(@NonNull UUID domainSetId,
@NonNull Set<String> domains, boolean forAutoVerify, int callingUid,
- @Nullable Integer userIdForFilter) throws NameNotFoundException {
+ @Nullable Integer userIdForFilter,
+ @NonNull Function<String, PackageSetting> pkgSettingFunction)
+ throws NameNotFoundException {
if (domainSetId == null) {
throw new IllegalArgumentException("domainSetId cannot be null");
}
@@ -1153,7 +1218,7 @@
return GetAttachedResult.error(DomainVerificationManager.ERROR_DOMAIN_SET_ID_INVALID);
}
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName);
+ PackageSetting pkgSetting = pkgSettingFunction.apply(pkgName);
if (pkgSetting == null || pkgSetting.getPkg() == null) {
throw DomainVerificationUtils.throwPackageUnavailable(pkgName);
}
@@ -1241,31 +1306,33 @@
@Override
public void clearDomainVerificationState(@Nullable List<String> packageNames) {
mEnforcer.assertInternal(mConnection.getCallingUid());
- synchronized (mLock) {
- if (packageNames == null) {
- int size = mAttachedPkgStates.size();
- for (int index = 0; index < size; index++) {
- DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
- String pkgName = pkgState.getPackageName();
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName);
- if (pkgSetting == null || pkgSetting.getPkg() == null) {
- continue;
+ mConnection.withPackageSettings(pkgSettings -> {
+ synchronized (mLock) {
+ if (packageNames == null) {
+ int size = mAttachedPkgStates.size();
+ for (int index = 0; index < size; index++) {
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
+ String pkgName = pkgState.getPackageName();
+ PackageSetting pkgSetting = pkgSettings.apply(pkgName);
+ if (pkgSetting == null || pkgSetting.getPkg() == null) {
+ continue;
+ }
+ resetDomainState(pkgState, pkgSetting.getPkg());
}
- resetDomainState(pkgState, pkgSetting.getPkg());
- }
- } else {
- int size = packageNames.size();
- for (int index = 0; index < size; index++) {
- String pkgName = packageNames.get(index);
- DomainVerificationPkgState pkgState = mAttachedPkgStates.get(pkgName);
- PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName);
- if (pkgSetting == null || pkgSetting.getPkg() == null) {
- continue;
+ } else {
+ int size = packageNames.size();
+ for (int index = 0; index < size; index++) {
+ String pkgName = packageNames.get(index);
+ DomainVerificationPkgState pkgState = mAttachedPkgStates.get(pkgName);
+ PackageSetting pkgSetting = pkgSettings.apply(pkgName);
+ if (pkgSetting == null || pkgSetting.getPkg() == null) {
+ continue;
+ }
+ resetDomainState(pkgState, pkgSetting.getPkg());
}
- resetDomainState(pkgState, pkgSetting.getPkg());
}
}
- }
+ });
mConnection.scheduleWriteSettings();
}
@@ -1548,6 +1615,22 @@
String packageName = pkgSetting.getName();
final AndroidPackage pkg = pkgSetting.getPkg();
+ final PackageUserState pkgUserState = pkgSetting.readUserState(userId);
+ if (pkgUserState == null) {
+ if (DEBUG_APPROVAL) {
+ debugApproval(packageName, debugObject, userId, false,
+ "PackageUserState unavailable");
+ }
+ return APPROVAL_LEVEL_NONE;
+ }
+
+ if (!pkgUserState.installed || !pkgUserState.isPackageEnabled(pkg)) {
+ if (DEBUG_APPROVAL) {
+ debugApproval(packageName, debugObject, userId, false, "package not enabled");
+ }
+ return APPROVAL_LEVEL_NONE;
+ }
+
// Should never be null, but if it is, skip this and assume that v2 is enabled
if (pkg != null && !DomainVerificationUtils.isChangeEnabled(mPlatformCompat, pkg,
SETTINGS_API_V2)) {
@@ -1664,8 +1747,9 @@
/**
* @return the filtered list paired with the corresponding approval level
*/
+ @GuardedBy("mLock")
@NonNull
- private Pair<List<String>, Integer> getApprovedPackages(@NonNull String domain,
+ private Pair<List<String>, Integer> getApprovedPackagesLocked(@NonNull String domain,
@UserIdInt int userId, int minimumApproval,
@NonNull Function<String, PackageSetting> pkgSettingFunction) {
int highestApproval = minimumApproval;
@@ -1764,4 +1848,93 @@
return mErrorCode;
}
}
+
+ /**
+ * Wraps a {@link Connection} to verify that the {@link PackageSetting} calls do not hold
+ * {@link #mLock}, as that can cause deadlock when {@link Settings} tries to serialize state to
+ * disk. Only enabled if {@link Build#IS_USERDEBUG} or {@link Build#IS_ENG} is true.
+ */
+ private class LockSafeConnection implements Connection {
+
+ @NonNull
+ private final Connection mConnection;
+
+ private LockSafeConnection(@NonNull Connection connection) {
+ mConnection = connection;
+ }
+
+ private void enforceLocking() {
+ if (Thread.holdsLock(mLock)) {
+ Slog.wtf(TAG, "Method should not hold DVS lock when accessing package data");
+ }
+ }
+
+ @Override
+ public void withPackageSettings(
+ @NonNull Consumer<Function<String, PackageSetting>> block) {
+ enforceLocking();
+ mConnection.withPackageSettings(block);
+ }
+
+ @Override
+ public <Output> Output withPackageSettingsReturning(
+ @NonNull FunctionalUtils.ThrowingFunction<Function<String, PackageSetting>, Output>
+ block) {
+ enforceLocking();
+ return mConnection.withPackageSettingsReturning(block);
+ }
+
+ @Override
+ public <ExceptionType extends Exception> void withPackageSettingsThrowing(
+ @NonNull ThrowingConsumer<Function<String, PackageSetting>, ExceptionType> block)
+ throws ExceptionType {
+ enforceLocking();
+ mConnection.withPackageSettingsThrowing(block);
+ }
+
+ @Override
+ public <Output, ExceptionType extends Exception> Output
+ withPackageSettingsReturningThrowing(@NonNull ThrowingFunction<Function<String,
+ PackageSetting>, Output, ExceptionType> block) throws ExceptionType {
+ enforceLocking();
+ return mConnection.withPackageSettingsReturningThrowing(block);
+ }
+
+ @Override
+ public void scheduleWriteSettings() {
+ mConnection.scheduleWriteSettings();
+ }
+
+ @Override
+ public int getCallingUid() {
+ return mConnection.getCallingUid();
+ }
+
+ @Override
+ @UserIdInt
+ public int getCallingUserId() {
+ return mConnection.getCallingUserId();
+ }
+
+ @Override
+ public void schedule(int code, @Nullable Object object) {
+ mConnection.schedule(code, object);
+ }
+
+ @Override
+ @UserIdInt
+ public int[] getAllUserIds() {
+ return mConnection.getAllUserIds();
+ }
+
+ @Override
+ public boolean filterAppAccess(@NonNull String packageName, int callingUid, int userId) {
+ return mConnection.filterAppAccess(packageName, callingUid, userId);
+ }
+
+ @Override
+ public boolean doesUserExist(int userId) {
+ return mConnection.doesUserExist(userId);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java
index 8b59da7..c8e95b5 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java
@@ -36,6 +36,7 @@
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.util.function.Function;
class DomainVerificationSettings {
@@ -68,18 +69,19 @@
public void writeSettings(@NonNull TypedXmlSerializer xmlSerializer,
- @NonNull DomainVerificationStateMap<DomainVerificationPkgState> liveState)
- throws IOException {
+ @NonNull DomainVerificationStateMap<DomainVerificationPkgState> liveState,
+ @NonNull Function<String, String> pkgSignatureFunction) throws IOException {
synchronized (mLock) {
DomainVerificationPersistence.writeToXml(xmlSerializer, liveState,
- mPendingPkgStates, mRestoredPkgStates);
+ mPendingPkgStates, mRestoredPkgStates, pkgSignatureFunction);
}
}
/**
* Parses a previously stored set of states and merges them with {@param liveState}, directly
* mutating the values. This is intended for reading settings written by {@link
- * #writeSettings(TypedXmlSerializer, DomainVerificationStateMap)} on the same device setup.
+ * #writeSettings(TypedXmlSerializer, DomainVerificationStateMap, Function)} on the same device
+ * setup.
*/
public void readSettings(@NonNull TypedXmlPullParser parser,
@NonNull DomainVerificationStateMap<DomainVerificationPkgState> liveState)
@@ -155,16 +157,20 @@
// mergePkgState runs, without the merge part.
ArrayMap<String, Integer> stateMap = newState.getStateMap();
int size = stateMap.size();
- for (int index = 0; index < size; index++) {
+ for (int index = size - 1; index >= 0; index--) {
Integer stateInteger = stateMap.valueAt(index);
if (stateInteger != null) {
int state = stateInteger;
if (state == DomainVerificationState.STATE_SUCCESS
|| state == DomainVerificationState.STATE_RESTORED) {
- stateMap.setValueAt(index, state);
+ stateMap.setValueAt(index, DomainVerificationState.STATE_RESTORED);
+ } else {
+ stateMap.removeAt(index);
}
}
}
+
+ mRestoredPkgStates.put(pkgName, newState);
}
}
}
@@ -241,17 +247,41 @@
}
}
- public void removeUser(@UserIdInt int userId) {
- int pendingSize = mPendingPkgStates.size();
- for (int index = 0; index < pendingSize; index++) {
- mPendingPkgStates.valueAt(index).removeUser(userId);
+ public void removePackage(@NonNull String packageName) {
+ synchronized (mLock) {
+ mPendingPkgStates.remove(packageName);
+ mRestoredPkgStates.remove(packageName);
}
+ }
- // TODO(b/170746586): Restored assumes user IDs match, which is probably not the case
- // on a new device
- int restoredSize = mRestoredPkgStates.size();
- for (int index = 0; index < restoredSize; index++) {
- mRestoredPkgStates.valueAt(index).removeUser(userId);
+ public void removePackageForUser(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ final DomainVerificationPkgState pendingPkgState = mPendingPkgStates.get(packageName);
+ if (pendingPkgState != null) {
+ pendingPkgState.removeUser(userId);
+ }
+ // TODO(b/170746586): Restored assumes user IDs match, which is probably not the case
+ // on a new device
+ final DomainVerificationPkgState restoredPkgState = mRestoredPkgStates.get(packageName);
+ if (restoredPkgState != null) {
+ restoredPkgState.removeUser(userId);
+ }
+ }
+ }
+
+ public void removeUser(@UserIdInt int userId) {
+ synchronized (mLock) {
+ int pendingSize = mPendingPkgStates.size();
+ for (int index = 0; index < pendingSize; index++) {
+ mPendingPkgStates.valueAt(index).removeUser(userId);
+ }
+
+ // TODO(b/170746586): Restored assumes user IDs match, which is probably not the case
+ // on a new device
+ int restoredSize = mRestoredPkgStates.size();
+ for (int index = 0; index < restoredSize; index++) {
+ mRestoredPkgStates.valueAt(index).removeUser(userId);
+ }
}
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
index b6554d7..ea71b28 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
@@ -98,7 +98,7 @@
pw.println(" must be declared by the package for this to work. This command will not");
pw.println(" report a failure for domains that could not be applied.");
pw.println(" --user <USER_ID>: the user to change selections for");
- pw.println(" --package <PACKAGE>: the package to set, or \"all\" to set all packages");
+ pw.println(" --package <PACKAGE>: the package to set");
pw.println(" <ENABLED>: whether or not to approve the domain");
pw.println(" <DOMAINS>: space separated list of domains to change, or \"all\" to");
pw.println(" change every domain.");
@@ -226,8 +226,6 @@
if (TextUtils.isEmpty(packageName)) {
commandHandler.getErrPrintWriter().println("Error: no package specified");
return false;
- } else if (packageName.equalsIgnoreCase("all")) {
- packageName = null;
}
if (userId == null) {
@@ -478,13 +476,15 @@
* Variant for use by PackageManagerShellCommand to allow the system/developer to override
* the state for a domain.
*
- * @param packageName the package whose state to change, or all packages if non is
- * specified
+ * If an approval fails because of a higher level owner, this method will silently skip the
+ * domain.
+ *
+ * @param packageName the package whose state to change
* @param enabled whether the domain is now approved by the user
* @param domains the set of domains to change, or null to affect all domains
*/
void setDomainVerificationUserSelectionInternal(@UserIdInt int userId,
- @Nullable String packageName, boolean enabled, @Nullable ArraySet<String> domains)
+ @NonNull String packageName, boolean enabled, @Nullable ArraySet<String> domains)
throws PackageManager.NameNotFoundException;
/**
diff --git a/services/core/java/com/android/server/pm/verify/domain/TEST_MAPPING b/services/core/java/com/android/server/pm/verify/domain/TEST_MAPPING
index c6c9791..5fcf411 100644
--- a/services/core/java/com/android/server/pm/verify/domain/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/verify/domain/TEST_MAPPING
@@ -7,6 +7,12 @@
"include-filter": "com.android.server.pm.test.verify.domain"
}
]
+ },
+ {
+ "name": "CtsDomainVerificationDeviceTestCases"
+ },
+ {
+ "name": "CtsDomainVerificationHostTestCases"
}
]
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/models/DomainVerificationPkgState.java b/services/core/java/com/android/server/pm/verify/domain/models/DomainVerificationPkgState.java
index 40c7091..6c56360 100644
--- a/services/core/java/com/android/server/pm/verify/domain/models/DomainVerificationPkgState.java
+++ b/services/core/java/com/android/server/pm/verify/domain/models/DomainVerificationPkgState.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.content.pm.Signature;
import android.content.pm.verify.domain.DomainVerificationState;
import android.util.ArrayMap;
import android.util.SparseArray;
@@ -63,15 +64,28 @@
@NonNull
private final SparseArray<DomainVerificationInternalUserState> mUserStates;
+ /**
+ * If previously recorded, the SHA-256 signing cert digest of the package to attach to.
+ * When doing restoration of a previously backed up state, if the signature does not
+ * match the package being scanned/installed on device, it will be rejected.
+ *
+ * It's assumed the domain verification agent will eventually re-verify this domain
+ * and revoke if necessary.
+ *
+ * @see android.util.PackageUtils#computeSignaturesSha256Digest(Signature[])
+ */
+ @Nullable
+ private final String mBackupSignatureHash;
+
public DomainVerificationPkgState(@NonNull String packageName, @NonNull UUID id,
boolean hasAutoVerifyDomains) {
- this(packageName, id, hasAutoVerifyDomains, new ArrayMap<>(0), new SparseArray<>(0));
+ this(packageName, id, hasAutoVerifyDomains, new ArrayMap<>(0), new SparseArray<>(0), null);
}
public DomainVerificationPkgState(@NonNull DomainVerificationPkgState pkgState,
@NonNull UUID id, boolean hasAutoVerifyDomains) {
this(pkgState.getPackageName(), id, hasAutoVerifyDomains, pkgState.getStateMap(),
- pkgState.getUserStates());
+ pkgState.getUserStates(), null);
}
@Nullable
@@ -109,7 +123,7 @@
- // Code below generated by codegen v1.0.22.
+ // Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -137,6 +151,13 @@
*
* TODO(b/159952358): Hide the state map entirely from the caller, to allow optimizations,
* such as storing no state when the package is marked as a linked app in SystemConfig.
+ * @param backupSignatureHash
+ * If previously recorded, the SHA-256 signing cert digest of the package to attach to.
+ * When doing restoration of a previously backed up state, if the signature does not
+ * match the package being scanned/installed on device, it will be rejected.
+ *
+ * It's assumed the domain verification agent will eventually re-verify this domain
+ * and revoke if necessary.
*/
@DataClass.Generated.Member
public DomainVerificationPkgState(
@@ -144,7 +165,8 @@
@NonNull UUID id,
boolean hasAutoVerifyDomains,
@NonNull ArrayMap<String,Integer> stateMap,
- @NonNull SparseArray<DomainVerificationInternalUserState> userStates) {
+ @NonNull SparseArray<DomainVerificationInternalUserState> userStates,
+ @Nullable String backupSignatureHash) {
this.mPackageName = packageName;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mPackageName);
@@ -158,6 +180,7 @@
this.mUserStates = userStates;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mUserStates);
+ this.mBackupSignatureHash = backupSignatureHash;
// onConstructed(); // You can define this method to get a callback
}
@@ -201,6 +224,21 @@
return mUserStates;
}
+ /**
+ * If previously recorded, the SHA-256 signing cert digest of the package to attach to.
+ * When doing restoration of a previously backed up state, if the signature does not
+ * match the package being scanned/installed on device, it will be rejected.
+ *
+ * It's assumed the domain verification agent will eventually re-verify this domain
+ * and revoke if necessary.
+ *
+ * @see android.util.PackageUtils#computeSignaturesSha256Digest(Signature[])
+ */
+ @DataClass.Generated.Member
+ public @Nullable String getBackupSignatureHash() {
+ return mBackupSignatureHash;
+ }
+
@Override
@DataClass.Generated.Member
public String toString() {
@@ -212,7 +250,8 @@
"id = " + mId + ", " +
"hasAutoVerifyDomains = " + mHasAutoVerifyDomains + ", " +
"stateMap = " + mStateMap + ", " +
- "userStates = " + mUserStates +
+ "userStates = " + mUserStates + ", " +
+ "backupSignatureHash = " + mBackupSignatureHash +
" }";
}
@@ -233,7 +272,8 @@
&& Objects.equals(mId, that.mId)
&& mHasAutoVerifyDomains == that.mHasAutoVerifyDomains
&& Objects.equals(mStateMap, that.mStateMap)
- && userStatesEquals(that.mUserStates);
+ && userStatesEquals(that.mUserStates)
+ && Objects.equals(mBackupSignatureHash, that.mBackupSignatureHash);
}
@Override
@@ -248,14 +288,15 @@
_hash = 31 * _hash + Boolean.hashCode(mHasAutoVerifyDomains);
_hash = 31 * _hash + Objects.hashCode(mStateMap);
_hash = 31 * _hash + userStatesHashCode();
+ _hash = 31 * _hash + Objects.hashCode(mBackupSignatureHash);
return _hash;
}
@DataClass.Generated(
- time = 1614818362549L,
- codegenVersion = "1.0.22",
+ time = 1617315369614L,
+ codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/verify/domain/models/DomainVerificationPkgState.java",
- inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate @android.annotation.NonNull java.util.UUID mId\nprivate final boolean mHasAutoVerifyDomains\nprivate final @android.annotation.NonNull android.util.ArrayMap<java.lang.String,java.lang.Integer> mStateMap\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState> mUserStates\npublic @android.annotation.Nullable com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState getUserState(int)\npublic @android.annotation.Nullable com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState getOrCreateUserState(int)\npublic void setId(java.util.UUID)\npublic void removeUser(int)\npublic void removeAllUsers()\nprivate int userStatesHashCode()\nprivate boolean userStatesEquals(android.util.SparseArray<com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState>)\nclass DomainVerificationPkgState extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genToString=true, genEqualsHashCode=true)")
+ inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate @android.annotation.NonNull java.util.UUID mId\nprivate final boolean mHasAutoVerifyDomains\nprivate final @android.annotation.NonNull android.util.ArrayMap<java.lang.String,java.lang.Integer> mStateMap\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState> mUserStates\nprivate final @android.annotation.Nullable java.lang.String mBackupSignatureHash\npublic @android.annotation.Nullable com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState getUserState(int)\npublic @android.annotation.Nullable com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState getOrCreateUserState(int)\npublic void removeUser(int)\npublic void removeAllUsers()\nprivate int userStatesHashCode()\nprivate boolean userStatesEquals(android.util.SparseArray<com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState>)\nclass DomainVerificationPkgState extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genToString=true, genEqualsHashCode=true)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index c7789ee..5b333e1 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -273,6 +273,11 @@
static final int VERY_LONG_PRESS_POWER_NOTHING = 0;
static final int VERY_LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+ // must match: config_keyChordPowerVolumeUp in config.xml
+ static final int POWER_VOLUME_UP_BEHAVIOR_NOTHING = 0;
+ static final int POWER_VOLUME_UP_BEHAVIOR_MUTE = 1;
+ static final int POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS = 2;
+
// must match: config_doublePressOnPowerBehavior in config.xml
static final int MULTI_PRESS_POWER_NOTHING = 0;
static final int MULTI_PRESS_POWER_THEATER_MODE = 1;
@@ -405,6 +410,7 @@
private boolean mEnableCarDockHomeCapture = true;
boolean mBootMessageNeedsHiding;
+ volatile boolean mBootAnimationDismissable;
private KeyguardServiceDelegate mKeyguardDelegate;
private boolean mKeyguardBound;
final Runnable mWindowManagerDrawCallback = new Runnable() {
@@ -488,6 +494,7 @@
int mLongPressOnBackBehavior;
int mShortPressOnSleepBehavior;
int mShortPressOnWindowBehavior;
+ int mPowerVolUpBehavior;
boolean mHasSoftInput = false;
boolean mHapticTextHandleEnabled;
boolean mUseTvRouting;
@@ -728,6 +735,9 @@
Settings.Global.POWER_BUTTON_VERY_LONG_PRESS), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.KEY_CHORD_POWER_VOLUME_UP), false, this,
+ UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE), false, this,
UserHandle.USER_ALL);
updateSettings();
@@ -1267,6 +1277,10 @@
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
+ private void cancelGlobalActionsAction() {
+ mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
+ }
+
boolean isDeviceProvisioned() {
return Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0;
@@ -1835,20 +1849,48 @@
}
});
+ // Volume up + power can either be the "ringer toggle chord" or as another way to
+ // launch GlobalActions. This behavior can change at runtime so we must check behavior
+ // inside the TwoKeysCombinationRule.
mKeyCombinationManager.addRule(
new TwoKeysCombinationRule(KEYCODE_VOLUME_UP, KEYCODE_POWER) {
@Override
boolean preCondition() {
- return mRingerToggleChord != VOLUME_HUSH_OFF;
+ switch (mPowerVolUpBehavior) {
+ case POWER_VOLUME_UP_BEHAVIOR_MUTE:
+ return mRingerToggleChord != VOLUME_HUSH_OFF;
+ default:
+ return true;
+ }
}
@Override
void execute() {
- mPowerKeyHandled = true;
- interceptRingerToggleChord();
+ switch (mPowerVolUpBehavior) {
+ case POWER_VOLUME_UP_BEHAVIOR_MUTE:
+ // no haptic feedback here since
+ interceptRingerToggleChord();
+ mPowerKeyHandled = true;
+ break;
+ case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
+ performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
+ "Power + Volume Up - Global Actions");
+ showGlobalActions();
+ mPowerKeyHandled = true;
+ break;
+ default:
+ break;
+ }
}
@Override
void cancel() {
- cancelPendingRingerToggleChordAction();
+ switch (mPowerVolUpBehavior) {
+ case POWER_VOLUME_UP_BEHAVIOR_MUTE:
+ cancelPendingRingerToggleChordAction();
+ break;
+ case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
+ cancelGlobalActionsAction();
+ break;
+ }
}
});
@@ -2054,6 +2096,10 @@
Settings.Global.POWER_BUTTON_VERY_LONG_PRESS,
mContext.getResources().getInteger(
com.android.internal.R.integer.config_veryLongPressOnPowerBehavior));
+ mPowerVolUpBehavior = Settings.Global.getInt(resolver,
+ Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
+ mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_keyChordPowerVolumeUp));
}
if (updateRotation) {
updateRotation(true);
@@ -3408,8 +3454,12 @@
return interceptKeyBeforeQueueing(event, policyFlags);
}
+ // This could prevent some wrong state in multi-displays environment,
+ // the default display may turned off but interactive is true.
+ final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState());
+ final boolean interactiveAndOn = interactive && isDefaultDisplayOn;
if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
- handleKeyGesture(event, interactive);
+ handleKeyGesture(event, interactiveAndOn);
}
// Enable haptics if down and virtual key without multiple repetitions. If this is a hard
@@ -3556,8 +3606,6 @@
// Any activity on the power button stops the accessibility shortcut
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
- final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState());
- final boolean interactiveAndOn = interactive && isDefaultDisplayOn;
if (down) {
interceptPowerKeyDown(event, interactiveAndOn);
} else {
@@ -4305,6 +4353,7 @@
0 /* cookie */);
updateScreenOffSleepToken(false);
mDefaultDisplayPolicy.screenTurnedOn(screenOnListener);
+ mBootAnimationDismissable = false;
synchronized (mLock) {
if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {
@@ -4379,6 +4428,10 @@
}
Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */);
+ enableScreen(listener, true /* report */);
+ }
+
+ private void enableScreen(ScreenOnListener listener, boolean report) {
final boolean enableScreen;
final boolean awake = mDefaultDisplayPolicy.isAwake();
synchronized (mLock) {
@@ -4396,17 +4449,19 @@
}
}
- if (listener != null) {
- listener.onScreenOn();
- }
-
- for (int i = mScreenOnListeners.size() - 1; i >= 0; i--) {
- final ScreenOnListener screenOnListener = mScreenOnListeners.valueAt(i);
- if (screenOnListener != null) {
- screenOnListener.onScreenOn();
+ if (report) {
+ if (listener != null) {
+ listener.onScreenOn();
}
+
+ for (int i = mScreenOnListeners.size() - 1; i >= 0; i--) {
+ final ScreenOnListener screenOnListener = mScreenOnListeners.valueAt(i);
+ if (screenOnListener != null) {
+ screenOnListener.onScreenOn();
+ }
+ }
+ mScreenOnListeners.clear();
}
- mScreenOnListeners.clear();
if (enableScreen) {
try {
@@ -4614,13 +4669,28 @@
}
startedWakingUp(PowerManager.WAKE_REASON_UNKNOWN);
finishedWakingUp(PowerManager.WAKE_REASON_UNKNOWN);
- screenTurningOn(DEFAULT_DISPLAY, mDefaultDisplayPolicy.getScreenOnListener());
- screenTurnedOn(DEFAULT_DISPLAY);
+
+ int defaultDisplayState = mDisplayManager.getDisplay(DEFAULT_DISPLAY).getState();
+ boolean defaultDisplayOn = defaultDisplayState == Display.STATE_ON;
+ boolean defaultScreenTurningOn = mDefaultDisplayPolicy.getScreenOnListener() != null;
+ if (defaultDisplayOn || defaultScreenTurningOn) {
+ // Now that system is booted, wait for keyguard and windows to be drawn before
+ // updating the orientation listener, stopping the boot animation and enabling screen.
+ screenTurningOn(DEFAULT_DISPLAY, mDefaultDisplayPolicy.getScreenOnListener());
+ screenTurnedOn(DEFAULT_DISPLAY);
+ } else {
+ // We're not turning the screen on, so don't wait for keyguard to be drawn
+ // to dismiss the boot animation and finish booting
+ mBootAnimationDismissable = true;
+ enableScreen(null, false /* report */);
+ }
}
@Override
public boolean canDismissBootAnimation() {
- return mDefaultDisplayPolicy.isKeyguardDrawComplete();
+ // Allow to dismiss the boot animation if the keyguard has finished drawing,
+ // or mBootAnimationDismissable has been set
+ return mDefaultDisplayPolicy.isKeyguardDrawComplete() || mBootAnimationDismissable;
}
ProgressDialog mBootMsgDialog = null;
@@ -5205,6 +5275,9 @@
pw.print("mTriplePressOnPowerBehavior=");
pw.println(multiPressOnPowerBehaviorToString(mTriplePressOnPowerBehavior));
pw.print(prefix);
+ pw.print("mPowerVolUpBehavior=");
+ pw.println(powerVolumeUpBehaviorToString(mPowerVolUpBehavior));
+ pw.print(prefix);
pw.print("mShortPressOnSleepBehavior=");
pw.println(shortPressOnSleepBehaviorToString(mShortPressOnSleepBehavior));
pw.print(prefix);
@@ -5378,6 +5451,19 @@
}
}
+ private static String powerVolumeUpBehaviorToString(int behavior) {
+ switch (behavior) {
+ case POWER_VOLUME_UP_BEHAVIOR_NOTHING:
+ return "POWER_VOLUME_UP_BEHAVIOR_NOTHING";
+ case POWER_VOLUME_UP_BEHAVIOR_MUTE:
+ return "POWER_VOLUME_UP_BEHAVIOR_MUTE";
+ case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS:
+ return "POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS";
+ default:
+ return Integer.toString(behavior);
+ }
+ }
+
private static String multiPressOnPowerBehaviorToString(int behavior) {
switch (behavior) {
case MULTI_PRESS_POWER_NOTHING:
diff --git a/services/core/java/com/android/server/power/FaceDownDetector.java b/services/core/java/com/android/server/power/FaceDownDetector.java
index 676181d..474ce59 100644
--- a/services/core/java/com/android/server/power/FaceDownDetector.java
+++ b/services/core/java/com/android/server/power/FaceDownDetector.java
@@ -35,6 +35,7 @@
import android.provider.DeviceConfig;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import java.io.PrintWriter;
@@ -59,6 +60,8 @@
FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__USER_INTERACTION;
private static final int UNFLIP =
FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__UNFLIP;
+ private static final int UNKNOWN =
+ FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__UNKNOWN;
/**
* Used by the ExponentialMovingAverage accelerations, this determines how quickly the
@@ -130,7 +133,7 @@
/** Values we store for logging purposes. */
private long mLastFlipTime = 0L;
- public int mPreviousResultType = 0;
+ public int mPreviousResultType = UNKNOWN;
public long mPreviousResultTime = 0L;
private long mMillisSaved = 0L;
@@ -151,7 +154,8 @@
private final Handler mHandler;
private final Runnable mUserActivityRunnable;
- private final BroadcastReceiver mScreenReceiver;
+ @VisibleForTesting
+ final BroadcastReceiver mScreenReceiver;
private Context mContext;
@@ -203,6 +207,10 @@
logScreenOff();
}
} else {
+ if (mFaceDown && !mInteractive) {
+ mPreviousResultType = SCREEN_OFF_RESULT;
+ mPreviousResultTime = currentTime;
+ }
mSensorManager.unregisterListener(this);
mFaceDown = false;
mOnFlip.accept(false);
@@ -311,15 +319,13 @@
}
private void logScreenOff() {
- if (mPreviousResultType == SCREEN_OFF_RESULT) {
- final long currentTime = SystemClock.uptimeMillis();
- FrameworkStatsLog.write(FrameworkStatsLog.FACE_DOWN_REPORTED,
- mPreviousResultType,
- /* millis_since_flip= */ mPreviousResultTime - mLastFlipTime,
- mMillisSaved,
- /* millis_until_next_screen_on= */ currentTime - mPreviousResultTime);
- mPreviousResultType = -1;
- }
+ final long currentTime = SystemClock.uptimeMillis();
+ FrameworkStatsLog.write(FrameworkStatsLog.FACE_DOWN_REPORTED,
+ SCREEN_OFF_RESULT,
+ /* millis_since_flip= */ mPreviousResultTime - mLastFlipTime,
+ mMillisSaved,
+ /* millis_until_next_screen_on= */ currentTime - mPreviousResultTime);
+ mPreviousResultType = UNKNOWN;
}
private boolean isEnabled() {
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
new file mode 100644
index 0000000..fc7628c
--- /dev/null
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.power.hint;
+
+import android.app.ActivityManager;
+import android.app.IUidObserver;
+import android.content.Context;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.IHintManager;
+import android.os.IHintSession;
+import android.os.Process;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.Preconditions;
+import com.android.server.FgThread;
+import com.android.server.SystemService;
+import com.android.server.utils.Slogf;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+/** An hint service implementation that runs in System Server process. */
+public final class HintManagerService extends SystemService {
+ private static final String TAG = "HintManagerService";
+ private static final boolean DEBUG = false;
+ @VisibleForTesting final long mHintSessionPreferredRate;
+
+ @GuardedBy("mLock")
+ private final ArrayMap<Integer, ArrayMap<IBinder, AppHintSession>> mActiveSessions;
+
+ /** Lock to protect HAL handles and listen list. */
+ private final Object mLock = new Object();
+
+ @VisibleForTesting final UidObserver mUidObserver;
+
+ private final NativeWrapper mNativeWrapper;
+
+ @VisibleForTesting final IHintManager.Stub mService = new BinderService();
+
+ public HintManagerService(Context context) {
+ this(context, new Injector());
+ }
+
+ @VisibleForTesting
+ HintManagerService(Context context, Injector injector) {
+ super(context);
+ mActiveSessions = new ArrayMap<>();
+ mNativeWrapper = injector.createNativeWrapper();
+ mNativeWrapper.halInit();
+ mHintSessionPreferredRate = mNativeWrapper.halGetHintSessionPreferredRate();
+ mUidObserver = new UidObserver();
+ }
+
+ @VisibleForTesting
+ static class Injector {
+ NativeWrapper createNativeWrapper() {
+ return new NativeWrapper();
+ }
+ }
+
+ private boolean isHalSupported() {
+ return mHintSessionPreferredRate != -1;
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.PERFORMANCE_HINT_SERVICE, mService, /* allowIsolated= */ true);
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
+ systemReady();
+ }
+ }
+
+ private void systemReady() {
+ Slogf.v(TAG, "Initializing HintManager service...");
+ try {
+ ActivityManager.getService().registerUidObserver(mUidObserver,
+ ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
+ ActivityManager.PROCESS_STATE_UNKNOWN, null);
+ } catch (RemoteException e) {
+ // ignored; both services live in system_server
+ }
+
+ }
+
+ /**
+ * Wrapper around the static-native methods from native.
+ *
+ * This class exists to allow us to mock static native methods in our tests. If mocking static
+ * methods becomes easier than this in the future, we can delete this class.
+ */
+ @VisibleForTesting
+ public static class NativeWrapper {
+ private native void nativeInit();
+
+ private static native long nativeCreateHintSession(int tgid, int uid, int[] tids,
+ long durationNanos);
+
+ private static native void nativePauseHintSession(long halPtr);
+
+ private static native void nativeResumeHintSession(long halPtr);
+
+ private static native void nativeCloseHintSession(long halPtr);
+
+ private static native void nativeUpdateTargetWorkDuration(
+ long halPtr, long targetDurationNanos);
+
+ private static native void nativeReportActualWorkDuration(
+ long halPtr, long[] actualDurationNanos, long[] timeStampNanos);
+
+ private static native long nativeGetHintSessionPreferredRate();
+
+ /** Wrapper for HintManager.nativeInit */
+ public void halInit() {
+ nativeInit();
+ }
+
+ /** Wrapper for HintManager.nativeCreateHintSession */
+ public long halCreateHintSession(int tgid, int uid, int[] tids, long durationNanos) {
+ return nativeCreateHintSession(tgid, uid, tids, durationNanos);
+ }
+
+ /** Wrapper for HintManager.nativePauseHintSession */
+ public void halPauseHintSession(long halPtr) {
+ nativePauseHintSession(halPtr);
+ }
+
+ /** Wrapper for HintManager.nativeResumeHintSession */
+ public void halResumeHintSession(long halPtr) {
+ nativeResumeHintSession(halPtr);
+ }
+
+ /** Wrapper for HintManager.nativeCloseHintSession */
+ public void halCloseHintSession(long halPtr) {
+ nativeCloseHintSession(halPtr);
+ }
+
+ /** Wrapper for HintManager.nativeUpdateTargetWorkDuration */
+ public void halUpdateTargetWorkDuration(long halPtr, long targetDurationNanos) {
+ nativeUpdateTargetWorkDuration(halPtr, targetDurationNanos);
+ }
+
+ /** Wrapper for HintManager.nativeReportActualWorkDuration */
+ public void halReportActualWorkDuration(
+ long halPtr, long[] actualDurationNanos, long[] timeStampNanos) {
+ nativeReportActualWorkDuration(halPtr, actualDurationNanos,
+ timeStampNanos);
+ }
+
+ /** Wrapper for HintManager.nativeGetHintSessionPreferredRate */
+ public long halGetHintSessionPreferredRate() {
+ return nativeGetHintSessionPreferredRate();
+ }
+ }
+
+ @VisibleForTesting
+ final class UidObserver extends IUidObserver.Stub {
+ private final SparseArray<Integer> mProcStatesCache = new SparseArray<>();
+
+ public boolean isUidForeground(int uid) {
+ synchronized (mLock) {
+ return mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
+ <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ }
+ }
+
+ @Override
+ public void onUidGone(int uid, boolean disabled) {
+ FgThread.getHandler().post(() -> {
+ synchronized (mLock) {
+ ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(uid);
+ if (tokenMap == null) {
+ return;
+ }
+ for (int i = tokenMap.size() - 1; i >= 0; i--) {
+ // Will remove the session from tokenMap
+ tokenMap.valueAt(i).close();
+ }
+ mProcStatesCache.delete(uid);
+ }
+ });
+ }
+
+ @Override
+ public void onUidActive(int uid) {
+ }
+
+ @Override
+ public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ /**
+ * The IUidObserver callback is called from the system_server, so it'll be a direct function
+ * call from ActivityManagerService. Do not do heavy logic here.
+ */
+ @Override
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
+ FgThread.getHandler().post(() -> {
+ synchronized (mLock) {
+ mProcStatesCache.put(uid, procState);
+ ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(uid);
+ if (tokenMap == null) {
+ return;
+ }
+ for (AppHintSession s : tokenMap.values()) {
+ s.onProcStateChanged();
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onUidCachedChanged(int uid, boolean cached) {
+ }
+ }
+
+ @VisibleForTesting
+ IHintManager.Stub getBinderServiceInstance() {
+ return mService;
+ }
+
+ private boolean checkTidValid(int tgid, int [] tids) {
+ // Make sure all tids belongs to the same process.
+ for (int threadId : tids) {
+ if (!Process.isThreadInProcess(tgid, threadId)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @VisibleForTesting
+ final class BinderService extends IHintManager.Stub {
+ @Override
+ public IHintSession createHintSession(IBinder token, int[] tids, long durationNanos) {
+ if (!isHalSupported()) return null;
+
+ java.util.Objects.requireNonNull(token);
+ java.util.Objects.requireNonNull(tids);
+ Preconditions.checkArgument(tids.length != 0, "tids should"
+ + " not be empty.");
+
+ int uid = Binder.getCallingUid();
+ int tid = Binder.getCallingPid();
+ int pid = Process.getThreadGroupLeader(tid);
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!checkTidValid(pid, tids)) {
+ throw new SecurityException("Some tid doesn't belong to the process");
+ }
+
+ long halSessionPtr = mNativeWrapper.halCreateHintSession(pid, uid, tids,
+ durationNanos);
+ if (halSessionPtr == 0) return null;
+
+ AppHintSession hs = new AppHintSession(uid, pid, tids, token,
+ halSessionPtr, durationNanos);
+ synchronized (mLock) {
+ ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(uid);
+ if (tokenMap == null) {
+ tokenMap = new ArrayMap<>(1);
+ mActiveSessions.put(uid, tokenMap);
+ }
+ tokenMap.put(token, hs);
+ return hs;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public long getHintSessionPreferredRate() {
+ return mHintSessionPreferredRate;
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) {
+ return;
+ }
+ synchronized (mLock) {
+ pw.println("HintSessionPreferredRate: " + mHintSessionPreferredRate);
+ pw.println("HAL Support: " + isHalSupported());
+ pw.println("Active Sessions:");
+ for (int i = 0; i < mActiveSessions.size(); i++) {
+ pw.println("Uid " + mActiveSessions.keyAt(i).toString() + ":");
+ ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.valueAt(i);
+ for (int j = 0; j < tokenMap.size(); j++) {
+ pw.println(" Session " + j + ":");
+ tokenMap.valueAt(j).dump(pw, " ");
+ }
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ final class AppHintSession extends IHintSession.Stub implements IBinder.DeathRecipient {
+ protected final int mUid;
+ protected final int mPid;
+ protected final int[] mThreadIds;
+ protected final IBinder mToken;
+ protected long mHalSessionPtr;
+ protected long mTargetDurationNanos;
+ protected boolean mUpdateAllowed;
+
+ protected AppHintSession(
+ int uid, int pid, int[] threadIds, IBinder token,
+ long halSessionPtr, long durationNanos) {
+ mUid = uid;
+ mPid = pid;
+ mToken = token;
+ mThreadIds = threadIds;
+ mHalSessionPtr = halSessionPtr;
+ mTargetDurationNanos = durationNanos;
+ mUpdateAllowed = true;
+ updateHintAllowed();
+ try {
+ token.linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ mNativeWrapper.halCloseHintSession(mHalSessionPtr);
+ throw new IllegalStateException("Client already dead", e);
+ }
+ }
+
+ @VisibleForTesting
+ boolean updateHintAllowed() {
+ synchronized (mLock) {
+ final boolean allowed = mUidObserver.isUidForeground(mUid);
+ if (allowed && !mUpdateAllowed) resume();
+ if (!allowed && mUpdateAllowed) pause();
+ mUpdateAllowed = allowed;
+ return mUpdateAllowed;
+ }
+ }
+
+ @Override
+ public void updateTargetWorkDuration(long targetDurationNanos) {
+ synchronized (mLock) {
+ if (mHalSessionPtr == 0 || !updateHintAllowed()) {
+ return;
+ }
+ Preconditions.checkArgument(targetDurationNanos > 0, "Expected"
+ + " the target duration to be greater than 0.");
+ mNativeWrapper.halUpdateTargetWorkDuration(mHalSessionPtr, targetDurationNanos);
+ mTargetDurationNanos = targetDurationNanos;
+ }
+ }
+
+ @Override
+ public void reportActualWorkDuration(long[] actualDurationNanos, long[] timeStampNanos) {
+ synchronized (mLock) {
+ if (mHalSessionPtr == 0 || !updateHintAllowed()) {
+ return;
+ }
+ Preconditions.checkArgument(actualDurationNanos.length != 0, "the count"
+ + " of hint durations shouldn't be 0.");
+ Preconditions.checkArgument(actualDurationNanos.length == timeStampNanos.length,
+ "The length of durations and timestamps should be the same.");
+ for (int i = 0; i < actualDurationNanos.length; i++) {
+ if (actualDurationNanos[i] <= 0) {
+ throw new IllegalArgumentException(
+ String.format("durations[%d]=%d should be greater than 0",
+ i, actualDurationNanos[i]));
+ }
+ }
+ mNativeWrapper.halReportActualWorkDuration(mHalSessionPtr, actualDurationNanos,
+ timeStampNanos);
+ }
+ }
+
+ /** TODO: consider monitor session threads and close session if any thread is dead. */
+ @Override
+ public void close() {
+ synchronized (mLock) {
+ if (mHalSessionPtr == 0) return;
+ mNativeWrapper.halCloseHintSession(mHalSessionPtr);
+ mHalSessionPtr = 0;
+ mToken.unlinkToDeath(this, 0);
+ ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(mUid);
+ if (tokenMap == null) {
+ Slogf.w(TAG, "UID %d is note present in active session map", mUid);
+ }
+ tokenMap.remove(mToken);
+ if (tokenMap.isEmpty()) mActiveSessions.remove(mUid);
+ }
+ }
+
+ private void onProcStateChanged() {
+ updateHintAllowed();
+ }
+
+ private void pause() {
+ synchronized (mLock) {
+ if (mHalSessionPtr == 0) return;
+ mNativeWrapper.halPauseHintSession(mHalSessionPtr);
+ }
+ }
+
+ private void resume() {
+ synchronized (mLock) {
+ if (mHalSessionPtr == 0) return;
+ mNativeWrapper.halResumeHintSession(mHalSessionPtr);
+ }
+ }
+
+ private void dump(PrintWriter pw, String prefix) {
+ synchronized (mLock) {
+ pw.println(prefix + "SessionPID: " + mPid);
+ pw.println(prefix + "SessionUID: " + mUid);
+ pw.println(prefix + "SessionTIDs: " + Arrays.toString(mThreadIds));
+ pw.println(prefix + "SessionTargetDurationNanos: " + mTargetDurationNanos);
+ pw.println(prefix + "SessionAllowed: " + updateHintAllowed());
+ }
+ }
+
+ @Override
+ public void binderDied() {
+ close();
+ }
+
+ }
+}
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index fe21201..6ea030f 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -16,6 +16,13 @@
package com.android.server.recoverysystem;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_NONE;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED;
+import static android.os.RecoverySystem.ResumeOnRebootRebootErrorCode;
import static android.os.UserHandle.USER_SYSTEM;
import android.annotation.IntDef;
@@ -148,24 +155,6 @@
private @interface ResumeOnRebootActionsOnClear {}
/**
- * The error codes for reboots initiated by resume on reboot clients.
- */
- private static final int REBOOT_ERROR_NONE = 0;
- private static final int REBOOT_ERROR_UNKNOWN = 1;
- private static final int REBOOT_ERROR_INVALID_PACKAGE_NAME = 2;
- private static final int REBOOT_ERROR_LSKF_NOT_CAPTURED = 3;
- private static final int REBOOT_ERROR_SLOT_MISMATCH = 4;
- private static final int REBOOT_ERROR_ARM_REBOOT_ESCROW_FAILURE = 5;
-
- @IntDef({ REBOOT_ERROR_NONE,
- REBOOT_ERROR_UNKNOWN,
- REBOOT_ERROR_INVALID_PACKAGE_NAME,
- REBOOT_ERROR_LSKF_NOT_CAPTURED,
- REBOOT_ERROR_SLOT_MISMATCH,
- REBOOT_ERROR_ARM_REBOOT_ESCROW_FAILURE})
- private @interface ResumeOnRebootRebootErrorCode {}
-
- /**
* Manages shared preference, i.e. the storage used for metrics reporting.
*/
public static class PreferencesManager {
@@ -724,14 +713,14 @@
boolean slotSwitch) {
if (packageName == null) {
Slog.w(TAG, "Missing packageName when rebooting with lskf.");
- return REBOOT_ERROR_INVALID_PACKAGE_NAME;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME;
}
if (!isLskfCaptured(packageName)) {
- return REBOOT_ERROR_LSKF_NOT_CAPTURED;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED;
}
if (!verifySlotForNextBoot(slotSwitch)) {
- return REBOOT_ERROR_SLOT_MISMATCH;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH;
}
final long origId = Binder.clearCallingIdentity();
@@ -744,10 +733,10 @@
if (!result) {
Slog.w(TAG, "Failure to escrow key for reboot");
- return REBOOT_ERROR_ARM_REBOOT_ESCROW_FAILURE;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE;
}
- return REBOOT_ERROR_NONE;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_NONE;
}
private boolean useServerBasedRoR() {
@@ -788,12 +777,13 @@
requestCount, slotSwitch, serverBased, durationSeconds, lskfCapturedCount);
}
- private boolean rebootWithLskfImpl(String packageName, String reason, boolean slotSwitch) {
+ private @ResumeOnRebootRebootErrorCode int rebootWithLskfImpl(String packageName, String reason,
+ boolean slotSwitch) {
@ResumeOnRebootRebootErrorCode int errorCode = armRebootEscrow(packageName, slotSwitch);
reportMetricsOnRebootWithLskf(packageName, slotSwitch, errorCode);
- if (errorCode != REBOOT_ERROR_NONE) {
- return false;
+ if (errorCode != RESUME_ON_REBOOT_REBOOT_ERROR_NONE) {
+ return errorCode;
}
// Clear the metrics prefs after a successful RoR reboot.
@@ -801,17 +791,19 @@
PowerManager pm = mInjector.getPowerManager();
pm.reboot(reason);
- return true;
+ return RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED;
}
@Override // Binder call for the legacy rebootWithLskf
- public boolean rebootWithLskfAssumeSlotSwitch(String packageName, String reason) {
+ public @ResumeOnRebootRebootErrorCode int rebootWithLskfAssumeSlotSwitch(String packageName,
+ String reason) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
return rebootWithLskfImpl(packageName, reason, true);
}
@Override // Binder call
- public boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch) {
+ public @ResumeOnRebootRebootErrorCode int rebootWithLskf(String packageName, String reason,
+ boolean slotSwitch) {
enforcePermissionForResumeOnReboot();
return rebootWithLskfImpl(packageName, reason, slotSwitch);
}
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
index ae71c1a..3d78828 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
@@ -17,6 +17,7 @@
package com.android.server.recoverysystem;
import android.os.IRecoverySystem;
+import android.os.RecoverySystem;
import android.os.RemoteException;
import android.os.ShellCommand;
@@ -76,7 +77,8 @@
private int rebootAndApply() throws RemoteException {
String packageName = getNextArgRequired();
String rebootReason = getNextArgRequired();
- boolean success = mService.rebootWithLskf(packageName, rebootReason, false);
+ boolean success = (mService.rebootWithLskf(packageName, rebootReason, false)
+ == RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_NONE);
PrintWriter pw = getOutPrintWriter();
// Keep the old message for cts test.
pw.printf("%s Reboot and apply status: %s\n", packageName,
diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java
index c029bf5..a749d18 100644
--- a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java
+++ b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java
@@ -153,8 +153,8 @@
@Override
public void resolveRotation(
- @NonNull RotationResolverCallbackInternal callbackInternal, int proposedRotation,
- int currentRotation, long timeout,
+ @NonNull RotationResolverCallbackInternal callbackInternal, String packageName,
+ int proposedRotation, int currentRotation, long timeout,
@NonNull CancellationSignal cancellationSignalInternal) {
Objects.requireNonNull(callbackInternal);
Objects.requireNonNull(cancellationSignalInternal);
@@ -165,8 +165,16 @@
final RotationResolverManagerPerUserService service =
getServiceForUserLocked(
UserHandle.getCallingUserId());
- final RotationResolutionRequest request = new RotationResolutionRequest("",
- currentRotation, proposedRotation, true, timeout);
+ final RotationResolutionRequest request;
+ if (packageName == null) {
+ request = new RotationResolutionRequest(/* packageName */ "",
+ currentRotation, proposedRotation, /* shouldUseCamera */ true,
+ timeout);
+ } else {
+ request = new RotationResolutionRequest(packageName, currentRotation,
+ proposedRotation, /* shouldUseCamera */ true, timeout);
+ }
+
service.resolveRotationLocked(callbackInternal, request,
cancellationSignalInternal);
} else {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index 970420a..a436e6b 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -18,6 +18,7 @@
import android.annotation.Nullable;
import android.app.ITransientNotificationCallback;
+import android.hardware.fingerprint.IUdfpsHbmListener;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
@@ -166,4 +167,11 @@
* boolean)
*/
void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable);
+
+ /**
+ * Sets the system-wide listener for UDFPS HBM status changes.
+ *
+ * @see com.android.internal.statusbar.IStatusBar#setUdfpsHbmListener(IUdfpsHbmListener)
+ */
+ void setUdfpsHbmListener(IUdfpsHbmListener listener);
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index c4f5575..e37edeb 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -107,15 +107,15 @@
private final Context mContext;
- private Handler mHandler = new Handler();
+ private final Handler mHandler = new Handler();
private NotificationDelegate mNotificationDelegate;
private volatile IStatusBar mBar;
- private ArrayMap<String, StatusBarIcon> mIcons = new ArrayMap<>();
+ private final ArrayMap<String, StatusBarIcon> mIcons = new ArrayMap<>();
// for disabling the status bar
private final ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
private GlobalActionsProvider.GlobalActionsListener mGlobalActionListener;
- private IBinder mSysUiVisToken = new Binder();
+ private final IBinder mSysUiVisToken = new Binder();
private final Object mLock = new Object();
private final DeathRecipient mDeathRecipient = new DeathRecipient();
@@ -123,7 +123,9 @@
private int mCurrentUserId;
private boolean mTracingEnabled;
- private SparseArray<UiState> mDisplayUiState = new SparseArray<>();
+ private final SparseArray<UiState> mDisplayUiState = new SparseArray<>();
+ @GuardedBy("mLock")
+ private IUdfpsHbmListener mUdfpsHbmListener;
private class DeathRecipient implements IBinder.DeathRecipient {
public void binderDied() {
@@ -598,6 +600,18 @@
} catch (RemoteException ex) { }
}
}
+
+ @Override
+ public void setUdfpsHbmListener(IUdfpsHbmListener listener) {
+ synchronized (mLock) {
+ mUdfpsHbmListener = listener;
+ }
+ if (mBar != null) {
+ try {
+ mBar.setUdfpsHbmListener(listener);
+ } catch (RemoteException ex) { }
+ }
+ }
};
private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {
@@ -1204,6 +1218,14 @@
if (mGlobalActionListener == null) return;
mGlobalActionListener.onGlobalActionsAvailableChanged(mBar != null);
});
+ // If StatusBarService dies, system_server doesn't get killed with it, so we need to make
+ // sure the UDFPS listener is refreshed as well. Deferring to the handler just so to avoid
+ // making registerStatusBar re-entrant.
+ mHandler.post(() -> {
+ synchronized (mLock) {
+ setUdfpsHbmListener(mUdfpsHbmListener);
+ }
+ });
}
/**
diff --git a/services/core/java/com/android/server/utils/ManagedApplicationService.java b/services/core/java/com/android/server/utils/ManagedApplicationService.java
index c103e0e..4cf0e32 100644
--- a/services/core/java/com/android/server/utils/ManagedApplicationService.java
+++ b/services/core/java/com/android/server/utils/ManagedApplicationService.java
@@ -304,7 +304,8 @@
}
if (mSettingsAction != null) {
intent.putExtra(Intent.EXTRA_CLIENT_INTENT,
- PendingIntent.getActivity(mContext, 0, new Intent(mSettingsAction), PendingIntent.FLAG_MUTABLE_UNAUDITED));
+ PendingIntent.getActivity(mContext, 0, new Intent(mSettingsAction),
+ PendingIntent.FLAG_IMMUTABLE));
}
mConnection = new ServiceConnection() {
diff --git a/services/core/java/com/android/server/utils/Watchable.java b/services/core/java/com/android/server/utils/Watchable.java
index 44a7459..8fd44de 100644
--- a/services/core/java/com/android/server/utils/Watchable.java
+++ b/services/core/java/com/android/server/utils/Watchable.java
@@ -73,7 +73,8 @@
return;
}
for (Field f : base.getClass().getDeclaredFields()) {
- if (f.getAnnotation(Watched.class) != null) {
+ final Watched annotation = f.getAnnotation(Watched.class);
+ if (annotation != null) {
final String fn = base.getClass().getName() + "." + f.getName();
try {
f.setAccessible(true);
@@ -81,27 +82,29 @@
if (o instanceof Watchable) {
Watchable attr = (Watchable) (o);
if (attr != null && !attr.isRegisteredObserver(observer)) {
- if (logOnly) {
- Log.e("Watchable", fn + " missing an observer");
- } else {
- throw new RuntimeException("Watchable " + fn
- + " missing an observer");
- }
+ handleVerifyError("Watchable " + fn + " missing an observer", logOnly);
}
+ } else if (!annotation.manual()) {
+ handleVerifyError("@Watched annotated field " + fn + " is not a watchable"
+ + " type and is not flagged for manual watching.", logOnly);
}
} catch (IllegalAccessException e) {
// The field is protected; ignore it. Other exceptions that may be thrown by
// Field.get() are allowed to roll up.
- if (logOnly) {
- Log.e("Watchable", fn + " not visible");
- } else {
- throw new RuntimeException("Watchable " + fn + " not visible");
- }
+ handleVerifyError("Watchable " + fn + " not visible", logOnly);
}
}
}
}
+ static void handleVerifyError(String errorMessage, boolean logOnly) {
+ if (logOnly) {
+ Log.e("Watchable", errorMessage);
+ } else {
+ throw new RuntimeException(errorMessage);
+ }
+ }
+
/**
* Verify that all @Watched {@link Watchable} attributes are being watched by this
* class. This calls verifyWatchedAttributes() with logOnly set to false.
diff --git a/services/core/java/com/android/server/utils/Watched.java b/services/core/java/com/android/server/utils/Watched.java
index 4340d01..a93447e 100644
--- a/services/core/java/com/android/server/utils/Watched.java
+++ b/services/core/java/com/android/server/utils/Watched.java
@@ -29,4 +29,6 @@
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Watched {
+ /** true if the annotated field is manually tracked */
+ boolean manual() default false;
}
diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
index 83ac36f..1d55ba4 100644
--- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
+++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
@@ -23,6 +23,7 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_CONFIG_ERROR;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_INTERNAL_ERROR;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_NETWORK_ERROR;
@@ -57,7 +58,6 @@
import android.net.ipsec.ike.IkeSessionCallback;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.exceptions.AuthenticationFailedException;
import android.net.ipsec.ike.exceptions.IkeException;
import android.net.ipsec.ike.exceptions.IkeInternalException;
import android.net.ipsec.ike.exceptions.IkeProtocolException;
@@ -1051,12 +1051,21 @@
sessionLostWithoutCallback(token, exception);
}
+ private static boolean isIkeAuthFailure(@NonNull Exception exception) {
+ if (!(exception instanceof IkeProtocolException)) {
+ return false;
+ }
+
+ return ((IkeProtocolException) exception).getErrorType()
+ == ERROR_TYPE_AUTHENTICATION_FAILED;
+ }
+
private void notifyStatusCallbackForSessionClosed(@NonNull Exception exception) {
final int errorCode;
final String exceptionClass;
final String exceptionMessage;
- if (exception instanceof AuthenticationFailedException) {
+ if (isIkeAuthFailure(exception)) {
errorCode = VCN_ERROR_CODE_CONFIG_ERROR;
exceptionClass = exception.getClass().getName();
exceptionMessage = exception.getMessage();
diff --git a/services/core/java/com/android/server/vibrator/InputDeviceDelegate.java b/services/core/java/com/android/server/vibrator/InputDeviceDelegate.java
index 96f84dc..21ba874 100644
--- a/services/core/java/com/android/server/vibrator/InputDeviceDelegate.java
+++ b/services/core/java/com/android/server/vibrator/InputDeviceDelegate.java
@@ -19,7 +19,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.input.InputManager;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.Handler;
import android.os.VibrationAttributes;
import android.os.VibratorManager;
@@ -94,7 +94,7 @@
*
* @return {@link #isAvailable()}
*/
- public boolean vibrateIfAvailable(int uid, String opPkg, CombinedVibrationEffect effect,
+ public boolean vibrateIfAvailable(int uid, String opPkg, CombinedVibration effect,
String reason, VibrationAttributes attrs) {
synchronized (mLock) {
for (int i = 0; i < mInputDeviceVibrators.size(); i++) {
diff --git a/services/core/java/com/android/server/vibrator/Vibration.java b/services/core/java/com/android/server/vibrator/Vibration.java
index cd84058..e447a23 100644
--- a/services/core/java/com/android/server/vibrator/Vibration.java
+++ b/services/core/java/com/android/server/vibrator/Vibration.java
@@ -17,7 +17,7 @@
package com.android.server.vibrator;
import android.annotation.Nullable;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.IBinder;
import android.os.SystemClock;
import android.os.VibrationAttributes;
@@ -72,14 +72,14 @@
/** The actual effect to be played. */
@Nullable
- private CombinedVibrationEffect mEffect;
+ private CombinedVibration mEffect;
/**
* The original effect that was requested. Typically these two things differ because the effect
* was scaled based on the users vibration intensity settings.
*/
@Nullable
- private CombinedVibrationEffect mOriginalEffect;
+ private CombinedVibration mOriginalEffect;
/**
* Start/end times in unix epoch time. Only to be used for debugging purposes and to correlate
@@ -90,7 +90,7 @@
private long mEndTimeDebug;
private Status mStatus;
- Vibration(IBinder token, int id, CombinedVibrationEffect effect,
+ Vibration(IBinder token, int id, CombinedVibration effect,
VibrationAttributes attrs, int uid, String opPkg, String reason) {
this.token = token;
this.mEffect = effect;
@@ -142,7 +142,7 @@
* effect added.
*/
public void updateEffects(Function<VibrationEffect, VibrationEffect> updateFn) {
- CombinedVibrationEffect newEffect = transformCombinedEffect(mEffect, updateFn);
+ CombinedVibration newEffect = transformCombinedEffect(mEffect, updateFn);
if (!newEffect.equals(mEffect)) {
if (mOriginalEffect == null) {
mOriginalEffect = mEffect;
@@ -155,29 +155,29 @@
}
/**
- * Creates a new {@link CombinedVibrationEffect} by applying the given transformation function
+ * Creates a new {@link CombinedVibration} by applying the given transformation function
* to each {@link VibrationEffect}.
*/
- private static CombinedVibrationEffect transformCombinedEffect(
- CombinedVibrationEffect combinedEffect, Function<VibrationEffect, VibrationEffect> fn) {
- if (combinedEffect instanceof CombinedVibrationEffect.Mono) {
- VibrationEffect effect = ((CombinedVibrationEffect.Mono) combinedEffect).getEffect();
- return CombinedVibrationEffect.createSynced(fn.apply(effect));
- } else if (combinedEffect instanceof CombinedVibrationEffect.Stereo) {
+ private static CombinedVibration transformCombinedEffect(
+ CombinedVibration combinedEffect, Function<VibrationEffect, VibrationEffect> fn) {
+ if (combinedEffect instanceof CombinedVibration.Mono) {
+ VibrationEffect effect = ((CombinedVibration.Mono) combinedEffect).getEffect();
+ return CombinedVibration.createParallel(fn.apply(effect));
+ } else if (combinedEffect instanceof CombinedVibration.Stereo) {
SparseArray<VibrationEffect> effects =
- ((CombinedVibrationEffect.Stereo) combinedEffect).getEffects();
- CombinedVibrationEffect.SyncedCombination combination =
- CombinedVibrationEffect.startSynced();
+ ((CombinedVibration.Stereo) combinedEffect).getEffects();
+ CombinedVibration.ParallelCombination combination =
+ CombinedVibration.startParallel();
for (int i = 0; i < effects.size(); i++) {
combination.addVibrator(effects.keyAt(i), fn.apply(effects.valueAt(i)));
}
return combination.combine();
- } else if (combinedEffect instanceof CombinedVibrationEffect.Sequential) {
- List<CombinedVibrationEffect> effects =
- ((CombinedVibrationEffect.Sequential) combinedEffect).getEffects();
- CombinedVibrationEffect.SequentialCombination combination =
- CombinedVibrationEffect.startSequential();
- for (CombinedVibrationEffect effect : effects) {
+ } else if (combinedEffect instanceof CombinedVibration.Sequential) {
+ List<CombinedVibration> effects =
+ ((CombinedVibration.Sequential) combinedEffect).getEffects();
+ CombinedVibration.SequentialCombination combination =
+ CombinedVibration.startSequential();
+ for (CombinedVibration effect : effects) {
combination.addNext(transformCombinedEffect(effect, fn));
}
return combination.combine();
@@ -199,7 +199,7 @@
/** Return the effect that should be played by this vibration. */
@Nullable
- public CombinedVibrationEffect getEffect() {
+ public CombinedVibration getEffect() {
return mEffect;
}
@@ -214,8 +214,8 @@
static final class DebugInfo {
private final long mStartTimeDebug;
private final long mEndTimeDebug;
- private final CombinedVibrationEffect mEffect;
- private final CombinedVibrationEffect mOriginalEffect;
+ private final CombinedVibration mEffect;
+ private final CombinedVibration mOriginalEffect;
private final float mScale;
private final VibrationAttributes mAttrs;
private final int mUid;
@@ -223,8 +223,8 @@
private final String mReason;
private final Status mStatus;
- DebugInfo(long startTimeDebug, long endTimeDebug, CombinedVibrationEffect effect,
- CombinedVibrationEffect originalEffect, float scale, VibrationAttributes attrs,
+ DebugInfo(long startTimeDebug, long endTimeDebug, CombinedVibration effect,
+ CombinedVibration originalEffect, float scale, VibrationAttributes attrs,
int uid, String opPkg, String reason, Status status) {
mStartTimeDebug = startTimeDebug;
mEndTimeDebug = endTimeDebug;
@@ -289,24 +289,24 @@
}
private void dumpEffect(
- ProtoOutputStream proto, long fieldId, CombinedVibrationEffect effect) {
+ ProtoOutputStream proto, long fieldId, CombinedVibration effect) {
dumpEffect(proto, fieldId,
- (CombinedVibrationEffect.Sequential) CombinedVibrationEffect.startSequential()
+ (CombinedVibration.Sequential) CombinedVibration.startSequential()
.addNext(effect)
.combine());
}
private void dumpEffect(
- ProtoOutputStream proto, long fieldId, CombinedVibrationEffect.Sequential effect) {
+ ProtoOutputStream proto, long fieldId, CombinedVibration.Sequential effect) {
final long token = proto.start(fieldId);
for (int i = 0; i < effect.getEffects().size(); i++) {
- CombinedVibrationEffect nestedEffect = effect.getEffects().get(i);
- if (nestedEffect instanceof CombinedVibrationEffect.Mono) {
+ CombinedVibration nestedEffect = effect.getEffects().get(i);
+ if (nestedEffect instanceof CombinedVibration.Mono) {
dumpEffect(proto, CombinedVibrationEffectProto.EFFECTS,
- (CombinedVibrationEffect.Mono) nestedEffect);
- } else if (nestedEffect instanceof CombinedVibrationEffect.Stereo) {
+ (CombinedVibration.Mono) nestedEffect);
+ } else if (nestedEffect instanceof CombinedVibration.Stereo) {
dumpEffect(proto, CombinedVibrationEffectProto.EFFECTS,
- (CombinedVibrationEffect.Stereo) nestedEffect);
+ (CombinedVibration.Stereo) nestedEffect);
}
proto.write(CombinedVibrationEffectProto.DELAYS, effect.getDelays().get(i));
}
@@ -314,14 +314,14 @@
}
private void dumpEffect(
- ProtoOutputStream proto, long fieldId, CombinedVibrationEffect.Mono effect) {
+ ProtoOutputStream proto, long fieldId, CombinedVibration.Mono effect) {
final long token = proto.start(fieldId);
dumpEffect(proto, SyncVibrationEffectProto.EFFECTS, effect.getEffect());
proto.end(token);
}
private void dumpEffect(
- ProtoOutputStream proto, long fieldId, CombinedVibrationEffect.Stereo effect) {
+ ProtoOutputStream proto, long fieldId, CombinedVibration.Stereo effect) {
final long token = proto.start(fieldId);
for (int i = 0; i < effect.getEffects().size(); i++) {
proto.write(SyncVibrationEffectProto.VIBRATOR_IDS, effect.getEffects().keyAt(i));
diff --git a/services/core/java/com/android/server/vibrator/VibrationThread.java b/services/core/java/com/android/server/vibrator/VibrationThread.java
index df85e26..bc61478 100644
--- a/services/core/java/com/android/server/vibrator/VibrationThread.java
+++ b/services/core/java/com/android/server/vibrator/VibrationThread.java
@@ -19,7 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.vibrator.IVibratorManager;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.Process;
@@ -112,7 +112,7 @@
mWakeLock.setWorkSource(mWorkSource);
mBatteryStatsService = batteryStatsService;
- CombinedVibrationEffect effect = vib.getEffect();
+ CombinedVibration effect = vib.getEffect();
for (int i = 0; i < availableVibrators.size(); i++) {
if (effect.hasVibrator(availableVibrators.keyAt(i))) {
mVibrators.put(availableVibrators.keyAt(i), availableVibrators.valueAt(i));
@@ -191,7 +191,7 @@
private Vibration.Status playVibration() {
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playVibration");
try {
- CombinedVibrationEffect.Sequential effect = toSequential(mVibration.getEffect());
+ CombinedVibration.Sequential effect = toSequential(mVibration.getEffect());
int stepsPlayed = 0;
synchronized (mLock) {
@@ -255,9 +255,6 @@
@Nullable
private SingleVibratorStep nextVibrateStep(long startTime, VibratorController controller,
VibrationEffect.Composed effect, int segmentIndex, long vibratorOffTimeout) {
- // Some steps should only start after the vibrator has finished the previous vibration, so
- // make sure we take the latest between both timings.
- long latestStartTime = Math.max(startTime, vibratorOffTimeout);
if (segmentIndex >= effect.getSegments().size()) {
segmentIndex = effect.getRepeatIndex();
}
@@ -272,25 +269,24 @@
VibrationEffectSegment segment = effect.getSegments().get(segmentIndex);
if (segment instanceof PrebakedSegment) {
- return new PerformStep(latestStartTime, controller, effect, segmentIndex,
- vibratorOffTimeout);
+ return new PerformStep(startTime, controller, effect, segmentIndex, vibratorOffTimeout);
}
if (segment instanceof PrimitiveSegment) {
- return new ComposePrimitivesStep(latestStartTime, controller, effect, segmentIndex,
+ return new ComposePrimitivesStep(startTime, controller, effect, segmentIndex,
vibratorOffTimeout);
}
if (segment instanceof RampSegment) {
- return new ComposePwleStep(latestStartTime, controller, effect, segmentIndex,
+ return new ComposePwleStep(startTime, controller, effect, segmentIndex,
vibratorOffTimeout);
}
return new AmplitudeStep(startTime, controller, effect, segmentIndex, vibratorOffTimeout);
}
- private static CombinedVibrationEffect.Sequential toSequential(CombinedVibrationEffect effect) {
- if (effect instanceof CombinedVibrationEffect.Sequential) {
- return (CombinedVibrationEffect.Sequential) effect;
+ private static CombinedVibration.Sequential toSequential(CombinedVibration effect) {
+ if (effect instanceof CombinedVibration.Sequential) {
+ return (CombinedVibration.Sequential) effect;
}
- return (CombinedVibrationEffect.Sequential) CombinedVibrationEffect.startSequential()
+ return (CombinedVibration.Sequential) CombinedVibration.startSequential()
.addNext(effect)
.combine();
}
@@ -419,14 +415,14 @@
* sequential effect isn't finished yet.
*/
private final class StartVibrateStep extends Step {
- public final CombinedVibrationEffect.Sequential sequentialEffect;
+ public final CombinedVibration.Sequential sequentialEffect;
public final int currentIndex;
- StartVibrateStep(CombinedVibrationEffect.Sequential effect) {
+ StartVibrateStep(CombinedVibration.Sequential effect) {
this(SystemClock.uptimeMillis() + effect.getDelays().get(0), effect, /* index= */ 0);
}
- StartVibrateStep(long startTime, CombinedVibrationEffect.Sequential effect, int index) {
+ StartVibrateStep(long startTime, CombinedVibration.Sequential effect, int index) {
super(startTime);
sequentialEffect = effect;
currentIndex = index;
@@ -441,7 +437,7 @@
if (DEBUG) {
Slog.d(TAG, "StartVibrateStep for effect #" + currentIndex);
}
- CombinedVibrationEffect effect = sequentialEffect.getEffects().get(currentIndex);
+ CombinedVibration effect = sequentialEffect.getEffects().get(currentIndex);
DeviceEffectMap effectMapping = createEffectToVibratorMapping(effect);
if (effectMapping == null) {
// Unable to map effects to vibrators, ignore this step.
@@ -485,12 +481,12 @@
/** Create a mapping of individual {@link VibrationEffect} to available vibrators. */
@Nullable
private DeviceEffectMap createEffectToVibratorMapping(
- CombinedVibrationEffect effect) {
- if (effect instanceof CombinedVibrationEffect.Mono) {
- return new DeviceEffectMap((CombinedVibrationEffect.Mono) effect);
+ CombinedVibration effect) {
+ if (effect instanceof CombinedVibration.Mono) {
+ return new DeviceEffectMap((CombinedVibration.Mono) effect);
}
- if (effect instanceof CombinedVibrationEffect.Stereo) {
- return new DeviceEffectMap((CombinedVibrationEffect.Stereo) effect);
+ if (effect instanceof CombinedVibration.Stereo) {
+ return new DeviceEffectMap((CombinedVibration.Stereo) effect);
}
return null;
}
@@ -498,11 +494,11 @@
/**
* Starts playing effects on designated vibrators, in sync.
*
- * @param effectMapping The {@link CombinedVibrationEffect} mapped to this device vibrators
+ * @param effectMapping The {@link CombinedVibration} mapped to this device vibrators
* @param nextSteps An output list to accumulate the future {@link Step Steps} created
* by this method, typically one for each vibrator that has
* successfully started vibrating on this step.
- * @return The duration, in millis, of the {@link CombinedVibrationEffect}. Repeating
+ * @return The duration, in millis, of the {@link CombinedVibration}. Repeating
* waveforms return {@link Long#MAX_VALUE}. Zero or negative values indicate the vibrators
* have ignored all effects.
*/
@@ -572,7 +568,7 @@
private long startVibrating(SingleVibratorStep step, List<Step> nextSteps) {
nextSteps.addAll(step.play());
- long stepDuration = step.getOnResult();
+ long stepDuration = step.getVibratorOnDuration();
if (stepDuration < 0) {
// Step failed, so return negative duration to propagate failure.
return stepDuration;
@@ -649,14 +645,13 @@
}
/**
- * Return the result a call to {@link VibratorController#on} method triggered by
- * {@link #play()}.
+ * Return the duration the vibrator was turned on when this step was played.
*
* @return A positive duration that the vibrator was turned on for by this step;
- * Zero if the segment is not supported or vibrator was never turned on;
- * A negative value if the vibrator call has failed.
+ * Zero if the segment is not supported, the step was not played yet or vibrator was never
+ * turned on by this step; A negative value if the vibrator call has failed.
*/
- public long getOnResult() {
+ public long getVibratorOnDuration() {
return mVibratorOnResult;
}
@@ -690,7 +685,7 @@
/**
* Return the {@link #nextVibrateStep} with same start and off timings calculated from
- * {@link #getOnResult()}, jumping all played segments.
+ * {@link #getVibratorOnDuration()}, jumping all played segments.
*
* <p>This method has same behavior as {@link #skipToNextSteps(int)} when the vibrator
* result is non-positive, meaning the vibrator has either ignored or failed to turn on.
@@ -730,7 +725,10 @@
PerformStep(long startTime, VibratorController controller,
VibrationEffect.Composed effect, int index, long vibratorOffTimeout) {
- super(startTime, controller, effect, index, vibratorOffTimeout);
+ // This step should wait for the last vibration to finish (with the timeout) and for the
+ // intended step start time (to respect the effect delays).
+ super(Math.max(startTime, vibratorOffTimeout), controller, effect, index,
+ vibratorOffTimeout);
}
@Override
@@ -765,7 +763,7 @@
List<Step> fallbackResult = fallbackStep.play();
// Update the result with the fallback result so this step is seamlessly
// replaced by the fallback to any outer application of this.
- mVibratorOnResult = fallbackStep.getOnResult();
+ mVibratorOnResult = fallbackStep.getVibratorOnDuration();
return fallbackResult;
}
@@ -802,7 +800,10 @@
ComposePrimitivesStep(long startTime, VibratorController controller,
VibrationEffect.Composed effect, int index, long vibratorOffTimeout) {
- super(startTime, controller, effect, index, vibratorOffTimeout);
+ // This step should wait for the last vibration to finish (with the timeout) and for the
+ // intended step start time (to respect the effect delays).
+ super(Math.max(startTime, vibratorOffTimeout), controller, effect, index,
+ vibratorOffTimeout);
}
@Override
@@ -851,7 +852,10 @@
ComposePwleStep(long startTime, VibratorController controller,
VibrationEffect.Composed effect, int index, long vibratorOffTimeout) {
- super(startTime, controller, effect, index, vibratorOffTimeout);
+ // This step should wait for the last vibration to finish (with the timeout) and for the
+ // intended step start time (to respect the effect delays).
+ super(Math.max(startTime, vibratorOffTimeout), controller, effect, index,
+ vibratorOffTimeout);
}
@Override
@@ -924,6 +928,7 @@
AmplitudeStep(long startTime, VibratorController controller,
VibrationEffect.Composed effect, int index, long vibratorOffTimeout) {
+ // This step has a fixed startTime coming from the timings of the waveform it's playing.
super(startTime, controller, effect, index, vibratorOffTimeout);
mNextOffTime = vibratorOffTimeout;
}
@@ -1036,7 +1041,7 @@
}
/**
- * Map a {@link CombinedVibrationEffect} to the vibrators available on the device.
+ * Map a {@link CombinedVibration} to the vibrators available on the device.
*
* <p>This contains the logic to find the capabilities required from {@link IVibratorManager} to
* play all of the effects in sync.
@@ -1046,7 +1051,7 @@
private final int[] mVibratorIds;
private final long mRequiredSyncCapabilities;
- DeviceEffectMap(CombinedVibrationEffect.Mono mono) {
+ DeviceEffectMap(CombinedVibration.Mono mono) {
mVibratorEffects = new SparseArray<>(mVibrators.size());
mVibratorIds = new int[mVibrators.size()];
for (int i = 0; i < mVibrators.size(); i++) {
@@ -1061,7 +1066,7 @@
mRequiredSyncCapabilities = calculateRequiredSyncCapabilities(mVibratorEffects);
}
- DeviceEffectMap(CombinedVibrationEffect.Stereo stereo) {
+ DeviceEffectMap(CombinedVibration.Stereo stereo) {
SparseArray<VibrationEffect> stereoEffects = stereo.getEffects();
mVibratorEffects = new SparseArray<>();
for (int i = 0; i < stereoEffects.size(); i++) {
@@ -1083,7 +1088,7 @@
}
/**
- * Return the number of vibrators mapped to play the {@link CombinedVibrationEffect} on this
+ * Return the number of vibrators mapped to play the {@link CombinedVibration} on this
* device.
*/
public int size() {
@@ -1091,7 +1096,7 @@
}
/**
- * Return all capabilities required to play the {@link CombinedVibrationEffect} in
+ * Return all capabilities required to play the {@link CombinedVibration} in
* between calls to {@link IVibratorManager#prepareSynced} and
* {@link IVibratorManager#triggerSynced}.
*/
@@ -1099,7 +1104,7 @@
return mRequiredSyncCapabilities;
}
- /** Return all vibrator ids mapped to play the {@link CombinedVibrationEffect}. */
+ /** Return all vibrator ids mapped to play the {@link CombinedVibration}. */
public int[] getVibratorIds() {
return mVibratorIds;
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index b1d6050..06a5077 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -29,7 +29,7 @@
import android.hardware.vibrator.IVibrator;
import android.os.BatteryStats;
import android.os.Binder;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.ExternalVibration;
import android.os.Handler;
import android.os.IBinder;
@@ -291,7 +291,7 @@
@Override // Binder call
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
- @Nullable CombinedVibrationEffect effect, @Nullable VibrationAttributes attrs) {
+ @Nullable CombinedVibration effect, @Nullable VibrationAttributes attrs) {
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "setAlwaysOnEffect");
try {
mContext.enforceCallingOrSelfPermission(
@@ -332,7 +332,7 @@
}
@Override // Binder call
- public void vibrate(int uid, String opPkg, @NonNull CombinedVibrationEffect effect,
+ public void vibrate(int uid, String opPkg, @NonNull CombinedVibration effect,
@Nullable VibrationAttributes attrs, String reason, IBinder token) {
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason = " + reason);
try {
@@ -383,7 +383,7 @@
}
@Override // Binder call
- public void cancelVibrate(IBinder token) {
+ public void cancelVibrate(int usageFilter, IBinder token) {
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "cancelVibrate");
try {
mContext.enforceCallingOrSelfPermission(
@@ -392,16 +392,24 @@
synchronized (mLock) {
if (DEBUG) {
- Slog.d(TAG, "Canceling vibration.");
+ Slog.d(TAG, "Canceling vibration");
}
final long ident = Binder.clearCallingIdentity();
try {
- mNextVibration = null;
+ if (mNextVibration != null
+ && shouldCancelVibration(mNextVibration.getVibration(),
+ usageFilter, token)) {
+ mNextVibration = null;
+ }
if (mCurrentVibration != null
- && mCurrentVibration.getVibration().token == token) {
+ && shouldCancelVibration(mCurrentVibration.getVibration(),
+ usageFilter, token)) {
mCurrentVibration.cancel();
}
- if (mCurrentExternalVibration != null) {
+ if (mCurrentExternalVibration != null
+ && shouldCancelVibration(
+ mCurrentExternalVibration.externalVibration.getVibrationAttributes(),
+ usageFilter)) {
mCurrentExternalVibration.end(Vibration.Status.CANCELLED);
mVibratorManagerRecords.record(mCurrentExternalVibration);
mCurrentExternalVibration.externalVibration.mute();
@@ -603,11 +611,20 @@
// Repeating vibrations always take precedence.
return null;
}
- if (mCurrentVibration != null && mCurrentVibration.getVibration().isRepeating()) {
- if (DEBUG) {
- Slog.d(TAG, "Ignoring incoming vibration in favor of previous alarm vibration");
+ if (mCurrentVibration != null) {
+ if (mCurrentVibration.getVibration().attrs.getUsage()
+ == VibrationAttributes.USAGE_ALARM) {
+ if (DEBUG) {
+ Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration");
+ }
+ return Vibration.Status.IGNORED_FOR_ALARM;
}
- return Vibration.Status.IGNORED_FOR_ALARM;
+ if (mCurrentVibration.getVibration().isRepeating()) {
+ if (DEBUG) {
+ Slog.d(TAG, "Ignoring incoming vibration in favor of repeating vibration");
+ }
+ return Vibration.Status.IGNORED_FOR_ONGOING;
+ }
}
return null;
}
@@ -684,6 +701,30 @@
}
/**
+ * Return true if the vibration has the same token and usage belongs to given usage class.
+ *
+ * @param vib The ongoing or pending vibration to be cancelled.
+ * @param usageFilter The vibration usages to be cancelled, any bitwise combination of
+ * VibrationAttributes.USAGE_* values.
+ * @param token The binder token to identify the vibration origin. Only vibrations
+ * started with the same token can be cancelled with it.
+ */
+ private boolean shouldCancelVibration(Vibration vib, int usageFilter, IBinder token) {
+ return (vib.token == token) && shouldCancelVibration(vib.attrs, usageFilter);
+ }
+
+ /**
+ * Return true if the external vibration usage belongs to given usage class.
+ *
+ * @param attrs The attributes of an ongoing or pending vibration to be cancelled.
+ * @param usageFilter The vibration usages to be cancelled, any bitwise combination of
+ * VibrationAttributes.USAGE_* values.
+ */
+ private boolean shouldCancelVibration(VibrationAttributes attrs, int usageFilter) {
+ return (usageFilter & attrs.getUsage()) == attrs.getUsage();
+ }
+
+ /**
* Check which mode should be set for a vibration with given {@code uid}, {@code opPkg} and
* {@code attrs}. This will return one of the AppOpsManager.MODE_*.
*/
@@ -733,14 +774,14 @@
}
/**
- * Validate the incoming {@link CombinedVibrationEffect}.
+ * Validate the incoming {@link CombinedVibration}.
*
* We can't throw exceptions here since we might be called from some system_server component,
* which would bring the whole system down.
*
* @return whether the CombinedVibrationEffect is non-null and valid
*/
- private static boolean isEffectValid(@Nullable CombinedVibrationEffect effect) {
+ private static boolean isEffectValid(@Nullable CombinedVibration effect) {
if (effect == null) {
Slog.wtf(TAG, "effect must not be null");
return false;
@@ -758,18 +799,18 @@
* Sets fallback effects to all prebaked ones in given combination of effects, based on {@link
* VibrationSettings#getFallbackEffect}.
*/
- private void fillVibrationFallbacks(Vibration vib, CombinedVibrationEffect effect) {
- if (effect instanceof CombinedVibrationEffect.Mono) {
- fillVibrationFallbacks(vib, ((CombinedVibrationEffect.Mono) effect).getEffect());
- } else if (effect instanceof CombinedVibrationEffect.Stereo) {
+ private void fillVibrationFallbacks(Vibration vib, CombinedVibration effect) {
+ if (effect instanceof CombinedVibration.Mono) {
+ fillVibrationFallbacks(vib, ((CombinedVibration.Mono) effect).getEffect());
+ } else if (effect instanceof CombinedVibration.Stereo) {
SparseArray<VibrationEffect> effects =
- ((CombinedVibrationEffect.Stereo) effect).getEffects();
+ ((CombinedVibration.Stereo) effect).getEffects();
for (int i = 0; i < effects.size(); i++) {
fillVibrationFallbacks(vib, effects.valueAt(i));
}
- } else if (effect instanceof CombinedVibrationEffect.Sequential) {
- List<CombinedVibrationEffect> effects =
- ((CombinedVibrationEffect.Sequential) effect).getEffects();
+ } else if (effect instanceof CombinedVibration.Sequential) {
+ List<CombinedVibration> effects =
+ ((CombinedVibration.Sequential) effect).getEffects();
for (int i = 0; i < effects.size(); i++) {
fillVibrationFallbacks(vib, effects.get(i));
}
@@ -816,15 +857,15 @@
@GuardedBy("mLock")
@Nullable
private SparseArray<PrebakedSegment> fixupAlwaysOnEffectsLocked(
- CombinedVibrationEffect effect) {
+ CombinedVibration effect) {
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "fixupAlwaysOnEffectsLocked");
try {
SparseArray<VibrationEffect> effects;
- if (effect instanceof CombinedVibrationEffect.Mono) {
- VibrationEffect syncedEffect = ((CombinedVibrationEffect.Mono) effect).getEffect();
+ if (effect instanceof CombinedVibration.Mono) {
+ VibrationEffect syncedEffect = ((CombinedVibration.Mono) effect).getEffect();
effects = transformAllVibratorsLocked(unused -> syncedEffect);
- } else if (effect instanceof CombinedVibrationEffect.Stereo) {
- effects = ((CombinedVibrationEffect.Stereo) effect).getEffects();
+ } else if (effect instanceof CombinedVibration.Stereo) {
+ effects = ((CombinedVibration.Stereo) effect).getEffects();
} else {
// Only synced combinations can be used for always-on effects.
return null;
@@ -1456,7 +1497,7 @@
private int runMono() {
CommonOptions commonOptions = new CommonOptions();
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(nextEffect());
+ CombinedVibration effect = CombinedVibration.createParallel(nextEffect());
VibrationAttributes attrs = createVibrationAttributes(commonOptions);
vibrate(Binder.getCallingUid(), SHELL_PACKAGE_NAME, effect, attrs,
commonOptions.description, mToken);
@@ -1465,8 +1506,8 @@
private int runStereo() {
CommonOptions commonOptions = new CommonOptions();
- CombinedVibrationEffect.SyncedCombination combination =
- CombinedVibrationEffect.startSynced();
+ CombinedVibration.ParallelCombination combination =
+ CombinedVibration.startParallel();
while ("-v".equals(getNextOption())) {
int vibratorId = Integer.parseInt(getNextArgRequired());
combination.addVibrator(vibratorId, nextEffect());
@@ -1479,8 +1520,8 @@
private int runSequential() {
CommonOptions commonOptions = new CommonOptions();
- CombinedVibrationEffect.SequentialCombination combination =
- CombinedVibrationEffect.startSequential();
+ CombinedVibration.SequentialCombination combination =
+ CombinedVibration.startSequential();
while ("-v".equals(getNextOption())) {
int vibratorId = Integer.parseInt(getNextArgRequired());
combination.addNext(vibratorId, nextEffect());
@@ -1492,7 +1533,7 @@
}
private int runCancel() {
- cancelVibrate(mToken);
+ cancelVibrate(/* usageFilter= */ -1, mToken);
return 0;
}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 376595b..5b4e6a0 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -218,6 +218,7 @@
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_SOLID_COLOR;
+import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_WALLPAPER;
import static com.android.server.wm.WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
@@ -560,6 +561,9 @@
// The locusId associated with this activity, if set.
private LocusId mLocusId;
+ // Whether the activity was launched from a bubble.
+ private boolean mLaunchedFromBubble;
+
private SizeConfigurationBuckets mSizeConfigurations;
/**
@@ -601,8 +605,6 @@
/** Whether our surface was set to be showing in the last call to {@link #prepareSurfaces} */
private boolean mLastSurfaceShowing = true;
- private Letterbox mLetterbox;
-
/**
* The activity is opaque and fills the entire space of this task.
* @see WindowContainer#fillsParent()
@@ -640,6 +642,8 @@
*/
private boolean mWillCloseOrEnterPip;
+ private Letterbox mLetterbox;
+
/**
* The scale to fit at least one side of the activity to its parent. If the activity uses
* 1920x1080, and the actually size on the screen is 960x540, then the scale is 0.5.
@@ -667,6 +671,8 @@
@Nullable
private Rect mLetterboxBoundsForFixedOrientationAndAspectRatio;
+ private boolean mShowWallpaperForLetterboxBackground;
+
// activity is not displayed?
// TODO: rename to mNoDisplay
@VisibleForTesting
@@ -1119,6 +1125,14 @@
getLetterboxBackgroundColor().toArgb()));
pw.println(prefix + " letterboxBackgroundType="
+ letterboxBackgroundTypeToString(mWmService.getLetterboxBackgroundType()));
+ if (mWmService.getLetterboxBackgroundType() == LETTERBOX_BACKGROUND_WALLPAPER) {
+ pw.println(prefix + " isLetterboxWallpaperBlurSupported="
+ + isLetterboxWallpaperBlurSupported());
+ pw.println(prefix + " letterboxBackgroundWallpaperDarkScrimAlpha="
+ + getLetterboxWallpaperDarkScrimAlpha());
+ pw.println(prefix + " letterboxBackgroundWallpaperBlurRadius="
+ + getLetterboxWallpaperBlurRadius());
+ }
}
/**
@@ -1406,6 +1420,7 @@
}
}
+ // TODO(b/183754168): Move letterbox UI logic into a separate class.
void layoutLetterbox(WindowState winHint) {
final WindowState w = findMainWindow();
if (w == null || winHint != null && w != winHint) {
@@ -1415,12 +1430,16 @@
|| w.isDragResizeChanged(); // Waiting for relayoutWindow to call preserveSurface.
final boolean needsLetterbox = surfaceReady && isLetterboxed(w);
updateRoundedCorners(w);
+ updateWallpaperForLetterbox(w);
if (needsLetterbox) {
if (mLetterbox == null) {
mLetterbox = new Letterbox(() -> makeChildSurface(null),
mWmService.mTransactionFactory,
mWmService::isLetterboxActivityCornersRounded,
- this::getLetterboxBackgroundColor);
+ this::getLetterboxBackgroundColor,
+ this::hasWallpaperBackgroudForLetterbox,
+ this::getLetterboxWallpaperBlurRadius,
+ this::getLetterboxWallpaperDarkScrimAlpha);
mLetterbox.attachInput(w);
}
getPosition(mTmpPoint);
@@ -1452,17 +1471,31 @@
if (taskDescription != null && taskDescription.getBackgroundColorFloating() != 0) {
return Color.valueOf(taskDescription.getBackgroundColorFloating());
}
- return mWmService.getLetterboxBackgroundColor();
+ break;
case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND:
if (taskDescription != null && taskDescription.getBackgroundColor() != 0) {
return Color.valueOf(taskDescription.getBackgroundColor());
}
- // Falling through
+ break;
+ case LETTERBOX_BACKGROUND_WALLPAPER:
+ if (hasWallpaperBackgroudForLetterbox()) {
+ // Color is used for translucent scrim that dims wallpaper.
+ return Color.valueOf(Color.BLACK);
+ }
+ Slog.w(TAG, "Wallpaper option is selected for letterbox background but "
+ + "blur is not supported by a device or not supported in the current "
+ + "window configuration or both alpha scrim and blur radius aren't "
+ + "provided so using solid color background");
+ break;
case LETTERBOX_BACKGROUND_SOLID_COLOR:
return mWmService.getLetterboxBackgroundColor();
+ default:
+ throw new AssertionError(
+ "Unexpected letterbox background type: " + letterboxBackgroundType);
}
- throw new AssertionError(
- "Unexpected letterbox background type: " + letterboxBackgroundType);
+ // If picked option configured incorrectly or not supported then default to a solid color
+ // background.
+ return mWmService.getLetterboxBackgroundColor();
}
/**
@@ -1494,6 +1527,45 @@
}
}
+ boolean hasWallpaperBackgroudForLetterbox() {
+ return mShowWallpaperForLetterboxBackground;
+ }
+
+ private void updateWallpaperForLetterbox(WindowState mainWindow) {
+ @LetterboxBackgroundType int letterboxBackgroundType =
+ mWmService.getLetterboxBackgroundType();
+ boolean wallpaperShouldBeShown =
+ letterboxBackgroundType == LETTERBOX_BACKGROUND_WALLPAPER
+ && isLetterboxed(mainWindow)
+ // Don't use wallpaper as a background if letterboxed for display cutout.
+ && !mainWindow.isLetterboxedForDisplayCutout()
+ // Check that dark scrim alpha or blur radius are provided
+ && (getLetterboxWallpaperBlurRadius() > 0
+ || getLetterboxWallpaperDarkScrimAlpha() > 0)
+ // Check that blur is supported by a device if blur radius is provided.
+ && (getLetterboxWallpaperBlurRadius() <= 0
+ || isLetterboxWallpaperBlurSupported());
+ if (mShowWallpaperForLetterboxBackground != wallpaperShouldBeShown) {
+ mShowWallpaperForLetterboxBackground = wallpaperShouldBeShown;
+ requestUpdateWallpaperIfNeeded();
+ }
+ }
+
+ private int getLetterboxWallpaperBlurRadius() {
+ int blurRadius = mWmService.getLetterboxBackgroundWallpaperBlurRadius();
+ return blurRadius < 0 ? 0 : blurRadius;
+ }
+
+ private float getLetterboxWallpaperDarkScrimAlpha() {
+ float alpha = mWmService.getLetterboxBackgroundWallpaperDarkScrimAlpha();
+ // No scrim by default.
+ return (alpha < 0 || alpha >= 1) ? 0.0f : alpha;
+ }
+
+ private boolean isLetterboxWallpaperBlurSupported() {
+ return mWmService.mContext.getSystemService(WindowManager.class).isCrossWindowBlurEnabled();
+ }
+
void updateLetterboxSurface(WindowState winHint) {
final WindowState w = findMainWindow();
if (w != winHint && winHint != null && w != null) {
@@ -4149,7 +4221,12 @@
}
}
+ boolean getLaunchedFromBubble() {
+ return mLaunchedFromBubble;
+ }
+
private void setOptions(@NonNull ActivityOptions options) {
+ mLaunchedFromBubble = options.getLaunchedFromBubble();
mPendingOptions = options;
if (options.getAnimationType() == ANIM_REMOTE_ANIMATION) {
mPendingRemoteAnimation = options.getRemoteAnimationAdapter();
@@ -6939,12 +7016,16 @@
newParentConfiguration = mTmpConfig;
}
- final int windowingMode = getWindowingMode();
+ // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be
+ // different from windowing mode of the task (PiP) during transition from fullscreen to PiP
+ // and back which can cause visible issues (see b/184078928).
+ final int parentWindowingMode =
+ newParentConfiguration.windowConfiguration.getWindowingMode();
// TODO(b/181207944): Consider removing the if condition and always run
// resolveFixedOrientationConfiguration() since this should be applied for all cases.
- if (isSplitScreenWindowingMode(windowingMode)
- || windowingMode == WINDOWING_MODE_MULTI_WINDOW
- || windowingMode == WINDOWING_MODE_FULLSCREEN) {
+ if (isSplitScreenWindowingMode(parentWindowingMode)
+ || parentWindowingMode == WINDOWING_MODE_MULTI_WINDOW
+ || parentWindowingMode == WINDOWING_MODE_FULLSCREEN) {
resolveFixedOrientationConfiguration(newParentConfiguration);
}
@@ -7349,6 +7430,10 @@
getPid(), info.applicationInfo.uid) == PERMISSION_GRANTED) {
return false;
}
+ // Do not sandbox to activity window bounds if the feature is disabled.
+ if (mDisplayContent != null && !mDisplayContent.sandboxDisplayApis()) {
+ return false;
+ }
// Max bounds should be sandboxed where an activity is letterboxed (activity bounds will be
// smaller than task bounds).
if (!matchParentBounds()) {
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index aa1f42e..75a188e 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2633,6 +2633,12 @@
mOptions = null;
}
}
+
+ if (mPreferredWindowingMode != WINDOWING_MODE_UNDEFINED
+ && intentTask.getWindowingMode() != mPreferredWindowingMode) {
+ intentTask.setWindowingMode(mPreferredWindowingMode);
+ }
+
// Need to update mTargetRootTask because if task was moved out of it, the original root
// task may be destroyed.
mTargetRootTask = intentActivity.getRootTask();
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 7ae42cc..a0beee4 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -35,9 +35,7 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
@@ -114,7 +112,6 @@
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_ONLY;
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
import static com.android.server.wm.Task.REPARENT_KEEP_ROOT_TASK_AT_FRONT;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import android.Manifest;
@@ -147,7 +144,6 @@
import android.app.ProfilerInfo;
import android.app.RemoteAction;
import android.app.WaitResult;
-import android.app.WindowConfiguration;
import android.app.admin.DevicePolicyCache;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
@@ -227,7 +223,6 @@
import android.window.IWindowOrganizerController;
import android.window.SplashScreenView.SplashScreenViewParcelable;
import android.window.TaskSnapshot;
-import android.window.WindowContainerTransaction;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -1897,57 +1892,6 @@
return null;
}
- @Override
- public boolean setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
- enforceTaskPermission("setTaskWindowingMode()");
- synchronized (mGlobalLock) {
- final long ident = Binder.clearCallingIdentity();
- try {
- if (isInLockTaskMode() && windowingMode != WINDOWING_MODE_FULLSCREEN) {
- Slog.w(TAG, "setTaskWindowingMode: Is in lock task mode="
- + getLockTaskModeState());
- return false;
- }
-
- if (WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
- return setTaskWindowingModeSplitScreen(taskId, windowingMode, toTop);
- }
- final Task task = mRootWindowContainer.anyTaskForId(taskId,
- MATCH_ATTACHED_TASK_ONLY);
- if (task == null) {
- Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
- return false;
- }
-
- ProtoLog.d(WM_DEBUG_TASKS, "setTaskWindowingMode: moving task=%d "
- + "to windowingMode=%d toTop=%b", taskId, windowingMode, toTop);
-
- if (!task.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
- + " non-standard task " + taskId + " to windowing mode="
- + windowingMode);
- }
-
- final Task rootTask = task.getRootTask();
- if (toTop) {
- rootTask.moveToFront("setTaskWindowingMode", task);
- }
- // Convert some windowing-mode changes into root-task reparents for split-screen.
- if (rootTask.inSplitScreenWindowingMode()) {
- rootTask.getDisplayArea().onSplitScreenModeDismissed();
-
- } else {
- rootTask.setWindowingMode(windowingMode);
- rootTask.mDisplayContent.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS,
- true /* notifyClients */);
- }
- return true;
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
/**
* Sets the locusId for a particular activity.
*
@@ -2225,59 +2169,6 @@
}
/**
- * Moves the specified task into a split-screen tile.
- */
- private boolean setTaskWindowingModeSplitScreen(int taskId, int windowingMode, boolean toTop) {
- if (!WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
- throw new IllegalArgumentException("Calling setTaskWindowingModeSplitScreen with non"
- + "split-screen mode: " + windowingMode);
- }
-
- final Task task = mRootWindowContainer.anyTaskForId(taskId,
- MATCH_ATTACHED_TASK_ONLY);
- if (task == null) {
- Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
- return false;
- }
- if (!task.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
- + " non-standard task " + taskId + " to split-screen windowing mode");
- }
- if (!task.supportsSplitScreenWindowingMode()) {
- return false;
- }
-
- final int prevMode = task.getWindowingMode();
- if (prevMode == windowingMode) {
- // The task is already in split-screen and with correct windowing mode.
- return true;
- }
-
- moveTaskToSplitScreenPrimaryTask(task, toTop);
- return prevMode != task.getWindowingMode();
- }
-
- void moveTaskToSplitScreenPrimaryTask(Task task, boolean toTop) {
- final TaskDisplayArea taskDisplayArea = task.getDisplayArea();
- final Task primarySplitTask = taskDisplayArea.getRootSplitScreenPrimaryTask();
- if (primarySplitTask == null) {
- throw new IllegalStateException("Can't enter split without associated organized task");
- }
-
- if (toTop) {
- taskDisplayArea.positionChildAt(POSITION_TOP, primarySplitTask,
- false /* includingParents */);
- }
- WindowContainerTransaction wct = new WindowContainerTransaction();
- // Clear out current windowing mode before reparenting to split taks.
- wct.setWindowingMode(
- task.getRootTask().mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_UNDEFINED);
- wct.reparent(task.getRootTask().mRemoteToken.toWindowContainerToken(),
- primarySplitTask.mRemoteToken.toWindowContainerToken(), toTop);
- mWindowOrganizerController.applyTransaction(wct);
- }
-
- /**
* Removes root tasks in the input windowing modes from the system if they are of activity type
* ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
*/
@@ -3400,47 +3291,6 @@
return true;
}
- // TODO(b/149338177): remove when CTS no-longer requires it
- @Override
- public void resizePrimarySplitScreen(Rect dockedBounds, Rect tempDockedTaskBounds,
- Rect tempDockedTaskInsetBounds,
- Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) {
- enforceTaskPermission("resizePrimarySplitScreen()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (mGlobalLock) {
- final TaskDisplayArea tc = mRootWindowContainer.getDefaultTaskDisplayArea();
- final Task primary = tc.getRootSplitScreenPrimaryTask();
- final Task secondary = tc.getTask(t -> t.mCreatedByOrganizer && t.isRootTask()
- && t.inSplitScreenSecondaryWindowingMode());
- if (primary == null || secondary == null) {
- return;
- }
- final WindowContainerTransaction wct = new WindowContainerTransaction();
- final Rect primaryRect =
- tempDockedTaskInsetBounds != null ? tempDockedTaskInsetBounds
- : (tempDockedTaskBounds != null ? tempDockedTaskBounds
- : dockedBounds);
- wct.setBounds(primary.mRemoteToken.toWindowContainerToken(), primaryRect);
- Rect otherRect = tempOtherTaskInsetBounds != null ? tempOtherTaskInsetBounds
- : tempOtherTaskBounds;
- if (otherRect == null) {
- // Temporary estimation... again this is just for tests.
- otherRect = new Rect(secondary.getBounds());
- if (tc.getBounds().width() > tc.getBounds().height()) {
- otherRect.left = primaryRect.right + 6;
- } else {
- otherRect.top = primaryRect.bottom + 6;
- }
- }
- wct.setBounds(secondary.mRemoteToken.toWindowContainerToken(), otherRect);
- mWindowOrganizerController.applyTransaction(wct);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
@Override
public void setSplitScreenResizing(boolean resizing) {
enforceTaskPermission("setSplitScreenResizing()");
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index bfbc10a..bdde369 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -826,7 +826,8 @@
r.getSavedState(), r.getPersistentSavedState(), results, newIntents,
r.takeOptions(), dc.isNextTransitionForward(),
proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,
- r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken));
+ r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken,
+ r.getLaunchedFromBubble()));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 9ca7eca..9a43ca8 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_FLAG_APP_CRASHED;
@@ -128,7 +127,7 @@
final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, true /* visible */);
final boolean showWallpaper = wallpaperTarget != null
- && ((wallpaperTarget.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0
+ && (wallpaperTarget.hasWallpaper()
// Update task open transition to wallpaper transition when wallpaper is visible.
// (i.e.launching app info activity from recent tasks)
|| ((firstTransit == TRANSIT_OPEN || firstTransit == TRANSIT_TO_FRONT)
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index b1606c9..4b735c2 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -61,7 +61,6 @@
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
@@ -349,6 +348,14 @@
int mBaseDisplayWidth = 0;
int mBaseDisplayHeight = 0;
boolean mIsSizeForced = false;
+
+ /**
+ * Overridden display size and metrics to activity window bounds. Set via
+ * "adb shell wm set-sandbox-display-apis". Default to true, since only disable for debugging.
+ * @see WindowManagerService#setSandboxDisplayApis(int, boolean)
+ */
+ private boolean mSandboxDisplayApis = true;
+
/**
* Overridden display density for current user. Initialized with {@link #mInitialDisplayDensity}
* but can be set from Settings or via shell command "adb shell wm density".
@@ -913,7 +920,7 @@
// Take care of the window being ready to display.
final boolean committed = winAnimator.commitFinishDrawingLocked();
if (isDefaultDisplay && committed) {
- if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ if (w.hasWallpaper()) {
if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG,
"First draw done in potential wallpaper target " + w);
mWallpaperMayChange = true;
@@ -5737,6 +5744,21 @@
return true;
}
+ /**
+ * Sets if Display APIs should be sandboxed to the activity window bounds.
+ */
+ void setSandboxDisplayApis(boolean sandboxDisplayApis) {
+ mSandboxDisplayApis = sandboxDisplayApis;
+ }
+
+ /**
+ * Returns {@code true} is Display APIs should be sandboxed to the activity window bounds,
+ * {@code false} otherwise. Default to true, unless set for debugging purposes.
+ */
+ boolean sandboxDisplayApis() {
+ return mSandboxDisplayApis;
+ }
+
/** The entry for proceeding to handle {@link #mFixedRotationLaunchingApp}. */
class FixedRotationTransitionListener extends WindowManagerInternal.AppTransitionListener {
diff --git a/services/core/java/com/android/server/wm/FadeRotationAnimationController.java b/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
index 5ee6928..b14d4a1 100644
--- a/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
+++ b/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
@@ -39,6 +39,9 @@
private final Runnable mFrozenTimeoutRunnable;
private final WindowToken mNavBarToken;
+ /** A runnable which gets called when the {@link #show()} is called. */
+ private Runnable mOnShowRunnable;
+
public FadeRotationAnimationController(DisplayContent displayContent) {
super(displayContent);
mService = displayContent.mWmService;
@@ -81,6 +84,10 @@
if (mFrozenTimeoutRunnable != null) {
mService.mH.removeCallbacks(mFrozenTimeoutRunnable);
}
+ if (mOnShowRunnable != null) {
+ mOnShowRunnable.run();
+ mOnShowRunnable = null;
+ }
}
/**
@@ -115,6 +122,10 @@
return token == mNavBarToken || mTargetWindowTokens.contains(token);
}
+ void setOnShowRunnable(Runnable onShowRunnable) {
+ mOnShowRunnable = onShowRunnable;
+ }
+
@Override
public Animation getFadeInAnimation() {
if (mFrozenTimeoutRunnable != null) {
diff --git a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
index 567b6c2..b94bc5b 100644
--- a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
@@ -390,7 +390,7 @@
final Bundle options = getOptionsForWindowContext(rootDisplayAreaId);
final IWindowManager wms = WindowManagerGlobal.getWindowManagerService();
try {
- wms.registerWindowContextListener(mWindowContext.getWindowContextToken(),
+ wms.attachWindowContextToDisplayArea(mWindowContext.getWindowContextToken(),
IMMERSIVE_MODE_CONFIRMATION_WINDOW_TYPE, mContext.getDisplayId(), options);
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 0732314..7daebff 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -84,6 +84,7 @@
private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider;
private final Rect mImeOverrideFrame = new Rect();
private boolean mIsLeashReadyForDispatching;
+ private final Rect mLastSourceFrame = new Rect();
private final Consumer<Transaction> mSetLeashPositionConsumer = t -> {
if (mControl != null) {
@@ -268,11 +269,14 @@
mSetLeashPositionConsumer.accept(mWin.getPendingTransaction());
}
}
- final Insets insetsHint = mSource.calculateInsets(
- mWin.getBounds(), true /* ignoreVisibility */);
- if (!insetsHint.equals(mControl.getInsetsHint())) {
- changed = true;
- mControl.setInsetsHint(insetsHint);
+ if (mServerVisible && !mLastSourceFrame.equals(mSource.getFrame())) {
+ final Insets insetsHint = mSource.calculateInsets(
+ mWin.getBounds(), true /* ignoreVisibility */);
+ if (!insetsHint.equals(mControl.getInsetsHint())) {
+ changed = true;
+ mControl.setInsetsHint(insetsHint);
+ }
+ mLastSourceFrame.set(mSource.getFrame());
}
if (changed) {
mStateController.notifyControlChanged(mControlTarget);
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index 377e498..af82f75 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -47,6 +47,10 @@
private final Supplier<SurfaceControl.Transaction> mTransactionFactory;
private final Supplier<Boolean> mAreCornersRounded;
private final Supplier<Color> mColorSupplier;
+ // Parameters for "blurred wallpaper" letterbox background.
+ private final Supplier<Boolean> mHasWallpaperBackgroundSupplier;
+ private final Supplier<Integer> mBlurRadiusSupplier;
+ private final Supplier<Float> mDarkScrimAlphaSupplier;
private final Rect mOuter = new Rect();
private final Rect mInner = new Rect();
@@ -68,11 +72,17 @@
public Letterbox(Supplier<SurfaceControl.Builder> surfaceControlFactory,
Supplier<SurfaceControl.Transaction> transactionFactory,
Supplier<Boolean> areCornersRounded,
- Supplier<Color> colorSupplier) {
+ Supplier<Color> colorSupplier,
+ Supplier<Boolean> hasWallpaperBackgroundSupplier,
+ Supplier<Integer> blurRadiusSupplier,
+ Supplier<Float> darkScrimAlphaSupplier) {
mSurfaceControlFactory = surfaceControlFactory;
mTransactionFactory = transactionFactory;
mAreCornersRounded = areCornersRounded;
mColorSupplier = colorSupplier;
+ mHasWallpaperBackgroundSupplier = hasWallpaperBackgroundSupplier;
+ mBlurRadiusSupplier = blurRadiusSupplier;
+ mDarkScrimAlphaSupplier = darkScrimAlphaSupplier;
}
/**
@@ -180,7 +190,7 @@
return true;
}
}
- if (mBehind.needsApplySurfaceChanges()) {
+ if (mAreCornersRounded.get() && mBehind.needsApplySurfaceChanges()) {
return true;
}
return false;
@@ -274,6 +284,7 @@
private final String mType;
private SurfaceControl mSurface;
private Color mColor;
+ private boolean mHasWallpaperBackground;
private final Rect mSurfaceFrameRelative = new Rect();
private final Rect mLayoutFrameGlobal = new Rect();
@@ -351,15 +362,14 @@
}
mColor = mColorSupplier.get();
- final float[] rgbTmpFloat = new float[3];
- rgbTmpFloat[0] = mColor.red();
- rgbTmpFloat[1] = mColor.green();
- rgbTmpFloat[2] = mColor.blue();
- t.setColor(mSurface, rgbTmpFloat);
-
+ t.setColor(mSurface, getRgbColorArray());
t.setPosition(mSurface, mSurfaceFrameRelative.left, mSurfaceFrameRelative.top);
t.setWindowCrop(mSurface, mSurfaceFrameRelative.width(),
mSurfaceFrameRelative.height());
+
+ mHasWallpaperBackground = mHasWallpaperBackgroundSupplier.get();
+ updateAlphaAndBlur(t);
+
t.show(mSurface);
} else if (mSurface != null) {
t.hide(mSurface);
@@ -370,9 +380,43 @@
}
}
+ private void updateAlphaAndBlur(SurfaceControl.Transaction t) {
+ if (!mHasWallpaperBackground) {
+ // Opaque
+ t.setAlpha(mSurface, 1.0f);
+ // Removing pre-exesting blur
+ t.setBackgroundBlurRadius(mSurface, 0);
+ return;
+ }
+ final float alpha = mDarkScrimAlphaSupplier.get();
+ t.setAlpha(mSurface, alpha);
+
+ // Translucent dark scrim can be shown without blur.
+ if (mBlurRadiusSupplier.get() <= 0) {
+ // Removing pre-exesting blur
+ t.setBackgroundBlurRadius(mSurface, 0);
+ return;
+ }
+
+ t.setBackgroundBlurRadius(mSurface, mBlurRadiusSupplier.get());
+ }
+
+ private float[] getRgbColorArray() {
+ final float[] rgbTmpFloat = new float[3];
+ rgbTmpFloat[0] = mColor.red();
+ rgbTmpFloat[1] = mColor.green();
+ rgbTmpFloat[2] = mColor.blue();
+ return rgbTmpFloat;
+ }
+
public boolean needsApplySurfaceChanges() {
return !mSurfaceFrameRelative.equals(mLayoutFrameRelative)
- || mColorSupplier.get() != mColor;
+ // If mSurfaceFrameRelative is empty then mHasWallpaperBackground and mColor
+ // may never be updated in applySurfaceChanges but this doesn't mean that
+ // update is needed.
+ || !mSurfaceFrameRelative.isEmpty()
+ && (mHasWallpaperBackgroundSupplier.get() != mHasWallpaperBackground
+ || !mColorSupplier.get().equals(mColor));
}
}
}
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 20c0d41..6631a3e 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -58,8 +58,6 @@
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.graphics.Rect;
import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException;
@@ -1345,6 +1343,7 @@
+ " inactiveDuration=" + task.getInactiveDuration()
+ " activityType=" + task.getActivityType()
+ " windowingMode=" + task.getWindowingMode()
+ + " isAlwaysOnTopWhenVisible=" + task.isAlwaysOnTopWhenVisible()
+ " intentFlags=" + task.getBaseIntent().getFlags());
}
@@ -1380,7 +1379,7 @@
break;
case WINDOWING_MODE_MULTI_WINDOW:
// Ignore tasks that are always on top
- if (task.isAlwaysOnTop()) {
+ if (task.isAlwaysOnTopWhenVisible()) {
return false;
}
break;
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index c1d5b5c..129a6ce 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -669,21 +669,33 @@
}
navWindow.setSurfaceTranslationY(0);
- if (navWindow.mToken == null) {
+ final WindowToken navToken = navWindow.mToken;
+ if (navToken == null) {
return;
}
final SurfaceControl.Transaction t = mDisplayContent.getPendingTransaction();
- final WindowContainer parent = navWindow.mToken.getParent();
- // Reparent the SurfaceControl of nav bar token back.
- t.reparent(navWindow.mToken.getSurfaceControl(), parent.getSurfaceControl());
-
+ final WindowContainer parent = navToken.getParent();
if (animate) {
- // Run fade-in animation to show navigation bar back to bottom of the display.
- final NavBarFadeAnimationController controller =
+ final NavBarFadeAnimationController navBarFadeAnimationController =
mDisplayContent.getDisplayPolicy().getNavBarFadeAnimationController();
- if (controller != null) {
- controller.fadeWindowToken(true);
+ final Runnable fadeInAnim = () -> {
+ // Reparent the SurfaceControl of nav bar token back.
+ t.reparent(navToken.getSurfaceControl(), parent.getSurfaceControl());
+ // Run fade-in animation to show navigation bar back to bottom of the display.
+ if (navBarFadeAnimationController != null) {
+ navBarFadeAnimationController.fadeWindowToken(true);
+ }
+ };
+ final FadeRotationAnimationController fadeRotationAnimationController =
+ mDisplayContent.getFadeRotationAnimationController();
+ if (fadeRotationAnimationController != null) {
+ fadeRotationAnimationController.setOnShowRunnable(fadeInAnim);
+ } else {
+ fadeInAnim.run();
}
+ } else {
+ // Reparent the SurfaceControl of nav bar token back.
+ t.reparent(navToken.getSurfaceControl(), parent.getSurfaceControl());
}
}
diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java
index 6567195..c9d5fa4 100644
--- a/services/core/java/com/android/server/wm/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java
@@ -18,6 +18,7 @@
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
+import static android.Manifest.permission.STATUS_BAR_SERVICE;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -278,6 +279,19 @@
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
+
+ // If launched from bubble is specified, then ensure that the caller is system or sysui.
+ if (options.getLaunchedFromBubble() && callingUid != Process.SYSTEM_UID) {
+ final int statusBarPerm = ActivityTaskManagerService.checkPermission(
+ STATUS_BAR_SERVICE, callingPid, callingUid);
+ if (statusBarPerm == PERMISSION_DENIED) {
+ final String msg = "Permission Denial: starting " + getIntentString(intent)
+ + " from " + callerApp + " (pid=" + callingPid
+ + ", uid=" + callingUid + ") with launchedFromBubble=true";
+ Slog.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+ }
}
private String getIntentString(Intent intent) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index c293a15..8690499 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -5277,6 +5277,13 @@
}
/**
+ * @return whether this task is always on top without taking visibility into account.
+ */
+ public boolean isAlwaysOnTopWhenVisible() {
+ return super.isAlwaysOnTop();
+ }
+
+ /**
* Returns whether this task is currently forced to be hidden for any reason.
*/
protected boolean isForceHidden() {
@@ -5398,16 +5405,6 @@
// Nothing else to do if we don't have a window container yet. E.g. call from ctor.
return;
}
-
- if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && alreadyInSplitScreenMode) {
- // We already have a root split-screen task in this display, so just move the
- // tasks over.
- // TODO: Figure-out how to do all the stuff in
- // AMS.setTaskWindowingModeSplitScreenPrimary
- throw new IllegalArgumentException("Setting primary split-screen windowing mode"
- + " while there is already one isn't currently supported");
- //return;
- }
} finally {
mAtmService.continueWindowLayout();
}
@@ -5534,7 +5531,7 @@
mCurrentUser = userId;
super.switchUser(userId);
- if (isLeafTask() && showToCurrentUser()) {
+ if (!isRootTask() && showToCurrentUser()) {
getParent().positionChildAt(POSITION_TOP, this, false /*includeParents*/);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 5af44317..5ffab48 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -16,8 +16,6 @@
package com.android.server.wm;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
-
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -292,7 +290,7 @@
builder.setContentInsets(contentInsets);
final boolean isWindowTranslucent = mainWindow.getAttrs().format != PixelFormat.OPAQUE;
- final boolean isShowWallpaper = (mainWindow.getAttrs().flags & FLAG_SHOW_WALLPAPER) != 0;
+ final boolean isShowWallpaper = mainWindow.hasWallpaper();
if (pixelFormat == PixelFormat.UNKNOWN) {
pixelFormat = mPersister.use16BitFormat() && activity.fillsParent()
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 75be444..e4ac1f6 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -31,6 +31,7 @@
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.view.WindowManager.transitTypeToString;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
@@ -403,7 +404,7 @@
sb.append("TransitionRecord{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(" id=" + mSyncId);
- sb.append(" type=" + mType);
+ sb.append(" type=" + transitTypeToString(mType));
sb.append(" flags=" + mFlags);
sb.append('}');
return sb.toString();
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 580bd06..5635c33 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -18,7 +18,6 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
@@ -178,8 +177,7 @@
final boolean animationWallpaper = animatingContainer != null
&& animatingContainer.getAnimation() != null
&& animatingContainer.getAnimation().getShowWallpaper();
- final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0
- || animationWallpaper;
+ final boolean hasWallpaper = w.hasWallpaper() || animationWallpaper;
final boolean isRecentsTransitionTarget = (recentsAnimationController != null
&& recentsAnimationController.isWallpaperVisible(w));
if (isRecentsTransitionTarget) {
diff --git a/services/core/java/com/android/server/wm/WindowContextListenerController.java b/services/core/java/com/android/server/wm/WindowContextListenerController.java
index 8b08314..5e75996 100644
--- a/services/core/java/com/android/server/wm/WindowContextListenerController.java
+++ b/services/core/java/com/android/server/wm/WindowContextListenerController.java
@@ -103,7 +103,11 @@
listener.unregister();
}
- boolean assertCallerCanRemoveListener(IBinder clientToken, boolean callerCanManageAppTokens,
+ /**
+ * Verifies if the caller is allowed to do the operation to the listener specified by
+ * {@code clientToken}.
+ */
+ boolean assertCallerCanModifyListener(IBinder clientToken, boolean callerCanManageAppTokens,
int callingUid) {
final WindowContextListenerImpl listener = mListeners.get(clientToken);
if (listener == null) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index c23cc2e..43dceed 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -56,6 +56,7 @@
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL;
+import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
@@ -451,14 +452,6 @@
private static final int ANIMATION_COMPLETED_TIMEOUT_MS = 5000;
- /**
- * Override of aspect ratio for fixed orientation letterboxing that is set via ADB with
- * set-fixed-orientation-letterbox-aspect-ratio or via {@link
- * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio} will be ignored
- * if it is <= this value.
- */
- static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f;
-
@VisibleForTesting
WindowManagerConstants mConstants;
@@ -984,14 +977,18 @@
private boolean mAnimationsDisabled = false;
boolean mPointerLocationEnabled = false;
- // Aspect ratio of letterbox for fixed orientation, values <=
- // MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO will be ignored.
- private volatile float mFixedOrientationLetterboxAspectRatio;
+ /**
+ * Override of aspect ratio for fixed orientation letterboxing that is set via ADB with
+ * set-fixed-orientation-letterbox-aspect-ratio or via {@link
+ * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio} will be ignored
+ * if it is <= this value.
+ */
+ static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f;
/** Enum for Letterbox background type. */
@Retention(RetentionPolicy.SOURCE)
@IntDef({LETTERBOX_BACKGROUND_SOLID_COLOR, LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND,
- LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING})
+ LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING, LETTERBOX_BACKGROUND_WALLPAPER})
@interface LetterboxBackgroundType {};
/** Solid background using color specified in R.color.config_letterboxBackgroundColor. */
static final int LETTERBOX_BACKGROUND_SOLID_COLOR = 0;
@@ -1002,14 +999,30 @@
/** Color specified in R.attr.colorBackgroundFloating for the letterboxed application. */
static final int LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING = 2;
+ /** Using wallpaper as a background which can be blurred or dimmed with dark scrim. */
+ static final int LETTERBOX_BACKGROUND_WALLPAPER = 3;
+
+ // Aspect ratio of letterbox for fixed orientation, values <=
+ // MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO will be ignored.
+ private float mFixedOrientationLetterboxAspectRatio;
+
// Corners radius for activities presented in the letterbox mode, values < 0 will be ignored.
- private volatile int mLetterboxActivityCornersRadius;
+ private int mLetterboxActivityCornersRadius;
// Color for {@link #LETTERBOX_BACKGROUND_SOLID_COLOR} letterbox background type.
- private volatile Color mLetterboxBackgroundColor;
+ private Color mLetterboxBackgroundColor;
@LetterboxBackgroundType
- private volatile int mLetterboxBackgroundType;
+ private int mLetterboxBackgroundType;
+
+ // Blur radius for LETTERBOX_BACKGROUND_WALLPAPER option in mLetterboxBackgroundType.
+ // Values <= 0 are ignored and 0 is used instead.
+ private int mLetterboxBackgroundWallpaperBlurRadius;
+
+ // Alpha of a black scrim shown over wallpaper letterbox background when
+ // LETTERBOX_BACKGROUND_WALLPAPER option is selected for mLetterboxBackgroundType.
+ // Values < 0 or >= 1 are ignored and 0.0 (transparent) is used instead.
+ private float mLetterboxBackgroundWallpaperDarkScrimAlpha;
final InputManagerService mInputManager;
final DisplayManagerInternal mDisplayManagerInternal;
@@ -1244,6 +1257,10 @@
mLetterboxBackgroundColor = Color.valueOf(context.getResources().getColor(
com.android.internal.R.color.config_letterboxBackgroundColor));
mLetterboxBackgroundType = readLetterboxBackgroundTypeFromConfig(context);
+ mLetterboxBackgroundWallpaperBlurRadius = context.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.config_letterboxBackgroundWallpaperBlurRadius);
+ mLetterboxBackgroundWallpaperDarkScrimAlpha = context.getResources().getFloat(
+ com.android.internal.R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha);
mInputManager = inputManager; // Must be before createDisplayContentLocked.
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
@@ -1783,7 +1800,7 @@
if (type == TYPE_WALLPAPER) {
displayContent.mWallpaperController.clearLastWallpaperTimeoutTime();
displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
- } else if ((attrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ } else if (win.hasWallpaper()) {
displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
} else if (displayContent.mWallpaperController.isBelowWallpaperTarget(win)) {
// If there is currently a wallpaper being shown, and
@@ -2086,7 +2103,7 @@
if (win.mAttrs.type == TYPE_WALLPAPER) {
dc.mWallpaperController.clearLastWallpaperTimeoutTime();
dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
- } else if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ } else if (win.hasWallpaper()) {
dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
}
@@ -2305,7 +2322,7 @@
|| (!win.mRelayoutCalled);
boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
- && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
+ && win.hasWallpaper();
wallpaperMayMove |= (flagChanges & FLAG_SHOW_WALLPAPER) != 0;
if ((flagChanges & FLAG_SECURE) != 0 && winAnimator.mSurfaceController != null) {
winAnimator.mSurfaceController.setSecure(win.isSecureLocked());
@@ -2458,29 +2475,12 @@
win.mResizedWhileGone = false;
}
- // We must always send the latest {@link MergedConfiguration}, regardless of whether we
- // have already reported it. The client might not have processed the previous value yet
- // and needs process it before handling the corresponding window frame. the variable
- // {@code mergedConfiguration} is an out parameter that will be passed back to the
- // client over IPC and checked there.
- // Note: in the cases where the window is tied to an activity, we should not send a
- // configuration update when the window has requested to be hidden. Doing so can lead
- // to the client erroneously accepting a configuration that would have otherwise caused
- // an activity restart. We instead hand back the last reported
- // {@link MergedConfiguration}.
- if (shouldRelayout && (!win.shouldCheckTokenVisibleRequested()
- || win.mToken.isVisibleRequested())) {
- win.getMergedConfiguration(mergedConfiguration);
- } else {
- win.getLastReportedMergedConfiguration(mergedConfiguration);
- }
-
- win.setLastReportedMergedConfiguration(mergedConfiguration);
+ win.fillClientWindowFramesAndConfiguration(outFrames, mergedConfiguration,
+ false /* useLatestConfig */, shouldRelayout);
// Set resize-handled here because the values are sent back to the client.
win.onResizeHandled();
- win.fillClientWindowFrames(outFrames);
outInsetsState.set(win.getCompatInsetsState(), win.isClientLocal());
if (DEBUG) {
Slog.v(TAG_WM, "Relayout given client " + client.asBinder()
@@ -2634,7 +2634,7 @@
ProtoLog.d(WM_DEBUG_ADD_REMOVE, "finishDrawingWindow: %s mDrawState=%s",
win, (win != null ? win.mWinAnimator.drawStateToString() : "null"));
if (win != null && win.finishDrawing(postDrawTransaction)) {
- if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ if (win.hasWallpaper()) {
win.getDisplayContent().pendingLayoutChanges |=
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
}
@@ -2701,30 +2701,19 @@
}
}
- /**
- * Registers a listener for a {@link android.window.WindowContext} to subscribe to configuration
- * changes of a {@link DisplayArea}.
- *
- * @param clientToken the window context's token
- * @param type Window type of the window context
- * @param displayId The display associated with the window context
- * @param options A bundle used to pass window-related options and choose the right DisplayArea
- *
- * @return {@code true} if the listener was registered successfully.
- */
@Override
- public boolean registerWindowContextListener(IBinder clientToken, int type, int displayId,
+ public boolean attachWindowContextToDisplayArea(IBinder clientToken, int type, int displayId,
Bundle options) {
final boolean callerCanManageAppTokens = checkCallingPermission(MANAGE_APP_TOKENS,
- "registerWindowContextListener", false /* printLog */);
+ "attachWindowContextToDisplayArea", false /* printLog */);
final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
final DisplayContent dc = mRoot.getDisplayContentOrCreate(displayId);
if (dc == null) {
- ProtoLog.w(WM_ERROR, "registerWindowContextListener: trying to add listener to"
- + " a non-existing display:%d", displayId);
+ ProtoLog.w(WM_ERROR, "attachWindowContextToDisplayArea: trying to attach"
+ + " to a non-existing display:%d", displayId);
return false;
}
// TODO(b/155340867): Investigate if we still need roundedCornerOverlay after
@@ -2741,14 +2730,50 @@
}
@Override
- public void unregisterWindowContextListener(IBinder clientToken) {
+ public void attachWindowContextToWindowToken(IBinder clientToken, IBinder token) {
final boolean callerCanManageAppTokens = checkCallingPermission(MANAGE_APP_TOKENS,
- "unregisterWindowContextListener", false /* printLog */);
+ "attachWindowContextToWindowToken", false /* printLog */);
final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- if (!mWindowContextListenerController.assertCallerCanRemoveListener(clientToken,
+ final WindowToken windowToken = mRoot.getWindowToken(token);
+ if (windowToken == null) {
+ ProtoLog.w(WM_ERROR, "Then token:%s is invalid. It might be "
+ + "removed", token);
+ return;
+ }
+ final int type = mWindowContextListenerController.getWindowType(clientToken);
+ if (type == INVALID_WINDOW_TYPE) {
+ throw new IllegalArgumentException("The clientToken:" + clientToken
+ + " should have been attached.");
+ }
+ if (type != windowToken.windowType) {
+ throw new IllegalArgumentException("The WindowToken's type should match"
+ + " the created WindowContext's type. WindowToken's type is "
+ + windowToken.windowType + ", while WindowContext's is " + type);
+ }
+ if (!mWindowContextListenerController.assertCallerCanModifyListener(clientToken,
+ callerCanManageAppTokens, callingUid)) {
+ return;
+ }
+ mWindowContextListenerController.registerWindowContainerListener(clientToken,
+ windowToken, callingUid, windowToken.windowType, windowToken.mOptions);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public void detachWindowContextFromWindowContainer(IBinder clientToken) {
+ final boolean callerCanManageAppTokens = checkCallingPermission(MANAGE_APP_TOKENS,
+ "detachWindowContextFromWindowContainer", false /* printLog */);
+ final int callingUid = Binder.getCallingUid();
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ if (!mWindowContextListenerController.assertCallerCanModifyListener(clientToken,
callerCanManageAppTokens, callingUid)) {
return;
}
@@ -3945,6 +3970,7 @@
return backgroundType == LETTERBOX_BACKGROUND_SOLID_COLOR
|| backgroundType == LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND
|| backgroundType == LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING
+ || backgroundType == LETTERBOX_BACKGROUND_WALLPAPER
? backgroundType : LETTERBOX_BACKGROUND_SOLID_COLOR;
}
@@ -3958,11 +3984,71 @@
return "LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND";
case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING:
return "LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING";
+ case LETTERBOX_BACKGROUND_WALLPAPER:
+ return "LETTERBOX_BACKGROUND_WALLPAPER";
default:
return "unknown=" + backgroundType;
}
}
+ /**
+ * Overrides alpha of a black scrim shown over wallpaper for {@link
+ * #LETTERBOX_BACKGROUND_WALLPAPER} option in {@link mLetterboxBackgroundType}.
+ *
+ * <p>If given value is < 0 or >= 1, both it and a value of {@link
+ * com.android.internal.R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha} are ignored
+ * and 0.0 (transparent) is instead.
+ */
+ void setLetterboxBackgroundWallpaperDarkScrimAlpha(float alpha) {
+ mLetterboxBackgroundWallpaperDarkScrimAlpha = alpha;
+ }
+
+ /**
+ * Resets alpha of a black scrim shown over wallpaper letterbox background to {@link
+ * com.android.internal.R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha}.
+ */
+ void resetLetterboxBackgroundWallpaperDarkScrimAlpha() {
+ mLetterboxBackgroundWallpaperDarkScrimAlpha = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha);
+ }
+
+ /**
+ * Gets alpha of a black scrim shown over wallpaper letterbox background.
+ */
+ float getLetterboxBackgroundWallpaperDarkScrimAlpha() {
+ return mLetterboxBackgroundWallpaperDarkScrimAlpha;
+ }
+
+ /**
+ * Overrides blur radius for {@link #LETTERBOX_BACKGROUND_WALLPAPER} option in
+ * {@link mLetterboxBackgroundType}.
+ *
+ * <p> If given value <= 0, both it and a value of {@link
+ * com.android.internal.R.dimen.config_letterboxBackgroundWallpaperBlurRadius} are ignored
+ * and 0 is used instead.
+ */
+ void setLetterboxBackgroundWallpaperBlurRadius(int radius) {
+ mLetterboxBackgroundWallpaperBlurRadius = radius;
+ }
+
+ /**
+ * Resets blur raidus for {@link #LETTERBOX_BACKGROUND_WALLPAPER} option in {@link
+ * mLetterboxBackgroundType} to {@link
+ * com.android.internal.R.dimen.config_letterboxBackgroundWallpaperBlurRadius}.
+ */
+ void resetLetterboxBackgroundWallpaperBlurRadius() {
+ mLetterboxBackgroundWallpaperBlurRadius = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.config_letterboxBackgroundWallpaperBlurRadius);
+ }
+
+ /**
+ * Gets blur raidus for {@link #LETTERBOX_BACKGROUND_WALLPAPER} option in {@link
+ * mLetterboxBackgroundType}.
+ */
+ int getLetterboxBackgroundWallpaperBlurRadius() {
+ return mLetterboxBackgroundWallpaperBlurRadius;
+ }
+
@Override
public void setIgnoreOrientationRequest(int displayId, boolean ignoreOrientationRequest) {
if (!checkCallingPermission(
@@ -5494,6 +5580,25 @@
}
}
+ void setSandboxDisplayApis(int displayId, boolean sandboxDisplayApis) {
+ if (mContext.checkCallingOrSelfPermission(WRITE_SECURE_SETTINGS)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold permission " + WRITE_SECURE_SETTINGS);
+ }
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+ if (displayContent != null) {
+ displayContent.setSandboxDisplayApis(sandboxDisplayApis);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
/** The global settings only apply to default display. */
private boolean applyForcedPropertiesForDefaultDisplay() {
boolean changed = false;
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 64a26ec..5942f34 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -22,6 +22,7 @@
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_SOLID_COLOR;
+import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_WALLPAPER;
import android.graphics.Color;
import android.graphics.Point;
@@ -134,6 +135,16 @@
return runSetLetterboxBackgroundColor(pw);
case "get-letterbox-background-color":
return runGetLetterboxBackgroundColor(pw);
+ case "set-letterbox-background-wallpaper-blur-radius":
+ return runSetLetterboxBackgroundWallpaperBlurRadius(pw);
+ case "get-letterbox-background-wallpaper-blur-radius":
+ return runGetLetterboxBackgroundWallpaperBlurRadius(pw);
+ case "set-letterbox-background-wallpaper-dark-scrim-alpha":
+ return runSetLetterboxBackgroundWallpaperDarkScrimAlpha(pw);
+ case "get-letterbox-background-wallpaper-dark-scrim-alpha":
+ return runGetLetterboxBackgroundWallpaperDarkScrimAlpha(pw);
+ case "set-sandbox-display-apis":
+ return runSandboxDisplayApis(pw);
case "reset":
return runReset(pw);
case "disable-blur":
@@ -344,6 +355,37 @@
return 0;
}
+ /**
+ * Override display size and metrics to reflect the DisplayArea of the calling activity.
+ */
+ private int runSandboxDisplayApis(PrintWriter pw) throws RemoteException {
+ int displayId = Display.DEFAULT_DISPLAY;
+ String arg = getNextArgRequired();
+ if ("-d".equals(arg)) {
+ displayId = Integer.parseInt(getNextArgRequired());
+ arg = getNextArgRequired();
+ }
+
+ final boolean sandboxDisplayApis;
+ switch (arg) {
+ case "true":
+ case "1":
+ sandboxDisplayApis = true;
+ break;
+ case "false":
+ case "0":
+ sandboxDisplayApis = false;
+ break;
+ default:
+ getErrPrintWriter().println("Error: expecting true, 1, false, 0, but we "
+ + "get " + arg);
+ return -1;
+ }
+
+ mInternal.setSandboxDisplayApis(displayId, sandboxDisplayApis);
+ return 0;
+ }
+
private int runDismissKeyguard(PrintWriter pw) throws RemoteException {
mInterface.dismissKeyguard(null /* callback */, null /* message */);
return 0;
@@ -566,7 +608,9 @@
try {
String arg = getNextArgRequired();
if ("reset".equals(arg)) {
- mInternal.resetFixedOrientationLetterboxAspectRatio();
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetFixedOrientationLetterboxAspectRatio();
+ }
return 0;
}
aspectRatio = Float.parseFloat(arg);
@@ -578,17 +622,20 @@
"Error: 'reset' or aspect ratio should be provided as an argument " + e);
return -1;
}
-
- mInternal.setFixedOrientationLetterboxAspectRatio(aspectRatio);
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setFixedOrientationLetterboxAspectRatio(aspectRatio);
+ }
return 0;
}
private int runGetFixedOrientationLetterboxAspectRatio(PrintWriter pw) throws RemoteException {
- final float aspectRatio = mInternal.getFixedOrientationLetterboxAspectRatio();
- if (aspectRatio <= WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO) {
- pw.println("Letterbox aspect ratio is not set");
- } else {
- pw.println("Letterbox aspect ratio is " + aspectRatio);
+ synchronized (mInternal.mGlobalLock) {
+ final float aspectRatio = mInternal.getFixedOrientationLetterboxAspectRatio();
+ if (aspectRatio <= WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO) {
+ pw.println("Letterbox aspect ratio is not set");
+ } else {
+ pw.println("Letterbox aspect ratio is " + aspectRatio);
+ }
}
return 0;
}
@@ -598,7 +645,9 @@
try {
String arg = getNextArgRequired();
if ("reset".equals(arg)) {
- mInternal.resetLetterboxActivityCornersRadius();
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetLetterboxActivityCornersRadius();
+ }
return 0;
}
cornersRadius = Integer.parseInt(arg);
@@ -610,17 +659,20 @@
"Error: 'reset' or corners radius should be provided as an argument " + e);
return -1;
}
-
- mInternal.setLetterboxActivityCornersRadius(cornersRadius);
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setLetterboxActivityCornersRadius(cornersRadius);
+ }
return 0;
}
private int runGetLetterboxActivityCornersRadius(PrintWriter pw) throws RemoteException {
- final int cornersRadius = mInternal.getLetterboxActivityCornersRadius();
- if (cornersRadius < 0) {
- pw.println("Letterbox corners radius is not set");
- } else {
- pw.println("Letterbox corners radius is " + cornersRadius);
+ synchronized (mInternal.mGlobalLock) {
+ final int cornersRadius = mInternal.getLetterboxActivityCornersRadius();
+ if (cornersRadius < 0) {
+ pw.println("Letterbox corners radius is not set");
+ } else {
+ pw.println("Letterbox corners radius is " + cornersRadius);
+ }
}
return 0;
}
@@ -630,7 +682,9 @@
String arg = getNextArgRequired();
if ("reset".equals(arg)) {
- mInternal.resetLetterboxBackgroundType();
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetLetterboxBackgroundType();
+ }
return 0;
}
switch (arg) {
@@ -643,31 +697,42 @@
case "app_color_background_floating":
backgroundType = LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING;
break;
+ case "wallpaper":
+ backgroundType = LETTERBOX_BACKGROUND_WALLPAPER;
+ break;
default:
getErrPrintWriter().println(
- "Error: 'reset', 'solid_color' or 'app_color_background' should "
- + "be provided as an argument");
+ "Error: 'reset', 'solid_color', 'app_color_background' or "
+ + "'wallpaper' should be provided as an argument");
return -1;
}
-
- mInternal.setLetterboxBackgroundType(backgroundType);
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setLetterboxBackgroundType(backgroundType);
+ }
return 0;
}
private int runGetLetterboxBackgroundType(PrintWriter pw) throws RemoteException {
- @LetterboxBackgroundType final int backgroundType = mInternal.getLetterboxBackgroundType();
- switch (backgroundType) {
- case LETTERBOX_BACKGROUND_SOLID_COLOR:
- pw.println("Letterbox background type is 'solid_color'");
- break;
- case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND:
- pw.println("Letterbox background type is 'app_color_background'");
- break;
- case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING:
- pw.println("Letterbox background type is 'app_color_background_floating'");
- break;
- default:
- throw new AssertionError("Unexpected letterbox background type: " + backgroundType);
+ synchronized (mInternal.mGlobalLock) {
+ @LetterboxBackgroundType final int backgroundType =
+ mInternal.getLetterboxBackgroundType();
+ switch (backgroundType) {
+ case LETTERBOX_BACKGROUND_SOLID_COLOR:
+ pw.println("Letterbox background type is 'solid_color'");
+ break;
+ case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND:
+ pw.println("Letterbox background type is 'app_color_background'");
+ break;
+ case LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING:
+ pw.println("Letterbox background type is 'app_color_background_floating'");
+ break;
+ case LETTERBOX_BACKGROUND_WALLPAPER:
+ pw.println("Letterbox background type is 'wallpaper'");
+ break;
+ default:
+ throw new AssertionError(
+ "Unexpected letterbox background type: " + backgroundType);
+ }
}
return 0;
}
@@ -677,7 +742,9 @@
String arg = getNextArgRequired();
try {
if ("reset".equals(arg)) {
- mInternal.resetLetterboxBackgroundColor();
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetLetterboxBackgroundColor();
+ }
return 0;
}
color = Color.valueOf(Color.parseColor(arg));
@@ -687,14 +754,95 @@
+ "an argument " + e + " but got " + arg);
return -1;
}
-
- mInternal.setLetterboxBackgroundColor(color);
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setLetterboxBackgroundColor(color);
+ }
return 0;
}
private int runGetLetterboxBackgroundColor(PrintWriter pw) throws RemoteException {
- final Color color = mInternal.getLetterboxBackgroundColor();
- pw.println("Letterbox background color is " + Integer.toHexString(color.toArgb()));
+ synchronized (mInternal.mGlobalLock) {
+ final Color color = mInternal.getLetterboxBackgroundColor();
+ pw.println("Letterbox background color is " + Integer.toHexString(color.toArgb()));
+ }
+ return 0;
+ }
+
+ private int runSetLetterboxBackgroundWallpaperBlurRadius(PrintWriter pw)
+ throws RemoteException {
+ final int radius;
+ try {
+ String arg = getNextArgRequired();
+ if ("reset".equals(arg)) {
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetLetterboxBackgroundWallpaperBlurRadius();
+ }
+ return 0;
+ }
+ radius = Integer.parseInt(arg);
+ } catch (NumberFormatException e) {
+ getErrPrintWriter().println("Error: blur radius format " + e);
+ return -1;
+ } catch (IllegalArgumentException e) {
+ getErrPrintWriter().println(
+ "Error: 'reset' or blur radius should be provided as an argument " + e);
+ return -1;
+ }
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setLetterboxBackgroundWallpaperBlurRadius(radius);
+ }
+ return 0;
+ }
+
+ private int runGetLetterboxBackgroundWallpaperBlurRadius(PrintWriter pw)
+ throws RemoteException {
+ synchronized (mInternal.mGlobalLock) {
+ final int radius = mInternal.getLetterboxBackgroundWallpaperBlurRadius();
+ if (radius <= 0) {
+ pw.println("Letterbox background wallpaper blur radius is not set");
+ } else {
+ pw.println("Letterbox background wallpaper blur radius is " + radius);
+ }
+ }
+ return 0;
+ }
+
+ private int runSetLetterboxBackgroundWallpaperDarkScrimAlpha(PrintWriter pw)
+ throws RemoteException {
+ final float alpha;
+ try {
+ String arg = getNextArgRequired();
+ if ("reset".equals(arg)) {
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.resetLetterboxBackgroundWallpaperDarkScrimAlpha();
+ }
+ return 0;
+ }
+ alpha = Float.parseFloat(arg);
+ } catch (NumberFormatException e) {
+ getErrPrintWriter().println("Error: bad alpha format " + e);
+ return -1;
+ } catch (IllegalArgumentException e) {
+ getErrPrintWriter().println(
+ "Error: 'reset' or alpha should be provided as an argument " + e);
+ return -1;
+ }
+ synchronized (mInternal.mGlobalLock) {
+ mInternal.setLetterboxBackgroundWallpaperDarkScrimAlpha(alpha);
+ }
+ return 0;
+ }
+
+ private int runGetLetterboxBackgroundWallpaperDarkScrimAlpha(PrintWriter pw)
+ throws RemoteException {
+ synchronized (mInternal.mGlobalLock) {
+ final float alpha = mInternal.getLetterboxBackgroundWallpaperDarkScrimAlpha();
+ if (alpha < 0 || alpha >= 1) {
+ pw.println("Letterbox dark scrim alpha is not set");
+ } else {
+ pw.println("Letterbox dark scrim alpha is " + alpha);
+ }
+ }
return 0;
}
@@ -734,6 +882,15 @@
// set-letterbox-background-color
mInternal.resetLetterboxBackgroundColor();
+ // set-letterbox-background-wallpaper-blur-radius
+ mInternal.resetLetterboxBackgroundWallpaperBlurRadius();
+
+ // set-letterbox-background-wallpaper-dark-scrim-alpha
+ mInternal.resetLetterboxBackgroundWallpaperDarkScrimAlpha();
+
+ // set-sandbox-display-apis
+ mInternal.setSandboxDisplayApis(displayId, /* sandboxDisplayApis= */ true);
+
pw.println("Reset all settings for displayId=" + displayId);
return 0;
}
@@ -783,9 +940,24 @@
pw.println(" and control letterbox background type. See Color#parseColor for allowed");
pw.println(" color formats (#RRGGBB and some colors by name, e.g. magenta or olive). ");
pw.println(" set-letterbox-background-type [reset|solid_color|app_color_background");
- pw.println(" |app_color_background_floating]");
+ pw.println(" |app_color_background_floating|wallpaper]");
pw.println(" get-letterbox-background-type");
pw.println(" Type of background used in the letterbox mode.");
+ pw.println(" set-letterbox-background-wallpaper-blur-radius [reset|radius]");
+ pw.println(" get-letterbox-background-wallpaper-blur-radius");
+ pw.println(" Blur radius for 'wallpaper' letterbox background. If radius <= 0");
+ pw.println(" both it and R.dimen.config_letterboxBackgroundWallpaperBlurRadius are ");
+ pw.println(" ignored and 0 is used.");
+ pw.println(" set-letterbox-background-wallpaper-dark-scrim-alpha [reset|alpha]");
+ pw.println(" get-letterbox-background-wallpaper-dark-scrim-alpha");
+ pw.println(" Alpha of a black translucent scrim shown over 'wallpaper'");
+ pw.println(" letterbox background. If alpha < 0 or >= 1 both it and");
+ pw.println(" R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha are ignored and ");
+ pw.println(" 0.0 (transparent) is used instead.");
+ pw.println(" set-sandbox-display-apis [true|1|false|0]");
+ pw.println(" Sets override of Display APIs getRealSize / getRealMetrics to reflect ");
+ pw.println(" DisplayArea of the activity, or the window bounds if in letterbox or");
+ pw.println(" Size Compat Mode.");
pw.println(" reset [-d DISPLAY_ID]");
pw.println(" Reset all override settings.");
if (!IS_USER) {
diff --git a/services/core/java/com/android/server/wm/WindowOrientationListener.java b/services/core/java/com/android/server/wm/WindowOrientationListener.java
index b971cab..be6847ab 100644
--- a/services/core/java/com/android/server/wm/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/wm/WindowOrientationListener.java
@@ -1079,10 +1079,13 @@
private int mDesiredRotation = -1;
private boolean mRotationEvaluationScheduled;
private long mRotationResolverTimeoutMillis;
-
+ private final ActivityTaskManagerInternal mActivityTaskManagerInternal;
OrientationSensorJudge() {
super();
setupRotationResolverParameters();
+
+ mActivityTaskManagerInternal =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
}
private void setupRotationResolverParameters() {
@@ -1149,6 +1152,18 @@
}
final CancellationSignal cancellationSignal = new CancellationSignal();
+
+ String packageName = null;
+ if (mActivityTaskManagerInternal != null) {
+ final WindowProcessController controller =
+ mActivityTaskManagerInternal.getTopApp();
+ if (controller != null
+ && controller.mInfo != null
+ && controller.mInfo.packageName != null) {
+ packageName = controller.mInfo.packageName;
+ }
+ }
+
mRotationResolverService.resolveRotation(
new RotationResolverInternal.RotationResolverCallbackInternal() {
@Override
@@ -1161,6 +1176,7 @@
finalizeRotation(reportedRotation);
}
},
+ packageName,
reportedRotation,
mCurrentRotation,
mRotationResolverTimeoutMillis,
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 833f637..46d923b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -452,10 +452,7 @@
/** The frames used to compute a temporal layout appearance. */
private WindowFrames mSimulatedWindowFrames;
- /**
- * Usually empty. Set to the task's tempInsetFrame. See
- *{@link android.app.IActivityTaskManager#resizePrimarySplitScreen}.
- */
+ /** Usually the same as {@link #getBounds()}. */
private final Rect mInsetFrame = new Rect();
/**
@@ -2919,21 +2916,6 @@
return processConfig;
}
- void getMergedConfiguration(MergedConfiguration outConfiguration) {
- final Configuration globalConfig = getProcessGlobalConfiguration();
- final Configuration overrideConfig = getMergedOverrideConfiguration();
- outConfiguration.setConfiguration(globalConfig, overrideConfig);
- }
-
- void setLastReportedMergedConfiguration(MergedConfiguration config) {
- mLastReportedConfiguration.setTo(config);
- mLastConfigReportedToClient = true;
- }
-
- void getLastReportedMergedConfiguration(MergedConfiguration config) {
- config.setTo(mLastReportedConfiguration);
- }
-
private Configuration getLastReportedConfiguration() {
return mLastReportedConfiguration.getMergedConfiguration();
}
@@ -3712,7 +3694,17 @@
return wpc != null && wpc.registeredForDisplayAreaConfigChanges();
}
- void fillClientWindowFrames(ClientWindowFrames outFrames) {
+ /**
+ * Fills the given window frames and merged configuration for the client.
+ *
+ * @param outFrames The frames that will be sent to the client.
+ * @param outMergedConfiguration The configuration that will be sent to the client.
+ * @param useLatestConfig Whether to use the latest configuration.
+ * @param relayoutVisible Whether to consider visibility to use the latest configuration.
+ */
+ void fillClientWindowFramesAndConfiguration(ClientWindowFrames outFrames,
+ MergedConfiguration outMergedConfiguration, boolean useLatestConfig,
+ boolean relayoutVisible) {
outFrames.frame.set(mWindowFrames.mCompatFrame);
outFrames.displayFrame.set(mWindowFrames.mDisplayFrame);
if (mInvGlobalScale != 1.0f && hasCompatScale()) {
@@ -3737,6 +3729,23 @@
final DisplayInfo displayInfo = getDisplayInfo();
backdropFrame.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
}
+
+ // Note: in the cases where the window is tied to an activity, we should not send a
+ // configuration update when the window has requested to be hidden. Doing so can lead to
+ // the client erroneously accepting a configuration that would have otherwise caused an
+ // activity restart. We instead hand back the last reported {@link MergedConfiguration}.
+ if (useLatestConfig || (relayoutVisible && (shouldCheckTokenVisibleRequested()
+ || mToken.isVisibleRequested()))) {
+ final Configuration globalConfig = getProcessGlobalConfiguration();
+ final Configuration overrideConfig = getMergedOverrideConfiguration();
+ outMergedConfiguration.setConfiguration(globalConfig, overrideConfig);
+ if (outMergedConfiguration != mLastReportedConfiguration) {
+ mLastReportedConfiguration.setTo(outMergedConfiguration);
+ }
+ } else {
+ outMergedConfiguration.setTo(mLastReportedConfiguration);
+ }
+ mLastConfigReportedToClient = true;
}
void reportResized() {
@@ -3764,9 +3773,6 @@
ProtoLog.i(WM_DEBUG_ORIENTATION, "Resizing %s WITH DRAW PENDING", this);
}
- getMergedConfiguration(mLastReportedConfiguration);
- mLastConfigReportedToClient = true;
-
final boolean reportOrientation = mReportOrientationChanged;
// Always reset these states first, so if {@link IWindow#resized} fails, this
// window won't be added to {@link WindowManagerService#mResizingWindows} and set
@@ -3776,18 +3782,20 @@
mDragResizingChangeReported = true;
mWindowFrames.clearReportResizeHints();
- final MergedConfiguration mergedConfiguration = mLastReportedConfiguration;
+ fillClientWindowFramesAndConfiguration(mClientWindowFrames, mLastReportedConfiguration,
+ true /* useLatestConfig */, false /* relayoutVisible */);
final boolean reportDraw = drawPending || useBLASTSync() || !mRedrawForSyncReported;
final boolean forceRelayout = reportOrientation || isDragResizeChanged() || !mRedrawForSyncReported;
- final int displayId = getDisplayId();
- fillClientWindowFrames(mClientWindowFrames);
+ final DisplayContent displayContent = getDisplayContent();
+ final boolean alwaysConsumeSystemBars =
+ displayContent.getDisplayPolicy().areSystemBarsForcedShownLw(this);
+ final int displayId = displayContent.getDisplayId();
markRedrawForSyncReported();
try {
- mClient.resized(mClientWindowFrames, reportDraw, mergedConfiguration, forceRelayout,
- getDisplayContent().getDisplayPolicy().areSystemBarsForcedShownLw(this),
- displayId);
+ mClient.resized(mClientWindowFrames, reportDraw, mLastReportedConfiguration,
+ forceRelayout, alwaysConsumeSystemBars, displayId);
if (drawPending && reportOrientation && mOrientationChanging) {
mOrientationChangeRedrawRequestTime = SystemClock.elapsedRealtime();
ProtoLog.v(WM_DEBUG_ORIENTATION,
@@ -4507,7 +4515,7 @@
void requestUpdateWallpaperIfNeeded() {
final DisplayContent dc = getDisplayContent();
- if (dc != null && (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ if (dc != null && hasWallpaper()) {
dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
dc.setLayoutNeeded();
mWmService.mWindowPlacerLocked.requestTraversal();
@@ -5867,7 +5875,12 @@
|| inMultiWindowMode()) {
return false;
}
- return (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
+ return hasWallpaper();
+ }
+
+ boolean hasWallpaper() {
+ return (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0
+ || (mActivityRecord != null && mActivityRecord.hasWallpaperBackgroudForLetterbox());
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index d54cf5f..ef39560 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
@@ -346,7 +345,7 @@
boolean windowsCanBeWallpaperTarget() {
for (int j = mChildren.size() - 1; j >= 0; j--) {
final WindowState w = mChildren.get(j);
- if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ if (w.hasWallpaper()) {
return true;
}
}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 15f5765..a99679a 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -49,6 +49,7 @@
"com_android_server_net_NetworkStatsService.cpp",
"com_android_server_power_PowerManagerService.cpp",
"com_android_server_powerstats_PowerStatsService.cpp",
+ "com_android_server_hint_HintManagerService.cpp",
"com_android_server_SerialService.cpp",
"com_android_server_soundtrigger_middleware_AudioSessionProviderImpl.cpp",
"com_android_server_soundtrigger_middleware_ExternalCaptureStateTracker.cpp",
@@ -158,7 +159,7 @@
"android.hardware.memtrack-V1-ndk_platform",
"android.hardware.power@1.0",
"android.hardware.power@1.1",
- "android.hardware.power-V1-cpp",
+ "android.hardware.power-V2-cpp",
"android.hardware.power.stats@1.0",
"android.hardware.power.stats-V1-ndk_platform",
"android.hardware.thermal@1.0",
@@ -195,8 +196,8 @@
"libchrome",
"libmojo",
],
- }
- }
+ },
+ },
}
filegroup {
diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
index a4a74af..e319e3f 100644
--- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
+++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
@@ -18,8 +18,11 @@
//#define LOG_NDEBUG 0
#include <android-base/file.h>
+#include <android-base/logging.h>
#include <android-base/stringprintf.h>
+#include <android-base/unique_fd.h>
#include <android_runtime/AndroidRuntime.h>
+#include <binder/IPCThreadState.h>
#include <cutils/compiler.h>
#include <dirent.h>
#include <jni.h>
@@ -27,9 +30,11 @@
#include <log/log.h>
#include <meminfo/procmeminfo.h>
#include <nativehelper/JNIHelp.h>
+#include <processgroup/processgroup.h>
#include <stddef.h>
#include <stdio.h>
#include <sys/mman.h>
+#include <sys/pidfd.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
@@ -37,29 +42,16 @@
#include <algorithm>
-#include <nativehelper/JNIHelp.h>
-#include <android_runtime/AndroidRuntime.h>
-#include <binder/IPCThreadState.h>
-#include <jni.h>
-#include <processgroup/processgroup.h>
-
using android::base::StringPrintf;
using android::base::WriteStringToFile;
using android::meminfo::ProcMemInfo;
using namespace android::meminfo;
-// This is temporarily hard-coded and should be removed once
-// bionic/libc/kernel/uapi/asm-generic/unistd.h are updated with process_madvise syscall header
-#ifndef __NR_process_madvise
-#define __NR_process_madvise 440
-#define MADV_COLD 20 /* deactivate these pages */
-#define MADV_PAGEOUT 21
-#endif
-
#define COMPACT_ACTION_FILE_FLAG 1
#define COMPACT_ACTION_ANON_FLAG 2
using VmaToAdviseFunc = std::function<int(const Vma&)>;
+using android::base::unique_fd;
#define SYNC_RECEIVED_WHILE_FROZEN (1)
#define ASYNC_RECEIVED_WHILE_FROZEN (2)
@@ -73,24 +65,25 @@
WriteStringToFile(compactionType, reclaim_path);
}
-static int compactMemory(const std::vector<Vma>& vmas, int pid, int madviseType) {
+// Compacts a set of VMAs for pid using an madviseType accepted by process_madvise syscall
+// On success returns the total bytes that where compacted. On failure it returns
+// a negative error code from the standard linux error codes.
+static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseType) {
// UIO_MAXIOV is currently a small value and we might have more addresses
// we do multiple syscalls if we exceed its maximum
static struct iovec vmasToKernel[UIO_MAXIOV];
- int err = 0;
-
if (vmas.empty()) {
- return err;
+ return 0;
}
- int pidfd = syscall(__NR_pidfd_open, pid, 0);
- err = -errno;
+ unique_fd pidfd(pidfd_open(pid, 0));
if (pidfd < 0) {
// Skip compaction if failed to open pidfd with any error
- return err;
+ return -errno;
}
+ int64_t totalBytesCompacted = 0;
for (int iBase = 0; iBase < vmas.size(); iBase += UIO_MAXIOV) {
int totalVmasToKernel = std::min(UIO_MAXIOV, (int)(vmas.size() - iBase));
for (int iVec = 0, iVma = iBase; iVec < totalVmasToKernel; ++iVec, ++iVma) {
@@ -98,17 +91,16 @@
vmasToKernel[iVec].iov_len = vmas[iVma].end - vmas[iVma].start;
}
- process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0);
- err = -errno;
- if (CC_UNLIKELY(err == -ENOSYS)) {
- // Syscall does not exist, skip trying more calls process_madvise
- break;
+ auto bytesCompacted =
+ process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0);
+ if (CC_UNLIKELY(bytesCompacted == -1)) {
+ return -errno;
}
+
+ totalBytesCompacted += bytesCompacted;
}
- close(pidfd);
-
- return err;
+ return totalBytesCompacted;
}
static int getFilePageAdvice(const Vma& vma) {
@@ -132,7 +124,7 @@
// Perform a full process compaction using process_madvise syscall
// reading all filtering VMAs and filtering pages as specified by pageFilter
-static int compactProcess(int pid, VmaToAdviseFunc vmaToAdviseFunc) {
+static int64_t compactProcess(int pid, VmaToAdviseFunc vmaToAdviseFunc) {
ProcMemInfo meminfo(pid);
std::vector<Vma> pageoutVmas, coldVmas;
auto vmaCollectorCb = [&coldVmas,&pageoutVmas,&vmaToAdviseFunc](const Vma& vma) {
@@ -148,11 +140,19 @@
};
meminfo.ForEachVmaFromMaps(vmaCollectorCb);
- int err = compactMemory(pageoutVmas, pid, MADV_PAGEOUT);
- if (!err) {
- err = compactMemory(coldVmas, pid, MADV_COLD);
+ int64_t pageoutBytes = compactMemory(pageoutVmas, pid, MADV_PAGEOUT);
+ if (pageoutBytes < 0) {
+ // Error, just forward it.
+ return pageoutBytes;
}
- return err;
+
+ int64_t coldBytes = compactMemory(coldVmas, pid, MADV_COLD);
+ if (coldBytes < 0) {
+ // Error, just forward it.
+ return coldBytes;
+ }
+
+ return pageoutBytes + coldBytes;
}
// Compact process using process_madvise syscall or fallback to procfs in
diff --git a/services/core/jni/com_android_server_hint_HintManagerService.cpp b/services/core/jni/com_android_server_hint_HintManagerService.cpp
new file mode 100644
index 0000000..000cb83
--- /dev/null
+++ b/services/core/jni/com_android_server_hint_HintManagerService.cpp
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define TAG "HintManagerService-JNI"
+
+//#define LOG_NDEBUG 0
+
+#include <android-base/stringprintf.h>
+#include <android/hardware/power/IPower.h>
+#include <android_runtime/AndroidRuntime.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <powermanager/PowerHalController.h>
+#include <utils/Log.h>
+
+#include <unistd.h>
+#include <cinttypes>
+
+#include <sys/types.h>
+
+#include "jni.h"
+
+using android::hardware::power::IPowerHintSession;
+using android::hardware::power::WorkDuration;
+
+using android::base::StringPrintf;
+
+namespace android {
+
+static power::PowerHalController gPowerHalController;
+
+static jlong createHintSession(JNIEnv* env, int32_t tgid, int32_t uid,
+ std::vector<int32_t> threadIds, int64_t durationNanos) {
+ auto result =
+ gPowerHalController.createHintSession(tgid, uid, std::move(threadIds), durationNanos);
+ if (result.isOk()) {
+ sp<IPowerHintSession> appSession = result.value();
+ if (appSession) appSession->incStrong(env);
+ return reinterpret_cast<jlong>(appSession.get());
+ }
+ return 0;
+}
+
+static void pauseHintSession(JNIEnv* env, int64_t session_ptr) {
+ sp<IPowerHintSession> appSession = reinterpret_cast<IPowerHintSession*>(session_ptr);
+ appSession->pause();
+}
+
+static void resumeHintSession(JNIEnv* env, int64_t session_ptr) {
+ sp<IPowerHintSession> appSession = reinterpret_cast<IPowerHintSession*>(session_ptr);
+ appSession->resume();
+}
+
+static void closeHintSession(JNIEnv* env, int64_t session_ptr) {
+ sp<IPowerHintSession> appSession = reinterpret_cast<IPowerHintSession*>(session_ptr);
+ appSession->close();
+ appSession->decStrong(env);
+}
+
+static void updateTargetWorkDuration(int64_t session_ptr, int64_t targetDurationNanos) {
+ sp<IPowerHintSession> appSession = reinterpret_cast<IPowerHintSession*>(session_ptr);
+ appSession->updateTargetWorkDuration(targetDurationNanos);
+}
+
+static void reportActualWorkDuration(int64_t session_ptr,
+ const std::vector<WorkDuration>& actualDurations) {
+ sp<IPowerHintSession> appSession = reinterpret_cast<IPowerHintSession*>(session_ptr);
+ appSession->reportActualWorkDuration(actualDurations);
+}
+
+static int64_t getHintSessionPreferredRate() {
+ int64_t rate = -1;
+ auto result = gPowerHalController.getHintSessionPreferredRate();
+ if (result.isOk()) {
+ rate = result.value();
+ }
+ return rate;
+}
+
+// ----------------------------------------------------------------------------
+static void nativeInit(JNIEnv* env, jobject obj) {
+ gPowerHalController.init();
+}
+
+static jlong nativeCreateHintSession(JNIEnv* env, jclass /* clazz */, jint tgid, jint uid,
+ jintArray tids, jlong durationNanos) {
+ ScopedIntArrayRO tidArray(env, tids);
+ if (nullptr == tidArray.get() || tidArray.size() == 0) {
+ ALOGW("GetIntArrayElements returns nullptr.");
+ return 0;
+ }
+ std::vector<int32_t> threadIds(tidArray.size());
+ for (size_t i = 0; i < tidArray.size(); i++) {
+ threadIds[i] = tidArray[i];
+ }
+ return createHintSession(env, tgid, uid, std::move(threadIds), durationNanos);
+}
+
+static void nativePauseHintSession(JNIEnv* env, jclass /* clazz */, jlong session_ptr) {
+ pauseHintSession(env, session_ptr);
+}
+
+static void nativeResumeHintSession(JNIEnv* env, jclass /* clazz */, jlong session_ptr) {
+ resumeHintSession(env, session_ptr);
+}
+
+static void nativeCloseHintSession(JNIEnv* env, jclass /* clazz */, jlong session_ptr) {
+ closeHintSession(env, session_ptr);
+}
+
+static void nativeUpdateTargetWorkDuration(JNIEnv* /* env */, jclass /* clazz */, jlong session_ptr,
+ jlong targetDurationNanos) {
+ updateTargetWorkDuration(session_ptr, targetDurationNanos);
+}
+
+static void nativeReportActualWorkDuration(JNIEnv* env, jclass /* clazz */, jlong session_ptr,
+ jlongArray actualDurations, jlongArray timeStamps) {
+ ScopedLongArrayRO arrayActualDurations(env, actualDurations);
+ ScopedLongArrayRO arrayTimeStamps(env, timeStamps);
+
+ std::vector<WorkDuration> actualList(arrayActualDurations.size());
+ for (size_t i = 0; i < arrayActualDurations.size(); i++) {
+ actualList[i].timeStampNanos = arrayTimeStamps[i];
+ actualList[i].durationNanos = arrayActualDurations[i];
+ }
+ reportActualWorkDuration(session_ptr, actualList);
+}
+
+static jlong nativeGetHintSessionPreferredRate(JNIEnv* /* env */, jclass /* clazz */) {
+ return static_cast<jlong>(getHintSessionPreferredRate());
+}
+
+// ----------------------------------------------------------------------------
+static const JNINativeMethod sHintManagerServiceMethods[] = {
+ /* name, signature, funcPtr */
+ {"nativeInit", "()V", (void*)nativeInit},
+ {"nativeCreateHintSession", "(II[IJ)J", (void*)nativeCreateHintSession},
+ {"nativePauseHintSession", "(J)V", (void*)nativePauseHintSession},
+ {"nativeResumeHintSession", "(J)V", (void*)nativeResumeHintSession},
+ {"nativeCloseHintSession", "(J)V", (void*)nativeCloseHintSession},
+ {"nativeUpdateTargetWorkDuration", "(JJ)V", (void*)nativeUpdateTargetWorkDuration},
+ {"nativeReportActualWorkDuration", "(J[J[J)V", (void*)nativeReportActualWorkDuration},
+ {"nativeGetHintSessionPreferredRate", "()J", (void*)nativeGetHintSessionPreferredRate},
+};
+
+int register_android_server_HintManagerService(JNIEnv* env) {
+ return jniRegisterNativeMethods(env,
+ "com/android/server/power/hint/"
+ "HintManagerService$NativeWrapper",
+ sHintManagerServiceMethods, NELEM(sHintManagerServiceMethods));
+}
+
+} /* namespace android */
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 9b7e27d..ae7ea3c 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -100,7 +100,7 @@
ALOGD("Excessive delay in setting interactive mode to %s while turning screen %s",
enabled ? "true" : "false", enabled ? "on" : "off");
}
- return result == power::HalResult::SUCCESSFUL;
+ return result.isOk();
}
void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType,
diff --git a/services/core/jni/com_android_server_vibrator_VibratorController.cpp b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
index cf64a68..b7fa796 100644
--- a/services/core/jni/com_android_server_vibrator_VibratorController.cpp
+++ b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
@@ -199,7 +199,7 @@
ALOGE("vibratorIsAvailable failed because native wrapper was not initialized");
return JNI_FALSE;
}
- auto pingFn = [](std::shared_ptr<vibrator::HalWrapper> hal) { return hal->ping(); };
+ auto pingFn = [](vibrator::HalWrapper* hal) { return hal->ping(); };
return wrapper->halCall<void>(pingFn, "ping").isOk() ? JNI_TRUE : JNI_FALSE;
}
@@ -211,7 +211,7 @@
return -1;
}
auto callback = wrapper->createCallback(vibrationId);
- auto onFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto onFn = [timeoutMs, &callback](vibrator::HalWrapper* hal) {
return hal->on(std::chrono::milliseconds(timeoutMs), callback);
};
auto result = wrapper->halCall<void>(onFn, "on");
@@ -224,7 +224,7 @@
ALOGE("vibratorOff failed because native wrapper was not initialized");
return;
}
- auto offFn = [](std::shared_ptr<vibrator::HalWrapper> hal) { return hal->off(); };
+ auto offFn = [](vibrator::HalWrapper* hal) { return hal->off(); };
wrapper->halCall<void>(offFn, "off");
}
@@ -234,7 +234,7 @@
ALOGE("vibratorSetAmplitude failed because native wrapper was not initialized");
return;
}
- auto setAmplitudeFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto setAmplitudeFn = [amplitude](vibrator::HalWrapper* hal) {
return hal->setAmplitude(static_cast<float>(amplitude));
};
wrapper->halCall<void>(setAmplitudeFn, "setAmplitude");
@@ -247,7 +247,7 @@
ALOGE("vibratorSetExternalControl failed because native wrapper was not initialized");
return;
}
- auto setExternalControlFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto setExternalControlFn = [enabled](vibrator::HalWrapper* hal) {
return hal->setExternalControl(enabled);
};
wrapper->halCall<void>(setExternalControlFn, "setExternalControl");
@@ -263,7 +263,7 @@
aidl::Effect effectType = static_cast<aidl::Effect>(effect);
aidl::EffectStrength effectStrength = static_cast<aidl::EffectStrength>(strength);
auto callback = wrapper->createCallback(vibrationId);
- auto performEffectFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto performEffectFn = [effectType, effectStrength, &callback](vibrator::HalWrapper* hal) {
return hal->performEffect(effectType, effectStrength, callback);
};
auto result = wrapper->halCall<std::chrono::milliseconds>(performEffectFn, "performEffect");
@@ -284,7 +284,7 @@
effects.push_back(effectFromJavaPrimitive(env, element));
}
auto callback = wrapper->createCallback(vibrationId);
- auto performComposedEffectFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto performComposedEffectFn = [&effects, &callback](vibrator::HalWrapper* hal) {
return hal->performComposedEffect(effects, callback);
};
auto result = wrapper->halCall<std::chrono::milliseconds>(performComposedEffectFn,
@@ -319,7 +319,7 @@
}
auto callback = wrapper->createCallback(vibrationId);
- auto performPwleEffectFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto performPwleEffectFn = [&primitives, &callback](vibrator::HalWrapper* hal) {
return hal->performPwleEffect(primitives, callback);
};
auto result = wrapper->halCall<void>(performPwleEffectFn, "performPwleEffect");
@@ -333,7 +333,7 @@
ALOGE("vibratorAlwaysOnEnable failed because native wrapper was not initialized");
return;
}
- auto alwaysOnEnableFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto alwaysOnEnableFn = [id, effect, strength](vibrator::HalWrapper* hal) {
return hal->alwaysOnEnable(static_cast<int32_t>(id), static_cast<aidl::Effect>(effect),
static_cast<aidl::EffectStrength>(strength));
};
@@ -346,7 +346,7 @@
ALOGE("vibratorAlwaysOnDisable failed because native wrapper was not initialized");
return;
}
- auto alwaysOnDisableFn = [&](std::shared_ptr<vibrator::HalWrapper> hal) {
+ auto alwaysOnDisableFn = [id](vibrator::HalWrapper* hal) {
return hal->alwaysOnDisable(static_cast<int32_t>(id));
};
wrapper->halCall<void>(alwaysOnDisableFn, "alwaysOnDisable");
@@ -446,11 +446,11 @@
sRampClassInfo.duration = GetFieldIDOrDie(env, rampClass, "mDuration", "I");
jclass frequencyMappingClass = FindClassOrDie(env, "android/os/VibratorInfo$FrequencyMapping");
- sFrequencyMappingClass = (jclass)env->NewGlobalRef(frequencyMappingClass);
+ sFrequencyMappingClass = static_cast<jclass>(env->NewGlobalRef(frequencyMappingClass));
sFrequencyMappingCtor = GetMethodIDOrDie(env, sFrequencyMappingClass, "<init>", "(FFFF[F)V");
jclass vibratorInfoClass = FindClassOrDie(env, "android/os/VibratorInfo");
- sVibratorInfoClass = (jclass)env->NewGlobalRef(vibratorInfoClass);
+ sVibratorInfoClass = static_cast<jclass>(env->NewGlobalRef(vibratorInfoClass));
sVibratorInfoCtor = GetMethodIDOrDie(env, sVibratorInfoClass, "<init>",
"(IJ[I[I[IFLandroid/os/VibratorInfo$FrequencyMapping;)V");
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index 03a0152..f257686 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -30,6 +30,7 @@
int register_android_server_LightsService(JNIEnv* env);
int register_android_server_PowerManagerService(JNIEnv* env);
int register_android_server_PowerStatsService(JNIEnv* env);
+int register_android_server_HintManagerService(JNIEnv* env);
int register_android_server_storage_AppFuse(JNIEnv* env);
int register_android_server_SerialService(JNIEnv* env);
int register_android_server_SystemServer(JNIEnv* env);
@@ -79,6 +80,7 @@
register_android_server_broadcastradio_Tuner(vm, env);
register_android_server_PowerManagerService(env);
register_android_server_PowerStatsService(env);
+ register_android_server_HintManagerService(env);
register_android_server_SerialService(env);
register_android_server_InputManager(env);
register_android_server_LightsService(env);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
index fb0265e..ff7514a 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
@@ -144,13 +144,13 @@
private static final String TAG_ENROLLMENT_SPECIFIC_ID = "enrollment-specific-id";
private static final String TAG_ADMIN_CAN_GRANT_SENSORS_PERMISSIONS =
"admin-can-grant-sensors-permissions";
- private static final String TAG_ENTERPRISE_NETWORK_PREFERENCE_ENABLED =
- "enterprise-network-preference-enabled";
+ private static final String TAG_PREFERENTIAL_NETWORK_SERVICE_ENABLED =
+ "preferential-network-service-enabled";
private static final String TAG_USB_DATA_SIGNALING = "usb-data-signaling";
private static final String ATTR_VALUE = "value";
private static final String ATTR_LAST_NETWORK_LOGGING_NOTIFICATION = "last-notification";
private static final String ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS = "num-notifications";
- private static final boolean ENTERPRISE_NETWORK_PREFERENCE_ENABLED_DEFAULT = true;
+ private static final boolean PREFERENTIAL_NETWORK_SERVICE_ENABLED_DEFAULT = true;
DeviceAdminInfo info;
@@ -296,8 +296,8 @@
public String mOrganizationId;
public String mEnrollmentSpecificId;
public boolean mAdminCanGrantSensorsPermissions;
- public boolean mEnterpriseNetworkPreferenceEnabled =
- ENTERPRISE_NETWORK_PREFERENCE_ENABLED_DEFAULT;
+ public boolean mPreferentialNetworkServiceEnabled =
+ PREFERENTIAL_NETWORK_SERVICE_ENABLED_DEFAULT;
private static final boolean USB_DATA_SIGNALING_ENABLED_DEFAULT = true;
boolean mUsbDataSignalingEnabled = USB_DATA_SIGNALING_ENABLED_DEFAULT;
@@ -576,9 +576,9 @@
}
writeAttributeValueToXml(out, TAG_ADMIN_CAN_GRANT_SENSORS_PERMISSIONS,
mAdminCanGrantSensorsPermissions);
- if (mEnterpriseNetworkPreferenceEnabled != ENTERPRISE_NETWORK_PREFERENCE_ENABLED_DEFAULT) {
- writeAttributeValueToXml(out, TAG_ENTERPRISE_NETWORK_PREFERENCE_ENABLED,
- mEnterpriseNetworkPreferenceEnabled);
+ if (mPreferentialNetworkServiceEnabled != PREFERENTIAL_NETWORK_SERVICE_ENABLED_DEFAULT) {
+ writeAttributeValueToXml(out, TAG_PREFERENTIAL_NETWORK_SERVICE_ENABLED,
+ mPreferentialNetworkServiceEnabled);
}
if (mUsbDataSignalingEnabled != USB_DATA_SIGNALING_ENABLED_DEFAULT) {
writeAttributeValueToXml(out, TAG_USB_DATA_SIGNALING, mUsbDataSignalingEnabled);
@@ -806,9 +806,9 @@
mAlwaysOnVpnPackage = parser.getAttributeValue(null, ATTR_VALUE);
} else if (TAG_ALWAYS_ON_VPN_LOCKDOWN.equals(tag)) {
mAlwaysOnVpnLockdown = parser.getAttributeBoolean(null, ATTR_VALUE, false);
- } else if (TAG_ENTERPRISE_NETWORK_PREFERENCE_ENABLED.equals(tag)) {
- mEnterpriseNetworkPreferenceEnabled = parser.getAttributeBoolean(
- null, ATTR_VALUE, ENTERPRISE_NETWORK_PREFERENCE_ENABLED_DEFAULT);
+ } else if (TAG_PREFERENTIAL_NETWORK_SERVICE_ENABLED.equals(tag)) {
+ mPreferentialNetworkServiceEnabled = parser.getAttributeBoolean(
+ null, ATTR_VALUE, PREFERENTIAL_NETWORK_SERVICE_ENABLED_DEFAULT);
} else if (TAG_COMMON_CRITERIA_MODE.equals(tag)) {
mCommonCriteriaMode = parser.getAttributeBoolean(null, ATTR_VALUE, false);
} else if (TAG_PASSWORD_COMPLEXITY.equals(tag)) {
@@ -1168,8 +1168,8 @@
pw.print("mAlwaysOnVpnLockdown=");
pw.println(mAlwaysOnVpnLockdown);
- pw.print("mEnterpriseNetworkPreferenceEnabled=");
- pw.println(mEnterpriseNetworkPreferenceEnabled);
+ pw.print("mPreferentialNetworkServiceEnabled=");
+ pw.println(mPreferentialNetworkServiceEnabled);
pw.print("mCommonCriteriaMode=");
pw.println(mCommonCriteriaMode);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b87ccfb..1ba57fd 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -3123,13 +3123,13 @@
updatePermissionPolicyCache(userId);
updateAdminCanGrantSensorsPermissionCache(userId);
- boolean enableEnterpriseNetworkPreferenceEnabled = true;
+ boolean preferentialNetworkServiceEnabled = true;
synchronized (getLockObject()) {
ActiveAdmin owner = getDeviceOrProfileOwnerAdminLocked(userId);
- enableEnterpriseNetworkPreferenceEnabled = owner != null
- ? owner.mEnterpriseNetworkPreferenceEnabled : true;
+ preferentialNetworkServiceEnabled = owner != null
+ ? owner.mPreferentialNetworkServiceEnabled : true;
}
- updateNetworkPreferenceForUser(userId, enableEnterpriseNetworkPreferenceEnabled);
+ updateNetworkPreferenceForUser(userId, preferentialNetworkServiceEnabled);
startOwnerService(userId, "start-user");
}
@@ -4954,6 +4954,7 @@
int flags, CallerIdentity caller) {
final int callingUid = caller.getUid();
final int userHandle = UserHandle.getUserId(callingUid);
+ final boolean isPin = PasswordMetrics.isNumericOnly(password);
synchronized (getLockObject()) {
final PasswordMetrics minMetrics = getPasswordMinimumMetricsUnchecked(userHandle);
final List<PasswordValidationError> validationErrors;
@@ -4961,12 +4962,12 @@
// TODO: Consider changing validation API to take LockscreenCredential.
if (password.isEmpty()) {
validationErrors = PasswordMetrics.validatePasswordMetrics(
- minMetrics, complexity, false /* isPin */,
+ minMetrics, complexity, isPin,
new PasswordMetrics(CREDENTIAL_TYPE_NONE));
} else {
// TODO(b/120484642): remove getBytes() below
validationErrors = PasswordMetrics.validatePassword(
- minMetrics, complexity, false, password.getBytes());
+ minMetrics, complexity, isPin, password.getBytes());
}
if (!validationErrors.isEmpty()) {
@@ -4992,8 +4993,12 @@
// Don't do this with the lock held, because it is going to call
// back in to the service.
final long ident = mInjector.binderClearCallingIdentity();
- final LockscreenCredential newCredential =
- LockscreenCredential.createPasswordOrNone(password);
+ final LockscreenCredential newCredential;
+ if (isPin) {
+ newCredential = LockscreenCredential.createPin(password);
+ } else {
+ newCredential = LockscreenCredential.createPasswordOrNone(password);
+ }
try {
if (tokenHandle == 0 || token == null) {
if (!mLockPatternUtils.setLockCredential(newCredential,
@@ -11611,32 +11616,32 @@
}
@Override
- public void setEnterpriseNetworkPreferenceEnabled(boolean enabled) {
+ public void setPreferentialNetworkServiceEnabled(boolean enabled) {
if (!mHasFeature) {
return;
}
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(isProfileOwner(caller),
"Caller is not profile owner;"
- + " only profile owner may control the enterprise network preference");
+ + " only profile owner may control the preferntial network service");
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(
caller.getUserId());
if (requiredAdmin != null
- && requiredAdmin.mEnterpriseNetworkPreferenceEnabled != enabled) {
- requiredAdmin.mEnterpriseNetworkPreferenceEnabled = enabled;
+ && requiredAdmin.mPreferentialNetworkServiceEnabled != enabled) {
+ requiredAdmin.mPreferentialNetworkServiceEnabled = enabled;
saveSettingsLocked(caller.getUserId());
}
}
updateNetworkPreferenceForUser(caller.getUserId(), enabled);
DevicePolicyEventLogger
- .createEvent(DevicePolicyEnums.SET_ENTERPRISE_NETWORK_PREFERENCE_ENABLED)
+ .createEvent(DevicePolicyEnums.SET_PREFERENTIAL_NETWORK_SERVICE_ENABLED)
.setBoolean(enabled)
.write();
}
@Override
- public boolean isEnterpriseNetworkPreferenceEnabled(int userHandle) {
+ public boolean isPreferentialNetworkServiceEnabled(int userHandle) {
if (!mHasFeature) {
return false;
}
@@ -11647,7 +11652,7 @@
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(userHandle);
if (requiredAdmin != null) {
- return requiredAdmin.mEnterpriseNetworkPreferenceEnabled;
+ return requiredAdmin.mPreferentialNetworkServiceEnabled;
} else {
return false;
}
@@ -11693,9 +11698,18 @@
@Override
public boolean isLockTaskPermitted(String pkg) {
- final int userHandle = mInjector.userHandleGetCallingUserId();
+ // Check policy-exempt apps first, as it doesn't require the lock
+ if (listPolicyExemptAppsUnchecked().contains(pkg)) {
+ if (VERBOSE_LOG) {
+ Slogf.v(LOG_TAG, "isLockTaskPermitted(%s): returning true for policy-exempt app",
+ pkg);
+ }
+ return true;
+ }
+
+ final int userId = mInjector.userHandleGetCallingUserId();
synchronized (getLockObject()) {
- return getUserData(userHandle).mLockTaskPackages.contains(pkg);
+ return getUserData(userId).mLockTaskPackages.contains(pkg);
}
}
@@ -17222,11 +17236,11 @@
}
private void updateNetworkPreferenceForUser(int userId,
- boolean enableEnterpriseNetworkPreferenceEnabled) {
+ boolean preferentialNetworkServiceEnabled) {
if (!isManagedProfile(userId)) {
return;
}
- int networkPreference = enableEnterpriseNetworkPreferenceEnabled
+ int networkPreference = preferentialNetworkServiceEnabled
? PROFILE_NETWORK_PREFERENCE_ENTERPRISE : PROFILE_NETWORK_PREFERENCE_DEFAULT;
mInjector.binderWithCleanCallingIdentity(() ->
mInjector.getConnectivityManager().setProfileNetworkPreference(
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
index 8e31029..285ecfb 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
@@ -100,8 +100,8 @@
int operation = Integer.parseInt(getNextArgRequired());
int reason = mService.getUnsafeOperationReason(operation);
boolean safe = reason == DevicePolicyManager.OPERATION_SAFETY_REASON_NONE;
- pw.printf("Operation %s is %b. Reason: %s\n",
- DevicePolicyManager.operationToString(operation), safe,
+ pw.printf("Operation %s is %s. Reason: %s\n",
+ DevicePolicyManager.operationToString(operation), safeToString(safe),
DevicePolicyManager.operationSafetyReasonToString(reason));
return 0;
}
@@ -110,11 +110,14 @@
int reason = Integer.parseInt(getNextArgRequired());
boolean safe = mService.isSafeOperation(reason);
pw.printf("Operations affected by %s are %s\n",
- DevicePolicyManager.operationSafetyReasonToString(reason),
- (safe ? "SAFE" : "UNSAFE"));
+ DevicePolicyManager.operationSafetyReasonToString(reason), safeToString(safe));
return 0;
}
+ private static String safeToString(boolean safe) {
+ return safe ? "SAFE" : "UNSAFE";
+ }
+
private int runSetSafeOperation(PrintWriter pw) {
int operation = Integer.parseInt(getNextArgRequired());
int reason = Integer.parseInt(getNextArgRequired());
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 388f932..11a700c 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -390,6 +390,11 @@
}
}
+template <class Duration>
+static long elapsedMcs(Duration start, Duration end) {
+ return std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
+}
+
void IncrementalService::onDump(int fd) {
dprintf(fd, "Incremental is %s\n", incfs::enabled() ? "ENABLED" : "DISABLED");
dprintf(fd, "Incremental dir: %s\n", mIncrementalDir.c_str());
@@ -407,6 +412,13 @@
dprintf(fd, " mountId: %d\n", mnt.mountId);
dprintf(fd, " root: %s\n", mnt.root.c_str());
dprintf(fd, " nextStorageDirNo: %d\n", mnt.nextStorageDirNo.load());
+ dprintf(fd, " flags: %d\n", int(mnt.flags));
+ if (mnt.startLoadingTs.time_since_epoch() == Clock::duration::zero()) {
+ dprintf(fd, " not loading\n");
+ } else {
+ dprintf(fd, " startLoading: %llds\n",
+ (long long)(elapsedMcs(mnt.startLoadingTs, Clock::now()) / 1000000));
+ }
if (mnt.dataLoaderStub) {
mnt.dataLoaderStub->onDump(fd);
} else {
@@ -1767,11 +1779,6 @@
}
template <class Duration>
-static long elapsedMcs(Duration start, Duration end) {
- return std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
-}
-
-template <class Duration>
static constexpr auto castToMs(Duration d) {
return std::chrono::duration_cast<std::chrono::milliseconds>(d);
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 1426579..912b8ca 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -170,6 +170,7 @@
import com.android.server.power.PowerManagerService;
import com.android.server.power.ShutdownThread;
import com.android.server.power.ThermalManagerService;
+import com.android.server.power.hint.HintManagerService;
import com.android.server.powerstats.PowerStatsService;
import com.android.server.profcollect.ProfcollectForwardingService;
import com.android.server.recoverysystem.RecoverySystemService;
@@ -1074,6 +1075,10 @@
mSystemServiceManager.startService(ThermalManagerService.class);
t.traceEnd();
+ t.traceBegin("StartHintManager");
+ mSystemServiceManager.startService(HintManagerService.class);
+ t.traceEnd();
+
// Now that the power manager has been started, let the activity manager
// initialize power management features.
t.traceBegin("InitPowerManagement");
@@ -2503,10 +2508,12 @@
}
// Translation manager service
- if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_TRANSLATION)) {
+ if (deviceHasConfigString(context, R.string.config_defaultTranslationService)) {
t.traceBegin("StartTranslationManagerService");
mSystemServiceManager.startService(TRANSLATION_MANAGER_SERVICE_CLASS);
t.traceEnd();
+ } else {
+ Slog.d(TAG, "TranslationService not defined by OEM");
}
// NOTE: ClipboardService depends on ContentCapture and Autofill
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt
index 537a49e..2d852e5 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt
@@ -31,6 +31,7 @@
import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.test.verify.domain.DomainVerificationTestUtils.mockPackageSettings
import com.android.server.pm.verify.domain.DomainVerificationEnforcer
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal
import com.android.server.pm.verify.domain.DomainVerificationService
@@ -98,10 +99,13 @@
mockThrowOnUnmocked {
whenever(callingUid) { callingUidInt.get() }
whenever(callingUserId) { callingUserIdInt.get() }
- whenever(getPackageSettingLocked(VISIBLE_PKG)) { visiblePkgSetting }
- whenever(getPackageLocked(VISIBLE_PKG)) { visiblePkg }
- whenever(getPackageSettingLocked(INVISIBLE_PKG)) { invisiblePkgSetting }
- whenever(getPackageLocked(INVISIBLE_PKG)) { invisiblePkg }
+ mockPackageSettings {
+ when (it) {
+ VISIBLE_PKG -> visiblePkgSetting
+ INVISIBLE_PKG -> invisiblePkgSetting
+ else -> null
+ }
+ }
whenever(schedule(anyInt(), any()))
whenever(scheduleWriteSettings())
whenever(filterAppAccess(eq(VISIBLE_PKG), anyInt(), anyInt())) { false }
@@ -290,6 +294,7 @@
fun mockPkg(packageName: String) = mockThrowOnUnmocked<AndroidPackage> {
whenever(this.packageName) { packageName }
whenever(targetSdkVersion) { Build.VERSION_CODES.S }
+ whenever(isEnabled) { true }
whenever(activities) {
listOf(
ParsedActivity().apply {
@@ -330,11 +335,8 @@
whenever(getName()) { packageName }
whenever(getPkg()) { mockPkg(packageName) }
whenever(this.domainSetId) { domainSetId }
- whenever(userState) {
- SparseArray<PackageUserState>().apply {
- this[0] = PackageUserState()
- }
- }
+ whenever(readUserState(0)) { PackageUserState() }
+ whenever(readUserState(1)) { PackageUserState() }
whenever(getInstantApp(anyInt())) { false }
}
}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt
index 881604f..adc1dab 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
+import android.content.pm.PackageUserState
import android.content.pm.parsing.component.ParsedActivity
import android.content.pm.parsing.component.ParsedIntentInfo
import android.content.pm.verify.domain.DomainVerificationInfo
@@ -31,6 +32,7 @@
import android.util.ArraySet
import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.test.verify.domain.DomainVerificationTestUtils.mockPackageSettings
import com.android.server.pm.verify.domain.DomainVerificationService
import com.android.server.testutils.mockThrowOnUnmocked
import com.android.server.testutils.whenever
@@ -41,6 +43,7 @@
import org.mockito.ArgumentMatchers.anyLong
import org.mockito.ArgumentMatchers.anyString
import java.util.UUID
+import java.util.concurrent.atomic.AtomicBoolean
import kotlin.test.assertFailsWith
class DomainVerificationManagerApiTest {
@@ -267,7 +270,16 @@
@Test
fun getOwnersForDomain() {
- val pkg1 = mockPkgSetting(PKG_ONE, UUID_ONE, listOf(DOMAIN_1, DOMAIN_2))
+ val pkg1User0Enabled = AtomicBoolean(true)
+
+ val pkg1 = mockPkgSetting(PKG_ONE, UUID_ONE, listOf(DOMAIN_1, DOMAIN_2), pkgUserState0 = {
+ mockThrowOnUnmocked {
+ whenever(isPackageEnabled(any())) {
+ pkg1User0Enabled.get()
+ }
+ installed = true
+ }
+ })
val pkg2 = mockPkgSetting(PKG_TWO, UUID_TWO, listOf(DOMAIN_1, DOMAIN_2))
val service = makeService(pkg1, pkg2).apply {
@@ -276,9 +288,20 @@
assertThat(service.getOwnersForDomain(DOMAIN_1, 0)).isEmpty()
- service.setStatus(pkg1.domainSetId, setOf(DOMAIN_1), DomainVerificationInfo.STATE_SUCCESS)
-
- service.setStatus(pkg2.domainSetId, setOf(DOMAIN_1), DomainVerificationInfo.STATE_SUCCESS)
+ assertThat(
+ service.setStatus(
+ pkg1.domainSetId,
+ setOf(DOMAIN_1),
+ DomainVerificationInfo.STATE_SUCCESS
+ )
+ ).isEqualTo(DomainVerificationManager.STATUS_OK)
+ assertThat(
+ service.setStatus(
+ pkg2.domainSetId,
+ setOf(DOMAIN_1),
+ DomainVerificationInfo.STATE_SUCCESS
+ )
+ ).isEqualTo(DomainVerificationManager.STATUS_OK)
service.setUserSelection(pkg1.domainSetId, setOf(DOMAIN_2), true, 0)
@@ -295,15 +318,65 @@
assertThat(it.single().packageName).isEqualTo(pkg1.getName())
assertThat(it.single().isOverrideable).isEqualTo(true)
}
- assertThat(service.getOwnersForDomain(DOMAIN_2, 1)).isEmpty()
+ assertThat(service.getOwnersForDomain(DOMAIN_2, 1)).isEmpty()
+ service.setUserSelection(pkg1.domainSetId, setOf(DOMAIN_2), true, 1)
+ service.getOwnersForDomain(DOMAIN_2, 1).let {
+ assertThat(it).hasSize(1)
+ assertThat(it.single().packageName).isEqualTo(pkg1.getName())
+ assertThat(it.single().isOverrideable).isEqualTo(true)
+ }
+
+ // "Uninstall" the package from user 0 and ensure it's stripped from the results
+ pkg1User0Enabled.set(false)
+ service.clearPackageForUser(pkg1.getName(), 0)
+
+ service.getOwnersForDomain(DOMAIN_1, 0).let {
+ assertThat(it).hasSize(1)
+ assertThat(it.single().packageName).isEqualTo(pkg2.getName())
+ assertThat(it.single().isOverrideable).isEqualTo(false)
+ }
+
+ // Domain 2 user selection gone for user 0
+ assertThat(service.getOwnersForDomain(DOMAIN_2, 0)).isEmpty()
+
+ // Domain 2 user selection still around for user 1
+ service.getOwnersForDomain(DOMAIN_2, 1).let {
+ assertThat(it).hasSize(1)
+ assertThat(it.single().packageName).isEqualTo(pkg1.getName())
+ assertThat(it.single().isOverrideable).isEqualTo(true)
+ }
+
+ // Now assert for user 1 that it was unaffected by the change to user 0
+ service.getOwnersForDomain(DOMAIN_1, 1).let {
+ assertThat(it).hasSize(2)
+ assertThat(it[0].packageName).isEqualTo(pkg1.getName())
+ assertThat(it[0].isOverrideable).isEqualTo(false)
+ assertThat(it[1].packageName).isEqualTo(pkg2.getName())
+ assertThat(it[1].isOverrideable).isEqualTo(false)
+ }
+
+ service.setUserSelection(pkg1.domainSetId, setOf(DOMAIN_2), true, 0)
+
+ service.getOwnersForDomain(DOMAIN_2, 1).let {
+ assertThat(it).hasSize(1)
+ assertThat(it.single().packageName).isEqualTo(pkg1.getName())
+ assertThat(it.single().isOverrideable).isEqualTo(true)
+ }
+
+ // "Reinstall" the package to user 0
+ pkg1User0Enabled.set(false)
+
+ // This state should have been cleared when the package was uninstalled
+ assertThat(service.getOwnersForDomain(DOMAIN_2, 0)).isEmpty()
+
+ // Other package unaffected
service.setUserSelection(pkg2.domainSetId, setOf(DOMAIN_2), true, 0)
service.getOwnersForDomain(DOMAIN_2, 0).let {
assertThat(it).hasSize(1)
assertThat(it.single().packageName).isEqualTo(pkg2.getName())
assertThat(it.single().isOverrideable).isEqualTo(true)
}
- assertThat(service.getOwnersForDomain(DOMAIN_2, 1)).isEmpty()
}
@Test
@@ -373,21 +446,23 @@
whenever(callingUid) { Process.ROOT_UID }
whenever(callingUserId) { 0 }
- whenever(getPackageSettingLocked(anyString())) {
- pkgSettingFunction(arguments[0] as String)
- }
- whenever(getPackageLocked(anyString())) {
- pkgSettingFunction(arguments[0] as String)?.getPkg()
+ mockPackageSettings {
+ pkgSettingFunction(it)
}
})
}
- private fun mockPkgSetting(pkgName: String, domainSetId: UUID, domains: List<String> = listOf(
- DOMAIN_1, DOMAIN_2
- )) = mockThrowOnUnmocked<PackageSetting> {
+ private fun mockPkgSetting(
+ pkgName: String,
+ domainSetId: UUID,
+ domains: List<String> = listOf(DOMAIN_1, DOMAIN_2),
+ pkgUserState0: PackageSetting.() -> PackageUserState = { PackageUserState() },
+ pkgUserState1: PackageSetting.() -> PackageUserState = { PackageUserState() }
+ ) = mockThrowOnUnmocked<PackageSetting> {
val pkg = mockThrowOnUnmocked<AndroidPackage> {
whenever(packageName) { pkgName }
whenever(targetSdkVersion) { Build.VERSION_CODES.S }
+ whenever(isEnabled) { true }
val activityList = listOf(
ParsedActivity().apply {
@@ -416,6 +491,8 @@
whenever(this.domainSetId) { domainSetId }
whenever(getInstantApp(anyInt())) { false }
whenever(firstInstallTime) { 0L }
+ whenever(readUserState(0)) { pkgUserState0() }
+ whenever(readUserState(1)) { pkgUserState1() }
}
fun DomainVerificationService.addPackages(vararg pkgSettings: PackageSetting) =
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt
index 0ce16e6..1097c45 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt
@@ -18,8 +18,11 @@
import android.content.Intent
import android.content.pm.PackageManager
+import android.content.pm.PackageUserState
+import android.content.pm.Signature
import android.content.pm.parsing.component.ParsedActivity
import android.content.pm.parsing.component.ParsedIntentInfo
+import android.content.pm.verify.domain.DomainVerificationInfo.STATE_MODIFIABLE_VERIFIED
import android.content.pm.verify.domain.DomainVerificationInfo.STATE_NO_RESPONSE
import android.content.pm.verify.domain.DomainVerificationInfo.STATE_SUCCESS
import android.content.pm.verify.domain.DomainVerificationInfo.STATE_UNMODIFIABLE
@@ -35,12 +38,12 @@
import android.util.Xml
import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.test.verify.domain.DomainVerificationTestUtils.mockPackageSettings
import com.android.server.pm.verify.domain.DomainVerificationService
import com.android.server.testutils.mockThrowOnUnmocked
import com.android.server.testutils.whenever
import com.google.common.truth.Truth.assertThat
import org.junit.Test
-import org.mockito.ArgumentMatchers
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.anyLong
@@ -54,6 +57,10 @@
private const val PKG_TWO = "com.test.two"
private val UUID_ONE = UUID.fromString("1b041c96-8d37-4932-a858-561bfac5947c")
private val UUID_TWO = UUID.fromString("a3389c16-7f9f-4e86-85e3-500d1249c74c")
+ private const val SIGNATURE_ONE = "AA"
+ private const val DIGEST_ONE =
+ "BCEEF655B5A034911F1C3718CE056531B45EF03B4C7B1F15629E867294011A7D"
+ private const val SIGNATURE_TWO = "BB"
private val DOMAIN_BASE = DomainVerificationPackageTest::class.java.packageName
private val DOMAIN_1 = "one.$DOMAIN_BASE"
@@ -64,8 +71,8 @@
private const val USER_ID = 0
}
- private val pkg1 = mockPkgSetting(PKG_ONE, UUID_ONE)
- private val pkg2 = mockPkgSetting(PKG_TWO, UUID_TWO)
+ private val pkg1 = mockPkgSetting(PKG_ONE, UUID_ONE, SIGNATURE_ONE)
+ private val pkg2 = mockPkgSetting(PKG_TWO, UUID_TWO, SIGNATURE_TWO)
@Test
fun addPackageFirstTime() {
@@ -94,6 +101,104 @@
}
@Test
+ fun addPackageRestoredMatchingSignature() {
+ // language=XML
+ val xml = """
+ <?xml?>
+ <domain-verifications>
+ <active>
+ <package-state
+ packageName="${pkg1.getName()}"
+ id="${pkg1.domainSetId}"
+ signature="$DIGEST_ONE"
+ >
+ <state>
+ <domain name="$DOMAIN_1" state="1"/>
+ </state>
+ </package-state>
+ </active>
+ </domain-verifications>
+ """
+
+ val service = makeService(pkg1, pkg2)
+ service.restoreSettings(Xml.resolvePullParser(xml.byteInputStream()))
+ service.addPackage(pkg1)
+ val info = service.getInfo(pkg1.getName())
+ assertThat(info.packageName).isEqualTo(pkg1.getName())
+ assertThat(info.identifier).isEqualTo(pkg1.domainSetId)
+ assertThat(info.hostToStateMap).containsExactlyEntriesIn(
+ mapOf(
+ DOMAIN_1 to STATE_MODIFIABLE_VERIFIED,
+ DOMAIN_2 to STATE_NO_RESPONSE,
+ )
+ )
+
+ val userState = service.getUserState(pkg1.getName())
+ assertThat(userState.packageName).isEqualTo(pkg1.getName())
+ assertThat(userState.identifier).isEqualTo(pkg1.domainSetId)
+ assertThat(userState.isLinkHandlingAllowed).isEqualTo(true)
+ assertThat(userState.user.identifier).isEqualTo(USER_ID)
+ assertThat(userState.hostToStateMap).containsExactlyEntriesIn(
+ mapOf(
+ DOMAIN_1 to DOMAIN_STATE_VERIFIED,
+ DOMAIN_2 to DOMAIN_STATE_NONE,
+ )
+ )
+
+ assertThat(service.queryValidVerificationPackageNames())
+ .containsExactly(pkg1.getName())
+ }
+
+ @Test
+ fun addPackageRestoredMismatchSignature() {
+ // language=XML
+ val xml = """
+ <?xml?>
+ <domain-verifications>
+ <active>
+ <package-state
+ packageName="${pkg1.getName()}"
+ id="${pkg1.domainSetId}"
+ signature="INVALID_SIGNATURE"
+ >
+ <state>
+ <domain name="$DOMAIN_1" state="1"/>
+ </state>
+ </package-state>
+ </active>
+ </domain-verifications>
+ """
+
+ val service = makeService(pkg1, pkg2)
+ service.restoreSettings(Xml.resolvePullParser(xml.byteInputStream()))
+ service.addPackage(pkg1)
+ val info = service.getInfo(pkg1.getName())
+ assertThat(info.packageName).isEqualTo(pkg1.getName())
+ assertThat(info.identifier).isEqualTo(pkg1.domainSetId)
+ assertThat(info.hostToStateMap).containsExactlyEntriesIn(
+ mapOf(
+ DOMAIN_1 to STATE_NO_RESPONSE,
+ DOMAIN_2 to STATE_NO_RESPONSE,
+ )
+ )
+
+ val userState = service.getUserState(pkg1.getName())
+ assertThat(userState.packageName).isEqualTo(pkg1.getName())
+ assertThat(userState.identifier).isEqualTo(pkg1.domainSetId)
+ assertThat(userState.isLinkHandlingAllowed).isEqualTo(true)
+ assertThat(userState.user.identifier).isEqualTo(USER_ID)
+ assertThat(userState.hostToStateMap).containsExactlyEntriesIn(
+ mapOf(
+ DOMAIN_1 to DOMAIN_STATE_NONE,
+ DOMAIN_2 to DOMAIN_STATE_NONE,
+ )
+ )
+
+ assertThat(service.queryValidVerificationPackageNames())
+ .containsExactly(pkg1.getName())
+ }
+
+ @Test
fun addPackageActive() {
// language=XML
val xml = """
@@ -151,10 +256,9 @@
@Test
fun migratePackageDropDomain() {
val pkgName = PKG_ONE
- val pkgBefore = mockPkgSetting(pkgName, UUID_ONE,
- listOf(DOMAIN_1, DOMAIN_2, DOMAIN_3, DOMAIN_4))
- val pkgAfter = mockPkgSetting(pkgName, UUID_TWO,
- listOf(DOMAIN_1, DOMAIN_2))
+ val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, SIGNATURE_ONE,
+ listOf(DOMAIN_1, DOMAIN_2, DOMAIN_3, DOMAIN_4))
+ val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, SIGNATURE_TWO, listOf(DOMAIN_1, DOMAIN_2))
// Test 4 domains:
// 1 will be approved and preserved, 2 will be selected and preserved,
@@ -213,8 +317,8 @@
@Test
fun migratePackageDropAll() {
val pkgName = PKG_ONE
- val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, listOf(DOMAIN_1, DOMAIN_2))
- val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, emptyList())
+ val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, SIGNATURE_ONE, listOf(DOMAIN_1, DOMAIN_2))
+ val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, SIGNATURE_TWO, emptyList())
val map = mutableMapOf<String, PackageSetting>()
val service = makeService { map[it] }
@@ -255,10 +359,9 @@
@Test
fun migratePackageAddDomain() {
val pkgName = PKG_ONE
- val pkgBefore = mockPkgSetting(pkgName, UUID_ONE,
- listOf(DOMAIN_1, DOMAIN_2))
- val pkgAfter = mockPkgSetting(pkgName, UUID_TWO,
- listOf(DOMAIN_1, DOMAIN_2, DOMAIN_3))
+ val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, SIGNATURE_ONE, listOf(DOMAIN_1, DOMAIN_2))
+ val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, SIGNATURE_TWO,
+ listOf(DOMAIN_1, DOMAIN_2, DOMAIN_3))
// Test 3 domains:
// 1 will be verified and preserved, 2 will be selected and preserved,
@@ -307,8 +410,8 @@
@Test
fun migratePackageAddAll() {
val pkgName = PKG_ONE
- val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, emptyList())
- val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, listOf(DOMAIN_1, DOMAIN_2))
+ val pkgBefore = mockPkgSetting(pkgName, UUID_ONE, SIGNATURE_ONE, emptyList())
+ val pkgAfter = mockPkgSetting(pkgName, UUID_TWO, SIGNATURE_TWO, listOf(DOMAIN_1, DOMAIN_2))
val map = mutableMapOf<String, PackageSetting>()
val service = makeService { map[it] }
@@ -379,21 +482,22 @@
whenever(callingUid) { Process.ROOT_UID }
whenever(callingUserId) { 0 }
- whenever(getPackageSettingLocked(anyString())) {
- pkgSettingFunction(arguments[0] as String)!!
- }
- whenever(getPackageLocked(anyString())) {
- pkgSettingFunction(arguments[0] as String)!!.getPkg()
+ mockPackageSettings {
+ pkgSettingFunction(it)
}
})
}
- private fun mockPkgSetting(pkgName: String, domainSetId: UUID, domains: List<String> = listOf(
- DOMAIN_1, DOMAIN_2
- )) = mockThrowOnUnmocked<PackageSetting> {
+ private fun mockPkgSetting(
+ pkgName: String,
+ domainSetId: UUID,
+ signature: String,
+ domains: List<String> = listOf(DOMAIN_1, DOMAIN_2)
+ ) = mockThrowOnUnmocked<PackageSetting> {
val pkg = mockThrowOnUnmocked<AndroidPackage> {
whenever(packageName) { pkgName }
whenever(targetSdkVersion) { Build.VERSION_CODES.S }
+ whenever(isEnabled) { true }
val activityList = listOf(
ParsedActivity().apply {
@@ -422,5 +526,7 @@
whenever(this.domainSetId) { domainSetId }
whenever(getInstantApp(anyInt())) { false }
whenever(firstInstallTime) { 0L }
+ whenever(readUserState(USER_ID)) { PackageUserState() }
+ whenever(signatures) { arrayOf(Signature(signature)) }
}
}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPersistenceTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPersistenceTest.kt
index f8fda12..7ffbbf6 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPersistenceTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPersistenceTest.kt
@@ -18,6 +18,7 @@
import android.content.pm.verify.domain.DomainVerificationState
import android.util.ArrayMap
+import android.util.SparseArray
import android.util.TypedXmlPullParser
import android.util.TypedXmlSerializer
import android.util.Xml
@@ -84,23 +85,32 @@
@JvmField
val tempFolder = TemporaryFolder()
- @Test
- fun writeAndReadBackNormal() {
+ private fun mockWriteValues(
+ pkgNameToSignature: (String) -> String? = { null }
+ ): Triple<DomainVerificationStateMap<DomainVerificationPkgState>,
+ ArrayMap<String, DomainVerificationPkgState>,
+ ArrayMap<String, DomainVerificationPkgState>> {
val attached = DomainVerificationStateMap<DomainVerificationPkgState>().apply {
- mockPkgState(0).let { put(it.packageName, it.id, it) }
- mockPkgState(1).let { put(it.packageName, it.id, it) }
+ mockPkgState(0, pkgNameToSignature).let { put(it.packageName, it.id, it) }
+ mockPkgState(1, pkgNameToSignature).let { put(it.packageName, it.id, it) }
}
val pending = ArrayMap<String, DomainVerificationPkgState>().apply {
- mockPkgState(2).let { put(it.packageName, it) }
- mockPkgState(3).let { put(it.packageName, it) }
+ mockPkgState(2, pkgNameToSignature).let { put(it.packageName, it) }
+ mockPkgState(3, pkgNameToSignature).let { put(it.packageName, it) }
}
val restored = ArrayMap<String, DomainVerificationPkgState>().apply {
- mockPkgState(4).let { put(it.packageName, it) }
- mockPkgState(5).let { put(it.packageName, it) }
+ mockPkgState(4, pkgNameToSignature).let { put(it.packageName, it) }
+ mockPkgState(5, pkgNameToSignature).let { put(it.packageName, it) }
}
+ return Triple(attached, pending, restored)
+ }
+
+ @Test
+ fun writeAndReadBackNormal() {
+ val (attached, pending, restored) = mockWriteValues()
val file = tempFolder.newFile().writeXml {
- DomainVerificationPersistence.writeToXml(it, attached, pending, restored)
+ DomainVerificationPersistence.writeToXml(it, attached, pending, restored, null)
}
val xml = file.readText()
@@ -115,8 +125,56 @@
}
@Test
+ fun writeAndReadBackWithSignature() {
+ val (attached, pending, restored) = mockWriteValues()
+ val file = tempFolder.newFile().writeXml {
+ DomainVerificationPersistence.writeToXml(it, attached, pending, restored) {
+ "SIGNATURE_$it"
+ }
+ }
+
+ val (readActive, readRestored) = file.readXml {
+ DomainVerificationPersistence.readFromXml(it)
+ }
+
+ // Assign the signatures to a fresh set of data structures, to ensure the previous write
+ // call did not use the signatures from the data structure. This is because the method is
+ // intended to optionally append signatures, regardless of if the existing data structures
+ // contain them or not.
+ val (attached2, pending2, restored2) = mockWriteValues { "SIGNATURE_$it" }
+
+ assertThat(readActive.values)
+ .containsExactlyElementsIn(attached2.values() + pending2.values)
+ assertThat(readRestored.values).containsExactlyElementsIn(restored2.values)
+
+ (readActive + readRestored).forEach { (_, value) ->
+ assertThat(value.backupSignatureHash).isEqualTo("SIGNATURE_${value.packageName}")
+ }
+ }
+
+ @Test
+ fun writeStateSignatureIfFunctionReturnsNull() {
+ val (attached, pending, restored) = mockWriteValues { "SIGNATURE_$it" }
+ val file = tempFolder.newFile().writeXml {
+ DomainVerificationPersistence.writeToXml(it, attached, pending, restored) { null }
+ }
+
+ val (readActive, readRestored) = file.readXml {
+ DomainVerificationPersistence.readFromXml(it)
+ }
+
+ assertThat(readActive.values)
+ .containsExactlyElementsIn(attached.values() + pending.values)
+ assertThat(readRestored.values).containsExactlyElementsIn(restored.values)
+
+ (readActive + readRestored).forEach { (_, value) ->
+ assertThat(value.backupSignatureHash).isEqualTo("SIGNATURE_${value.packageName}")
+ }
+ }
+
+ @Test
fun readMalformed() {
- val stateZero = mockEmptyPkgState(0).apply {
+ val stateZero = mockEmptyPkgState(0, pkgNameToSignature = { "ACTIVE" }).apply {
stateMap["example.com"] = DomainVerificationState.STATE_SUCCESS
stateMap["example.org"] = DomainVerificationState.STATE_FIRST_VERIFIER_DEFINED
@@ -128,7 +186,7 @@
isLinkHandlingAllowed = true
}
}
- val stateOne = mockEmptyPkgState(1).apply {
+ val stateOne = mockEmptyPkgState(1, pkgNameToSignature = { "RESTORED" }).apply {
// It's valid to have a user selection without any autoVerify domains
userStates[1] = DomainVerificationInternalUserState(1).apply {
addHosts(setOf("example-user1.com", "example-user1.org"))
@@ -156,6 +214,7 @@
packageName="${stateZero.packageName}"
id="${stateZero.id}"
hasAutoVerifyDomains="true"
+ signature="ACTIVE"
>
<state>
<domain name="example.com" state="${
@@ -191,6 +250,7 @@
packageName="${stateOne.packageName}"
id="${stateOne.id}"
hasAutoVerifyDomains="true"
+ signature="RESTORED"
>
<state/>
<user-states>
@@ -226,20 +286,30 @@
private fun mockEmptyPkgState(
id: Int,
- hasAutoVerifyDomains: Boolean = true
+ hasAutoVerifyDomains: Boolean = true,
+ pkgNameToSignature: (String) -> String? = { null }
): DomainVerificationPkgState {
val pkgName = pkgName(id)
val domainSetId = UUID(0L, id.toLong())
- return DomainVerificationPkgState(pkgName, domainSetId, hasAutoVerifyDomains)
+ return DomainVerificationPkgState(
+ pkgName,
+ domainSetId,
+ hasAutoVerifyDomains,
+ ArrayMap(),
+ SparseArray(),
+ pkgNameToSignature(pkgName)
+ )
}
- private fun mockPkgState(id: Int) = mockEmptyPkgState(id).apply {
- stateMap["$packageName.com"] = id
- userStates[id] = DomainVerificationInternalUserState(id).apply {
- addHosts(setOf("$packageName-user.com"))
- isLinkHandlingAllowed = true
- }
- }
+ private fun mockPkgState(id: Int, pkgNameToSignature: (String) -> String? = { null }) =
+ mockEmptyPkgState(id, pkgNameToSignature = pkgNameToSignature)
+ .apply {
+ stateMap["$packageName.com"] = id
+ userStates[id] = DomainVerificationInternalUserState(id).apply {
+ addHosts(setOf("$packageName-user.com"))
+ isLinkHandlingAllowed = true
+ }
+ }
private fun pkgName(id: Int) = "$PKG_PREFIX.pkg$id"
}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt
index b7c6922..26e8d28 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt
@@ -29,6 +29,7 @@
import android.util.SparseArray
import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.test.verify.domain.DomainVerificationTestUtils.mockPackageSettings
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal
import com.android.server.pm.verify.domain.DomainVerificationService
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy
@@ -192,6 +193,7 @@
fun mockPkg() = mockThrowOnUnmocked<AndroidPackage> {
whenever(packageName) { TEST_PKG }
whenever(targetSdkVersion) { Build.VERSION_CODES.S }
+ whenever(isEnabled) { true }
whenever(activities) {
listOf(
ParsedActivity().apply {
@@ -233,11 +235,8 @@
whenever(getName()) { TEST_PKG }
whenever(getPkg()) { mockPkg() }
whenever(domainSetId) { TEST_UUID }
- whenever(userState) {
- SparseArray<PackageUserState>().apply {
- this[0] = PackageUserState()
- }
- }
+ whenever(readUserState(0)) { PackageUserState() }
+ whenever(readUserState(10)) { PackageUserState() }
whenever(getInstantApp(anyInt())) { false }
}
}
@@ -258,8 +257,12 @@
mockThrowOnUnmocked {
whenever(callingUid) { TEST_UID }
whenever(callingUserId) { TEST_USER_ID }
- whenever(getPackageSettingLocked(TEST_PKG)) { mockPkgSetting() }
- whenever(getPackageLocked(TEST_PKG)) { mockPkg() }
+ mockPackageSettings {
+ when (it) {
+ TEST_PKG -> mockPkgSetting()
+ else -> null
+ }
+ }
whenever(schedule(anyInt(), any()))
whenever(scheduleWriteSettings())
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationTestUtils.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationTestUtils.kt
new file mode 100644
index 0000000..e1da727
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationTestUtils.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.verify.domain
+
+import com.android.internal.util.FunctionalUtils
+import com.android.server.pm.PackageSetting
+import com.android.server.pm.verify.domain.DomainVerificationManagerInternal
+import com.android.server.testutils.whenever
+import org.mockito.ArgumentMatchers.any
+import java.util.function.Consumer
+import java.util.function.Function
+
+internal object DomainVerificationTestUtils {
+
+ @Suppress("UNCHECKED_CAST")
+ fun DomainVerificationManagerInternal.Connection.mockPackageSettings(
+ block: (String) -> PackageSetting?
+ ) {
+ whenever(withPackageSettings(any())) {
+ (arguments[0] as Consumer<Function<String, PackageSetting?>>).accept { block(it) }
+ }
+ whenever(withPackageSettingsReturning<Any>(any())) {
+ (arguments[0] as FunctionalUtils.ThrowingFunction<Function<String, PackageSetting?>, *>)
+ .apply { block(it) }
+ }
+ whenever(withPackageSettingsThrowing<Exception>(any())) {
+ (arguments[0] as DomainVerificationManagerInternal.Connection.ThrowingConsumer<
+ Function<String, PackageSetting?>, *>)
+ .accept { block(it) }
+ }
+ whenever(withPackageSettingsReturningThrowing<Any, Exception>(any())) {
+ (arguments[0] as DomainVerificationManagerInternal.Connection.ThrowingFunction<
+ Function<String, PackageSetting?>, *, *>)
+ .apply { block(it) }
+ }
+ }
+}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt
index 54648ab..52ae7a5 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt
@@ -18,6 +18,7 @@
import android.content.Intent
import android.content.pm.PackageManager
+import android.content.pm.PackageUserState
import android.content.pm.parsing.component.ParsedActivity
import android.content.pm.parsing.component.ParsedIntentInfo
import android.content.pm.verify.domain.DomainVerificationManager
@@ -29,6 +30,7 @@
import android.util.ArraySet
import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.test.verify.domain.DomainVerificationTestUtils.mockPackageSettings
import com.android.server.pm.verify.domain.DomainVerificationService
import com.android.server.testutils.mockThrowOnUnmocked
import com.android.server.testutils.whenever
@@ -82,10 +84,13 @@
// Need to provide an internal UID so some permission checks are ignored
whenever(callingUid) { Process.ROOT_UID }
whenever(callingUserId) { 0 }
- whenever(getPackageSettingLocked(PKG_ONE)) { pkg1 }
- whenever(getPackageSettingLocked(PKG_TWO)) { pkg2 }
- whenever(getPackageLocked(PKG_ONE)) { pkg1.getPkg() }
- whenever(getPackageLocked(PKG_TWO)) { pkg2.getPkg() }
+ mockPackageSettings {
+ when (it) {
+ PKG_ONE -> pkg1
+ PKG_TWO -> pkg2
+ else -> null
+ }
+ }
})
addPackage(pkg1)
addPackage(pkg2)
@@ -100,6 +105,7 @@
val pkg = mockThrowOnUnmocked<AndroidPackage> {
whenever(packageName) { pkgName }
whenever(targetSdkVersion) { Build.VERSION_CODES.S }
+ whenever(isEnabled) { true }
val activityList = listOf(
ParsedActivity().apply {
@@ -137,6 +143,8 @@
whenever(this.domainSetId) { domainSetId }
whenever(getInstantApp(anyInt())) { false }
whenever(firstInstallTime) { 0L }
+ whenever(readUserState(0)) { PackageUserState() }
+ whenever(readUserState(1)) { PackageUserState() }
}
@Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 8481961..edfc21d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -28,6 +28,10 @@
import static android.app.AlarmManager.RTC_WAKEUP;
import static android.app.AlarmManager.WINDOW_EXACT;
import static android.app.AlarmManager.WINDOW_HEURISTIC;
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.MODE_DEFAULT;
+import static android.app.AppOpsManager.MODE_ERRORED;
+import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OP_SCHEDULE_EXACT_ALARM;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
@@ -49,6 +53,7 @@
import static com.android.server.alarm.AlarmManagerService.ACTIVE_INDEX;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.APP_STANDBY_BUCKET_CHANGED;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.CHARGING_STATUS_CHANGED;
+import static com.android.server.alarm.AlarmManagerService.AlarmHandler.EXACT_ALARM_DENY_LIST_CHANGED;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_ALARMS;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_QUOTA;
@@ -57,6 +62,7 @@
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_WINDOW;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_CRASH_NON_CLOCK_APPS;
+import static com.android.server.alarm.AlarmManagerService.Constants.KEY_EXACT_ALARM_DENY_LIST;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_LAZY_BATCHING;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_LISTENER_TIMEOUT;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MAX_INTERVAL;
@@ -64,6 +70,7 @@
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MIN_INTERVAL;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MIN_WINDOW;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_PRIORITY_ALARM_DELAY;
+import static com.android.server.alarm.AlarmManagerService.Constants.MAX_EXACT_ALARM_DENY_LIST_SIZE;
import static com.android.server.alarm.AlarmManagerService.FREQUENT_INDEX;
import static com.android.server.alarm.AlarmManagerService.INDEFINITE_DELAY;
import static com.android.server.alarm.AlarmManagerService.IS_WAKEUP_MASK;
@@ -87,8 +94,10 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.Manifest;
import android.app.ActivityManager;
@@ -106,6 +115,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.PermissionChecker;
+import android.content.pm.PackageManagerInternal;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Handler;
@@ -113,13 +123,13 @@
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
@@ -176,6 +186,8 @@
@Mock
private IAppOpsService mIAppOpsService;
@Mock
+ private AppOpsManager mAppOpsManager;
+ @Mock
private DeviceIdleInternal mDeviceIdleInternal;
@Mock
private UsageStatsManagerInternal mUsageStatsManagerInternal;
@@ -184,6 +196,8 @@
@Mock
private ActivityManagerInternal mActivityManagerInternal;
@Mock
+ private PackageManagerInternal mPackageManagerInternal;
+ @Mock
private AppStateTrackerImpl mAppStateTracker;
@Mock
private AlarmManagerService.ClockReceiver mClockReceiver;
@@ -270,6 +284,11 @@
}
@Override
+ int getCallingUid() {
+ return TEST_CALLING_UID;
+ }
+
+ @Override
void setAlarm(int type, long millis) {
mTestTimer.set(type, millis);
}
@@ -279,7 +298,7 @@
}
@Override
- int getSystemUiUid() {
+ int getSystemUiUid(PackageManagerInternal unused) {
return SYSTEM_UI_UID;
}
@@ -344,6 +363,8 @@
() -> LocalServices.getService(DeviceIdleInternal.class));
doReturn(mActivityManagerInternal).when(
() -> LocalServices.getService(ActivityManagerInternal.class));
+ doReturn(mPackageManagerInternal).when(
+ () -> LocalServices.getService(PackageManagerInternal.class));
doReturn(mAppStateTracker).when(() -> LocalServices.getService(AppStateTracker.class));
doReturn(mAppStandbyInternal).when(
() -> LocalServices.getService(AppStandbyInternal.class));
@@ -376,8 +397,10 @@
() -> DeviceConfig.getProperties(
eq(DeviceConfig.NAMESPACE_ALARM_MANAGER), ArgumentMatchers.<String>any()));
- when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(
- mock(AppOpsManager.class));
+ when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
+
+ when(mPackageManagerInternal.getPackageUid(eq(TEST_CALLING_PACKAGE), anyInt(),
+ eq(TEST_CALLING_USER))).thenReturn(TEST_CALLING_UID);
mInjector = new Injector(mMockContext);
mService = new AlarmManagerService(mMockContext, mInjector);
@@ -464,8 +487,15 @@
private void setTestAlarm(int type, long triggerTime, long windowLength,
PendingIntent operation, long interval, int flags, int callingUid, Bundle idleOptions) {
+ setTestAlarm(type, triggerTime, windowLength, operation, interval, flags, callingUid,
+ TEST_CALLING_PACKAGE, idleOptions);
+ }
+
+ private void setTestAlarm(int type, long triggerTime, long windowLength,
+ PendingIntent operation, long interval, int flags, int callingUid,
+ String callingPackage, Bundle idleOptions) {
mService.setImpl(type, triggerTime, windowLength, interval, operation, null, "test", flags,
- null, null, callingUid, TEST_CALLING_PACKAGE, idleOptions);
+ null, null, callingUid, callingPackage, idleOptions);
}
private void setTestAlarmWithListener(int type, long triggerTime, IAlarmListener listener) {
@@ -503,6 +533,12 @@
mService.mConstants.onPropertiesChanged(mDeviceConfigProperties);
}
+ private void setDeviceConfigString(String key, String val) {
+ mDeviceConfigKeys.add(key);
+ doReturn(val).when(mDeviceConfigProperties).getString(eq(key), anyString());
+ mService.mConstants.onPropertiesChanged(mDeviceConfigProperties);
+ }
+
/**
* Lowers quotas to make testing feasible. Careful while calling as this will replace any
* existing settings for the calling test.
@@ -602,6 +638,47 @@
}
@Test
+ public void updatingExactAlarmDenyList() {
+ ArraySet<String> denyListed = new ArraySet<>(new String[]{
+ "com.example.package1",
+ "com.example.package2",
+ "com.example.package3",
+ });
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST,
+ "com.example.package1,com.example.package2,com.example.package3");
+ assertEquals(denyListed, mService.mConstants.EXACT_ALARM_DENY_LIST);
+
+
+ denyListed = new ArraySet<>(new String[]{
+ "com.example.package1",
+ "com.example.package4",
+ });
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST,
+ "com.example.package1,com.example.package4");
+ assertEquals(denyListed, mService.mConstants.EXACT_ALARM_DENY_LIST);
+
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, "");
+ assertEquals(0, mService.mConstants.EXACT_ALARM_DENY_LIST.size());
+ }
+
+ @Test
+ public void exactAlarmDenyListMaxSize() {
+ final ArraySet<String> expectedSet = new ArraySet<>();
+ final StringBuilder sb = new StringBuilder("package1");
+ expectedSet.add("package1");
+ for (int i = 2; i <= 2 * MAX_EXACT_ALARM_DENY_LIST_SIZE; i++) {
+ sb.append(",package");
+ sb.append(i);
+ if (i <= MAX_EXACT_ALARM_DENY_LIST_SIZE) {
+ expectedSet.add("package" + i);
+ }
+ }
+ assertEquals(MAX_EXACT_ALARM_DENY_LIST_SIZE, expectedSet.size());
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, sb.toString());
+ assertEquals(expectedSet, mService.mConstants.EXACT_ALARM_DENY_LIST);
+ }
+
+ @Test
public void positiveWhileIdleQuotas() {
setDeviceConfigInt(KEY_ALLOW_WHILE_IDLE_QUOTA, -3);
assertEquals(1, mService.mConstants.ALLOW_WHILE_IDLE_QUOTA);
@@ -1717,21 +1794,70 @@
}
@Test
- public void canScheduleExactAlarms() throws RemoteException {
+ public void hasScheduleExactAlarmBinderCallEmptyDenyList() throws RemoteException {
doReturn(PermissionChecker.PERMISSION_GRANTED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
- assertTrue(mBinder.canScheduleExactAlarms());
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+ assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
- assertFalse(mBinder.canScheduleExactAlarms());
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+ assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ }
- doReturn(PermissionChecker.PERMISSION_SOFT_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
- assertFalse(mBinder.canScheduleExactAlarms());
+ @Test
+ public void hasScheduleExactAlarmBinderCallWithDenyList() throws RemoteException {
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, TEST_CALLING_PACKAGE);
+
+ when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
+ TEST_CALLING_PACKAGE)).thenReturn(MODE_ERRORED);
+
+ assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
+
+ when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
+ TEST_CALLING_PACKAGE)).thenReturn(MODE_DEFAULT);
+
+ assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
+
+ when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
+ TEST_CALLING_PACKAGE)).thenReturn(MODE_IGNORED);
+
+ assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
+
+ when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
+ TEST_CALLING_PACKAGE)).thenReturn(MODE_ALLOWED);
+
+ doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+
+ assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+
+ doReturn(PermissionChecker.PERMISSION_GRANTED).when(
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+
+ assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), times(2));
}
@Test
@@ -1757,8 +1883,9 @@
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_HEURISTIC, 0,
FLAG_ALLOW_WHILE_IDLE, getNewMockPendingIntent(), null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM), never());
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
}
@@ -1775,7 +1902,7 @@
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), isNull());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
}
@Test
@@ -1792,7 +1919,7 @@
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_ALLOW_WHILE_IDLE_COMPAT | FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1812,7 +1939,7 @@
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), anyLong(), eq(0L),
eq(alarmPi), isNull(), isNull(), eq(FLAG_ALLOW_WHILE_IDLE_COMPAT), isNull(),
- isNull(), eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1832,7 +1959,7 @@
verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
- isNull(), eq(alarmClock), eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), isNull());
+ isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
}
@Test
@@ -1842,8 +1969,9 @@
anyString(), any(UserHandle.class)));
doReturn(PermissionChecker.PERMISSION_GRANTED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
final PendingIntent alarmPi = getNewMockPendingIntent();
final AlarmManager.AlarmClockInfo alarmClock = mock(AlarmManager.AlarmClockInfo.class);
@@ -1851,14 +1979,15 @@
alarmPi, null, null, null, alarmClock);
// Correct permission checks are invoked.
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
- isNull(), eq(alarmClock), eq(Process.myUid()), eq(TEST_CALLING_PACKAGE),
+ isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE),
bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
@@ -1874,8 +2003,9 @@
anyString(), any(UserHandle.class)));
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
final PendingIntent alarmPi = getNewMockPendingIntent();
@@ -1887,9 +2017,9 @@
} catch (SecurityException se) {
// Expected.
}
-
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
}
@@ -1904,15 +2034,16 @@
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
0, alarmPi, null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1926,24 +2057,24 @@
anyString(), any(UserHandle.class)));
// If permission is denied, only then allowlist will be checked.
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
final PendingIntent alarmPi = getNewMockPendingIntent();
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
0, alarmPi, null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
- verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(Process.myUid()));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+ verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
- final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
- System.out.println("what got captured: " + bundleCaptor.getValue());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
}
@Test
@@ -1957,15 +2088,16 @@
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_ALLOW_WHILE_IDLE | FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1979,23 +2111,25 @@
anyString(), any(UserHandle.class)));
// If permission is denied, only then allowlist will be checked.
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
final PendingIntent alarmPi = getNewMockPendingIntent();
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
- verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(Process.myUid()));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+ verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_ALLOW_WHILE_IDLE_COMPAT | FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2011,8 +2145,9 @@
anyString(), any(UserHandle.class)));
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(false);
final PendingIntent alarmPi = getNewMockPendingIntent();
@@ -2030,8 +2165,9 @@
} catch (SecurityException se) {
// Expected.
}
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM), times(2));
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), times(2));
verify(mDeviceIdleInternal, times(2)).isAppOnWhitelist(anyInt());
}
@@ -2047,14 +2183,15 @@
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 4321, WINDOW_HEURISTIC, 0,
FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
- verify(() -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM), never());
+ verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(4321L), anyLong(), eq(0L),
eq(alarmPi), isNull(), isNull(), eq(FLAG_ALLOW_WHILE_IDLE_COMPAT), isNull(),
- isNull(), eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+ isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2068,10 +2205,11 @@
anyString(), any(UserHandle.class)));
doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
- () -> PermissionChecker.checkCallingOrSelfPermissionForPreflight(mMockContext,
- Manifest.permission.SCHEDULE_EXACT_ALARM));
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
- when(mAppStateTracker.isUidPowerSaveUserExempt(Process.myUid())).thenReturn(true);
+ when(mAppStateTracker.isUidPowerSaveUserExempt(TEST_CALLING_UID)).thenReturn(true);
final PendingIntent alarmPi = getNewMockPendingIntent();
mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
@@ -2081,7 +2219,7 @@
verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
eq(alarmPi), isNull(), isNull(),
eq(FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_STANDALONE), isNull(), isNull(),
- eq(Process.myUid()), eq(TEST_CALLING_PACKAGE), isNull());
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
}
@Test
@@ -2101,9 +2239,79 @@
}
@Test
+ public void denyListPackagesAdded() {
+ mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[]{"p1", "p2", "p3"});
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, "p2,p4,p5");
+ assertAndHandleMessageSync(EXACT_ALARM_DENY_LIST_CHANGED);
+
+ ArraySet<String> added = new ArraySet<>(new String[]{"p4", "p5"});
+ verify(mService).handlePackagesAddedToExactAlarmsDenyListLocked(eq(added));
+ }
+
+ @Test
+ public void denyListPackagesRemoved() {
+ clearInvocations(mService.mHandler);
+ mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[]{"p1", "p2", "p3"});
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, "p2");
+ verifyNoMoreInteractions(mService.mHandler);
+ }
+
+ @Test
+ public void removeExactAlarmsOnPackageAddedToDenyList() {
+ doReturn(true).when(
+ () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
+ anyString(), any(UserHandle.class)));
+
+ // basic exact alarm
+ setTestAlarm(ELAPSED_REALTIME, 1, 0, getNewMockPendingIntent(), 0, 0, TEST_CALLING_UID,
+ null);
+ // exact and allow-while-idle alarm
+ setTestAlarm(ELAPSED_REALTIME, 2, 0, getNewMockPendingIntent(), 0, FLAG_ALLOW_WHILE_IDLE,
+ TEST_CALLING_UID, null);
+ // alarm clock
+ setWakeFromIdle(RTC_WAKEUP, 3, getNewMockPendingIntent());
+
+ final PendingIntent inexact = getNewMockPendingIntent();
+ setTestAlarm(ELAPSED_REALTIME, 4, 10, inexact, 0, 0, TEST_CALLING_UID, null);
+
+ final PendingIntent inexactAwi = getNewMockPendingIntent();
+ setTestAlarm(ELAPSED_REALTIME, 5, 10, inexactAwi, 0, FLAG_ALLOW_WHILE_IDLE,
+ TEST_CALLING_UID, null);
+
+ final String differentPackage = "different.package";
+ final PendingIntent exactButDifferentPackage = getNewMockPendingIntent(
+ TEST_CALLING_UID, differentPackage);
+ setTestAlarm(ELAPSED_REALTIME, 6, 0, exactButDifferentPackage, 0, 0,
+ TEST_CALLING_UID, differentPackage, null);
+ assertEquals(6, mService.mAlarmStore.size());
+
+ when(mAppOpsManager.checkOpNoThrow(eq(OP_SCHEDULE_EXACT_ALARM), anyInt(),
+ anyString())).thenReturn(MODE_DEFAULT);
+ setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, TEST_CALLING_PACKAGE);
+ assertAndHandleMessageSync(EXACT_ALARM_DENY_LIST_CHANGED);
+ verify(mService).handlePackagesAddedToExactAlarmsDenyListLocked(
+ argThat(set -> (set.size() == 1 && set.contains(TEST_CALLING_PACKAGE))));
+
+ final ArrayList<Alarm> remaining = mService.mAlarmStore.asList();
+ assertEquals(3, remaining.size());
+ assertTrue("Basic inexact alarm removed",
+ remaining.removeIf(a -> a.matches(inexact, null)));
+ assertTrue("Inexact allow-while-idle alarm removed",
+ remaining.removeIf(a -> a.matches(inexactAwi, null)));
+ assertTrue("Alarm from different package removed",
+ remaining.removeIf(a -> a.matches(exactButDifferentPackage, null)));
+
+ // Mock should return false by default.
+ verify(mDeviceIdleInternal, atLeastOnce()).isAppOnWhitelist(
+ UserHandle.getAppId(TEST_CALLING_UID));
+ }
+
+ @Test
public void opScheduleExactAlarmRevoked() throws Exception {
- when(mIAppOpsService.checkOperation(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
- TEST_CALLING_PACKAGE)).thenReturn(AppOpsManager.MODE_ERRORED);
+ doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
+ eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
mIAppOpsCallback.opChanged(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID, TEST_CALLING_PACKAGE);
assertAndHandleMessageSync(REMOVE_EXACT_ALARMS);
verify(mService).removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID,
@@ -2149,7 +2357,8 @@
remaining.removeIf(a -> a.matches(exactButDifferentUid, null)));
// Mock should return false by default.
- verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
+ verify(mDeviceIdleInternal, atLeastOnce()).isAppOnWhitelist(
+ UserHandle.getAppId(TEST_CALLING_UID));
}
@Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActiveServicesTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActiveServicesTest.java
deleted file mode 100644
index 0633ab9..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/am/ActiveServicesTest.java
+++ /dev/null
@@ -1,95 +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.server.am;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static com.android.server.am.ActiveServices.FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-
-import android.app.compat.CompatChanges;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-
-
-@RunWith(AndroidJUnit4.class)
-public class ActiveServicesTest {
-
- private MockitoSession mMockingSession;
-
- @Before
- public void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .mockStatic(CompatChanges.class)
- .startMocking();
- }
-
- @After
- public void tearDown() {
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- private void checkPackageExempted(String pkg, int uid, boolean expected) {
- assertEquals("Package=" + pkg + " uid=" + uid,
- expected, ActiveServices.isPackageExemptedFromFgsRestriction(pkg, uid));
- }
-
- @Test
- public void isPackageExemptedFromFgsRestriction() {
- // Compat changes are enabled by default.
- when(CompatChanges.isChangeEnabled(anyLong(), anyInt())).thenReturn(true);
-
- checkPackageExempted("", 1, false);
- checkPackageExempted("abc", 1, false);
- checkPackageExempted("com.random", 1, false);
-
- // This package is exempted but not its subpackages.
- checkPackageExempted("com.google.pixel.exo.bootstrapping", 1, true);
- checkPackageExempted("com.google.pixel.exo.bootstrapping.subpackage", 1, false);
-
- // Subpackages are also exempted.
- checkPackageExempted("com.android.webview", 1, true);
- checkPackageExempted("com.android.webview.beta", 1, true);
- checkPackageExempted("com.chrome", 1, true);
- checkPackageExempted("com.chrome.canary", 1, true);
-
- checkPackageExempted("com.android.webviewx", 1, false);
-
- // Now toggle the compat ID for a specific UID.
- when(CompatChanges.isChangeEnabled(FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID, 10))
- .thenReturn(false);
- // Exempted package, but compat id is disabled for the UID.
- checkPackageExempted("com.android.webview", 10, false);
-
- // Exempted package, but compat id is still enabled for the UID.
- checkPackageExempted("com.android.webview", 11, true);
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java b/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
index 8ecb071..e093f13 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.doReturn;
+import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorManager;
@@ -129,10 +130,7 @@
triggerFaceDown();
// Phone flips
- for (int i = 0; i < 10; i++) {
- advanceTime(Duration.ofMillis(5));
- mFaceDownDetector.onSensorChanged(createTestEvent(0.5f, 1.0f, 0.0f));
- }
+ triggerUnflip();
assertThat(mOnFaceDownCalls).isEqualTo(1);
assertThat(mOnFaceDownExitCalls).isEqualTo(1);
@@ -184,6 +182,47 @@
assertThat(mOnFaceDownCalls).isEqualTo(1);
}
+ @Test
+ public void faceDownToScreenOff_followedByScreenOnAndUserInteraction_doesNotDisable()
+ throws Exception {
+ mFaceDownDetector.systemReady(sContext);
+ // Face down to screen off
+ triggerFaceDown();
+ mFaceDownDetector.mScreenReceiver.onReceive(sContext, new Intent(Intent.ACTION_SCREEN_OFF));
+
+ // Screen on
+ mFaceDownDetector.mScreenReceiver.onReceive(sContext, new Intent(Intent.ACTION_SCREEN_ON));
+
+ // User interaction
+ mFaceDownDetector.userActivity(PowerManager.USER_ACTIVITY_EVENT_TOUCH);
+ waitForListenerToHandle();
+
+ // Attempt another face down to see if disabled
+ triggerFaceDown();
+
+ assertThat(mOnFaceDownCalls).isEqualTo(2);
+ }
+
+ @Test
+ public void faceDownUserInteraction_disablesDetector() throws Exception {
+ mFaceDownDetector.systemReady(sContext);
+ triggerFaceDown();
+ mFaceDownDetector.userActivity(PowerManager.USER_ACTIVITY_EVENT_TOUCH);
+ waitForListenerToHandle();
+
+ triggerUnflip();
+ triggerFaceDown();
+
+ assertThat(mOnFaceDownCalls).isEqualTo(1);
+ }
+
+ private void triggerUnflip() throws Exception {
+ for (int i = 0; i < 10; i++) {
+ advanceTime(Duration.ofMillis(5));
+ mFaceDownDetector.onSensorChanged(createTestEvent(0.5f, 1.0f, 0.0f));
+ }
+ }
+
private void triggerFaceDown() throws Exception {
// Face up
// Using 0.5 on x to simulate constant acceleration, such as a sloped surface.
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java
new file mode 100644
index 0000000..7179c60
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java
@@ -0,0 +1,644 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS;
+import static android.view.accessibility.AccessibilityNodeInfo.ROOT_NODE_ID;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.os.RemoteException;
+import android.view.AccessibilityInteractionController;
+import android.view.View;
+import android.view.ViewRootImpl;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeIdManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeProvider;
+import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests that verify expected node and prefetched node results when finding a view by node id. We
+ * send some requests to the controller via View methods to control message timing.
+ */
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityInteractionControllerNodeRequestsTest {
+ private AccessibilityInteractionController mAccessibilityInteractionController;
+ @Mock
+ private IAccessibilityInteractionConnectionCallback mMockClientCallback1;
+ @Mock
+ private IAccessibilityInteractionConnectionCallback mMockClientCallback2;
+
+ @Captor
+ private ArgumentCaptor<AccessibilityNodeInfo> mFindInfoCaptor;
+ @Captor private ArgumentCaptor<List<AccessibilityNodeInfo>> mPrefetchInfoListCaptor;
+
+ private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ private static final int MOCK_CLIENT_1_THREAD_AND_PROCESS_ID = 1;
+ private static final int MOCK_CLIENT_2_THREAD_AND_PROCESS_ID = 2;
+
+ private static final String FRAME_LAYOUT_DESCRIPTION = "frameLayout";
+ private static final String TEXT_VIEW_1_DESCRIPTION = "textView1";
+ private static final String TEXT_VIEW_2_DESCRIPTION = "textView2";
+
+ private TestFrameLayout mFrameLayout;
+ private TestTextView mTextView1;
+ private TestTextView2 mTextView2;
+
+ private boolean mSendClient1RequestForTextAfterTextPrefetched;
+ private boolean mSendClient2RequestForTextAfterTextPrefetched;
+ private boolean mSendRequestForTextAndIncludeUnImportantViews;
+ private boolean mSendClient1RequestForRootAfterTextPrefetched;
+ private int mMockClient1InteractionId;
+ private int mMockClient2InteractionId;
+
+ @Before
+ public void setUp() throws Throwable {
+ MockitoAnnotations.initMocks(this);
+
+ mInstrumentation.runOnMainSync(() -> {
+ final Context context = mInstrumentation.getTargetContext();
+ final ViewRootImpl viewRootImpl = new ViewRootImpl(context, context.getDisplay());
+
+ mFrameLayout = new TestFrameLayout(context);
+ mTextView1 = new TestTextView(context);
+ mTextView2 = new TestTextView2(context);
+
+ mFrameLayout.addView(mTextView1);
+ mFrameLayout.addView(mTextView2);
+
+ // The controller retrieves views through this manager, and registration happens on
+ // when attached to a window, which we don't have. We can simply reference FrameLayout
+ // with ROOT_NODE_ID
+ AccessibilityNodeIdManager.getInstance().registerViewWithId(
+ mTextView1, mTextView1.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().registerViewWithId(
+ mTextView2, mTextView2.getAccessibilityViewId());
+
+ try {
+ viewRootImpl.setView(mFrameLayout, new WindowManager.LayoutParams(), null);
+
+ } catch (WindowManager.BadTokenException e) {
+ // activity isn't running, we will ignore BadTokenException.
+ }
+
+ mAccessibilityInteractionController =
+ new AccessibilityInteractionController(viewRootImpl);
+ });
+
+ }
+
+ @After
+ public void tearDown() throws Throwable {
+ AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
+ mTextView1.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
+ mTextView2.getAccessibilityViewId());
+ }
+
+ /**
+ * Tests a basic request for the root node with prefetch flag
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_DESCENDANTS}
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootView_withOneClient_shouldReturnRootNodeAndPrefetchDescendants()
+ throws RemoteException {
+ // Request for our FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mInstrumentation.waitForIdleSync();
+
+ // Verify we get FrameLayout
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+
+ verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
+ // The descendants are our two TextViews
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(2, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+
+ }
+
+ /**
+ * Tests a basic request for TestTextView1's node with prefetch flag
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_SIBLINGS}
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindTextView_withOneClient_shouldReturnNodeAndPrefetchedSiblings()
+ throws RemoteException {
+ // Request for TextView1
+ sendNodeRequestToController(AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(), AccessibilityNodeProvider.HOST_VIEW_ID),
+ mMockClientCallback1, mMockClient1InteractionId, FLAG_PREFETCH_SIBLINGS);
+ mInstrumentation.waitForIdleSync();
+
+ // Verify we get TextView1
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, infoSentToService.getContentDescription());
+
+ // Verify the prefetched sibling of TextView1 is TextView2
+ verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
+ // TextView2 is the prefetched sibling
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(1, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ }
+
+ /**
+ * Tests a series of controller requests to prevent prefetching.
+ * Request 1: Client 1 requests the root node
+ * Request 2: When the root node is initialized in
+ * {@link TestFrameLayout#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)},
+ * Client 2 requests TestTextView1's node
+ *
+ * Request 2 on the queue prevents prefetching for Request 1.
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootAndTextNodes_withTwoClients_shouldPreventClient1Prefetch()
+ throws RemoteException {
+ mFrameLayout.setAccessibilityDelegate(new View.AccessibilityDelegate() {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ // Enqueue a request when this node is found from a different service for
+ // TextView1
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId, FLAG_PREFETCH_SIBLINGS);
+ }
+ });
+ // Client 1 request for FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ mInstrumentation.waitForIdleSync();
+
+ // Verify client 1 gets FrameLayout
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+
+ // The second request is put in the queue in the FrameLayout's onInitializeA11yNodeInfo,
+ // meaning prefetching is interrupted and does not even begin for the first request
+ verify(mMockClientCallback1, never())
+ .setPrefetchAccessibilityNodeInfoResult(anyList(), anyInt());
+
+ // Verify client 2 gets TextView1
+ verify(mMockClientCallback2).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient2InteractionId));
+ infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, infoSentToService.getContentDescription());
+
+ // Verify the prefetched sibling of TextView1 is TextView2 (FLAG_PREFETCH_SIBLINGS)
+ verify(mMockClientCallback2).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient2InteractionId));
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(1, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ }
+
+ /**
+ * Tests a series of controller same-service requests to interrupt prefetching and satisfy a
+ * pending node request.
+ * Request 1: Request the root node
+ * Request 2: When TextTextView1's node is initialized as part of Request 1's prefetching,
+ * request TestTextView1's node
+ *
+ * Request 1 prefetches TestTextView1's node, is interrupted by a pending request, and checks
+ * if its prefetched nodes satisfy any pending requests. It satisfies Request 2's request for
+ * TestTextView1's node. Request 2 is fulfilled, so it is removed from queue and does not
+ * prefetch. TestTextView1 is removed from Request's 1's prefetched results, meaning the list
+ * is empty.
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootAndTextNode_withOneClient_shouldInterruptPrefetchAndSatisfyPendingMsg()
+ throws RemoteException {
+ mSendClient1RequestForTextAfterTextPrefetched = true;
+
+ mTextView1.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ if (mSendClient1RequestForTextAfterTextPrefetched) {
+ // Prevent a loop when processing second request
+ mSendClient1RequestForTextAfterTextPrefetched = false;
+ // TextView1 is prefetched here after the FrameLayout is found. Now enqueue a
+ // same-client request for TextView1
+ sendNodeRequestToController(nodeId, mMockClientCallback1,
+ ++mMockClient1InteractionId, FLAG_PREFETCH_SIBLINGS);
+
+ }
+ }
+ });
+ // Client 1 requests FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ // Flush out all messages
+ mInstrumentation.waitForIdleSync();
+
+ // When TextView1 is prefetched for FrameLayout, we put a message on the queue in
+ // TextView1's onInitializeA11yNodeInfo that requests for TextView1. The service thus get
+ // two node results for FrameLayout and TextView1.
+ verify(mMockClientCallback1, times(2))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
+
+ List<AccessibilityNodeInfo> foundNodes = mFindInfoCaptor.getAllValues();
+ assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, foundNodes.get(1).getContentDescription());
+
+ // The controller will look at FrameLayout's prefetched nodes and find matching nodes in
+ // pending requests. The prefetched TextView1 matches the second request. This is removed
+ // from the first request's prefetch list, which is now empty. The second
+ // request was removed from queue and prefetching for this request never occurred.
+ verify(mMockClientCallback1, never())
+ .setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
+ eq(mMockClient1InteractionId - 1));
+ }
+
+ /**
+ * Tests a series of controller same-service requests to interrupt prefetching and satisfy a
+ * pending node request.
+ * Request 1: Request the root node
+ * Request 2: When TextTextView1's node is initialized as part of Request 1's prefetching,
+ * request the root node
+ *
+ * Request 1 prefetches TestTextView1's node, is interrupted by a pending request, and checks
+ * if its prefetched nodes satisfy any pending requests. It satisfies Request 2's request for
+ * the root node. Request 2 is fulfilled, so it is removed from queue and does not
+ * prefetch.
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRoot_withOneClient_shouldInterruptPrefetchAndSatisfyPendingMsg()
+ throws RemoteException {
+ mSendClient1RequestForRootAfterTextPrefetched = true;
+
+ mTextView1.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mFrameLayout.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ if (mSendClient1RequestForRootAfterTextPrefetched) {
+ // Prevent a loop when processing second request
+ mSendClient1RequestForRootAfterTextPrefetched = false;
+ // TextView1 is prefetched here after the FrameLayout is found. Now enqueue a
+ // same-client request for FrameLayout
+ sendNodeRequestToController(nodeId, mMockClientCallback1,
+ ++mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ }
+ }
+ });
+ // Client 1 requests FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ // Flush out all messages
+ mInstrumentation.waitForIdleSync();
+
+ // When TextView1 is prefetched for FrameLayout, we put a message on the queue in
+ // TextView1's onInitializeA11yNodeInfo that requests for TextView1. The service thus gets
+ // two node results for FrameLayout and TextView1.
+ verify(mMockClientCallback1, times(2))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
+
+ List<AccessibilityNodeInfo> foundNodes = mFindInfoCaptor.getAllValues();
+ assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
+ assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(1).getContentDescription());
+
+ // The controller will look at FrameLayout's prefetched nodes and find matching nodes in
+ // pending requests. The first requested node (FrameLayout) is also checked, and this
+ // satifies the second request. The second request is removed from queue and prefetching
+ // for this request never occurs.
+ verify(mMockClientCallback1, times(1))
+ .setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
+ eq(mMockClient1InteractionId - 1));
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(1, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ }
+
+ /**
+ * Like above, but tests a series of controller requests from different services to interrupt
+ * prefetching and satisfy a pending node request.
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootAndTextNode_withTwoClients_shouldInterruptPrefetchAndSatisfyPendingMsg()
+ throws RemoteException {
+ mSendClient2RequestForTextAfterTextPrefetched = true;
+ mTextView1.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ if (mSendClient2RequestForTextAfterTextPrefetched) {
+ mSendClient2RequestForTextAfterTextPrefetched = false;
+ // TextView1 is prefetched here. Now enqueue client 2's request for
+ // TextView1
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId, FLAG_PREFETCH_SIBLINGS);
+ }
+ }
+ });
+ // Client 1 requests FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ mInstrumentation.waitForIdleSync();
+
+ // Verify client 1 gets FrameLayout
+ verify(mMockClientCallback1, times(1))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
+ assertEquals(FRAME_LAYOUT_DESCRIPTION,
+ mFindInfoCaptor.getValue().getContentDescription());
+
+ // Verify client 1 doesn't have prefetched nodes
+ verify(mMockClientCallback1, never())
+ .setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
+ eq(mMockClient1InteractionId));
+
+ // Verify client 2 gets TextView1
+ verify(mMockClientCallback2, times(1))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
+
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, mFindInfoCaptor.getValue().getContentDescription());
+
+ // The second request was removed from queue and prefetching for this client request never
+ // occurred as it was satisfied.
+ verify(mMockClientCallback2, never())
+ .setPrefetchAccessibilityNodeInfoResult(anyList(), anyInt());
+
+ }
+
+ @Test
+ public void testFindNodeById_withTwoDifferentPrefetchFlags_shouldNotSatisfyPendingRequest()
+ throws RemoteException {
+ mSendRequestForTextAndIncludeUnImportantViews = true;
+ mTextView1.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ if (mSendRequestForTextAndIncludeUnImportantViews) {
+ mSendRequestForTextAndIncludeUnImportantViews = false;
+ // TextView1 is prefetched here for client 1. Now enqueue a request from a
+ // different client that holds different fetch flags for TextView1
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId,
+ FLAG_PREFETCH_SIBLINGS | FLAG_INCLUDE_NOT_IMPORTANT_VIEWS);
+ }
+ }
+ });
+
+ // Mockito does not make copies of objects when called. It holds references, so
+ // the captor would point to client 2's results after all requests are processed. Verify
+ // prefetched node immediately
+ doAnswer(invocation -> {
+ List<AccessibilityNodeInfo> prefetched = invocation.getArgument(0);
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetched.get(0).getContentDescription());
+ return null;
+ }).when(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(anyList(),
+ eq(mMockClient1InteractionId));
+
+ // Client 1 requests FrameLayout
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+
+ mInstrumentation.waitForIdleSync();
+
+ // Verify client 1 gets FrameLayout
+ verify(mMockClientCallback1, times(1))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(),
+ eq(mMockClient1InteractionId));
+
+ assertEquals(FRAME_LAYOUT_DESCRIPTION,
+ mFindInfoCaptor.getValue().getContentDescription());
+
+ // Verify client 1 has prefetched results. The only prefetched node is TextView1
+ // (from above doAnswer)
+ verify(mMockClientCallback1, times(1))
+ .setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
+ eq(mMockClient1InteractionId));
+
+ // Verify client 2 gets TextView1
+ verify(mMockClientCallback2, times(1))
+ .setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(),
+ eq(mMockClient2InteractionId));
+ assertEquals(TEXT_VIEW_1_DESCRIPTION,
+ mFindInfoCaptor.getValue().getContentDescription());
+ // Verify client 2 has TextView2 as a prefetched node
+ verify(mMockClientCallback2, times(1))
+ .setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
+ eq(mMockClient2InteractionId));
+ List<AccessibilityNodeInfo> prefetchedNode = mPrefetchInfoListCaptor.getValue();
+ assertEquals(1, prefetchedNode.size());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNode.get(0).getContentDescription());
+ }
+
+ private void sendNodeRequestToController(long requestedNodeId,
+ IAccessibilityInteractionConnectionCallback callback, int interactionId,
+ int prefetchFlags) {
+ final int processAndThreadId = callback == mMockClientCallback1
+ ? MOCK_CLIENT_1_THREAD_AND_PROCESS_ID
+ : MOCK_CLIENT_2_THREAD_AND_PROCESS_ID;
+
+ mAccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdClientThread(
+ requestedNodeId,
+ null, interactionId,
+ callback, prefetchFlags,
+ processAndThreadId,
+ processAndThreadId, null, null);
+
+ }
+
+ private class TestFrameLayout extends FrameLayout {
+
+ TestFrameLayout(Context context) {
+ super(context);
+ }
+
+ @Override
+ public int getWindowVisibility() {
+ // We aren't attached to a window so let's pretend
+ return VISIBLE;
+ }
+
+ @Override
+ public boolean isShown() {
+ // Controller check
+ return true;
+ }
+
+ @Override
+ public int getAccessibilityViewId() {
+ // static id doesn't reset after tests so return the same one
+ return 0;
+ }
+
+ @Override
+ public void addChildrenForAccessibility(ArrayList<View> outChildren) {
+ // ViewGroup#addChildrenForAccessbility sorting logic will switch these two
+ outChildren.add(mTextView1);
+ outChildren.add(mTextView2);
+ }
+
+ @Override
+ public boolean includeForAccessibility() {
+ return true;
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setContentDescription(FRAME_LAYOUT_DESCRIPTION);
+ }
+ }
+
+ private class TestTextView extends TextView {
+ TestTextView(Context context) {
+ super(context);
+ }
+
+ @Override
+ public int getWindowVisibility() {
+ return VISIBLE;
+ }
+
+ @Override
+ public boolean isShown() {
+ return true;
+ }
+
+ @Override
+ public int getAccessibilityViewId() {
+ return 1;
+ }
+
+ @Override
+ public boolean includeForAccessibility() {
+ return true;
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
+ }
+ }
+
+ private class TestTextView2 extends TextView {
+ TestTextView2(Context context) {
+ super(context);
+ }
+
+ @Override
+ public int getWindowVisibility() {
+ return VISIBLE;
+ }
+
+ @Override
+ public boolean isShown() {
+ return true;
+ }
+
+ @Override
+ public int getAccessibilityViewId() {
+ return 2;
+ }
+
+ @Override
+ public boolean includeForAccessibility() {
+ return true;
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setContentDescription(TEXT_VIEW_2_DESCRIPTION);
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java b/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
index 7afcbf7..5de8a7a 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.annotation.NonNull;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.PackageManager;
@@ -38,6 +39,11 @@
import org.junit.Before;
import org.junit.Test;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
public class PlatformLoggerTest {
private static final int TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS = 100;
private static final int TEST_DEFAULT_SAMPLING_RATIO = 10;
@@ -57,15 +63,23 @@
};
}
+ static int calculateHashCodeMd5withBigInteger(@NonNull String str) throws
+ NoSuchAlgorithmException, UnsupportedEncodingException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(str.getBytes(/*charsetName=*/ "UTF-8"));
+ byte[] digest = md.digest();
+ return new BigInteger(digest).intValue();
+ }
+
@Test
- public void testcreateExtraStatsLocked_nullSamplingRatioMap_returnsDefaultSamplingRatio() {
+ public void testCreateExtraStatsLocked_nullSamplingRatioMap_returnsDefaultSamplingRatio() {
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
UserHandle.USER_NULL,
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
TEST_DEFAULT_SAMPLING_RATIO,
- /*samplingRatioMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
// Make sure default sampling ratio is used if samplingMap is not provided.
assertThat(logger.createExtraStatsLocked(TEST_PACKAGE_NAME,
@@ -84,7 +98,7 @@
@Test
- public void testcreateExtraStatsLocked_with_samplingRatioMap_returnsConfiguredSamplingRatio() {
+ public void testCreateExtraStatsLocked_with_samplingRatioMap_returnsConfiguredSamplingRatio() {
int putDocumentSamplingRatio = 1;
int querySamplingRatio = 2;
final SparseIntArray samplingRatios = new SparseIntArray();
@@ -98,8 +112,8 @@
TEST_DEFAULT_SAMPLING_RATIO,
samplingRatios));
- // The default sampling ratio should be used if no sampling ratio is
- // provided for certain call type.
+ // The default sampling ratio should be used if no sampling ratio is
+ // provided for certain call type.
assertThat(logger.createExtraStatsLocked(TEST_PACKAGE_NAME,
CallStats.CALL_TYPE_INITIALIZE).mSamplingRatio).isEqualTo(
TEST_DEFAULT_SAMPLING_RATIO);
@@ -118,6 +132,70 @@
}
@Test
+ public void testCalculateHashCode_MD5_int32_shortString()
+ throws NoSuchAlgorithmException, UnsupportedEncodingException {
+ final String str1 = "d1";
+ final String str2 = "d2";
+
+ int hashCodeForStr1 = PlatformLogger.calculateHashCodeMd5(str1);
+
+ // hashing should be stable
+ assertThat(hashCodeForStr1).isEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str1));
+ assertThat(hashCodeForStr1).isNotEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str2));
+ }
+
+ @Test
+ public void testGetCalculateCode_MD5_int32_mediumString()
+ throws NoSuchAlgorithmException, UnsupportedEncodingException {
+ final String str1 = "Siblings";
+ final String str2 = "Teheran";
+
+ int hashCodeForStr1 = PlatformLogger.calculateHashCodeMd5(str1);
+
+ // hashing should be stable
+ assertThat(hashCodeForStr1).isEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str1));
+ assertThat(hashCodeForStr1).isNotEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str2));
+ }
+
+ @Test
+ public void testCalculateHashCode_MD5_int32_longString() throws NoSuchAlgorithmException,
+ UnsupportedEncodingException {
+ final String str1 = "abcdefghijkl-mnopqrstuvwxyz";
+ final String str2 = "abcdefghijkl-mnopqrstuvwxy123";
+
+ int hashCodeForStr1 = PlatformLogger.calculateHashCodeMd5(str1);
+
+ // hashing should be stable
+ assertThat(hashCodeForStr1).isEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str1));
+ assertThat(hashCodeForStr1).isNotEqualTo(
+ PlatformLogger.calculateHashCodeMd5(str2));
+ }
+
+ @Test
+ public void testCalculateHashCode_MD5_int32_sameAsBigInteger_intValue() throws
+ NoSuchAlgorithmException, UnsupportedEncodingException {
+ final String emptyStr = "";
+ final String shortStr = "a";
+ final String mediumStr = "Teheran";
+ final String longStr = "abcd-efgh-ijkl-mnop-qrst-uvwx-yz";
+
+ int emptyHashCode = PlatformLogger.calculateHashCodeMd5(emptyStr);
+ int shortHashCode = PlatformLogger.calculateHashCodeMd5(shortStr);
+ int mediumHashCode = PlatformLogger.calculateHashCodeMd5(mediumStr);
+ int longHashCode = PlatformLogger.calculateHashCodeMd5(longStr);
+
+ assertThat(emptyHashCode).isEqualTo(calculateHashCodeMd5withBigInteger(emptyStr));
+ assertThat(shortHashCode).isEqualTo(calculateHashCodeMd5withBigInteger(shortStr));
+ assertThat(mediumHashCode).isEqualTo(calculateHashCodeMd5withBigInteger(mediumStr));
+ assertThat(longHashCode).isEqualTo(calculateHashCodeMd5withBigInteger(longStr));
+ }
+
+ @Test
public void testShouldLogForTypeLocked_trueWhenSampleRatioIsOne() {
final int samplingRatio = 1;
final String testPackageName = "packageName";
@@ -127,7 +205,7 @@
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
samplingRatio,
- /* samplingMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
// Sample should always be logged for the first time if sampling is disabled(value is one).
assertThat(logger.shouldLogForTypeLocked(CallStats.CALL_TYPE_PUT_DOCUMENT)).isTrue();
@@ -145,7 +223,7 @@
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
samplingRatio,
- /* samplingMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
// Makes sure sample will be excluded due to sampling if sample ratio is negative.
assertThat(logger.shouldLogForTypeLocked(CallStats.CALL_TYPE_PUT_DOCUMENT)).isFalse();
@@ -167,7 +245,7 @@
new PlatformLogger.Config(
minTimeIntervalBetweenSamplesMillis,
samplingRatio,
- /* samplingMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
logger.setLastPushTimeMillisLocked(SystemClock.elapsedRealtime());
// Makes sure sample will be excluded due to rate limiting if samples are too close.
@@ -189,7 +267,7 @@
new PlatformLogger.Config(
minTimeIntervalBetweenSamplesMillis,
samplingRatio,
- /* samplingMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
logger.setLastPushTimeMillisLocked(SystemClock.elapsedRealtime());
// Makes sure sample will be logged if it is not too close to previous sample.
@@ -209,7 +287,7 @@
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
TEST_DEFAULT_SAMPLING_RATIO,
- /* samplingMap=*/ null));
+ /*samplingRatios=*/ new SparseIntArray()));
mMockPackageManager.mockGetPackageUidAsUser(testPackageName, mContext.getUserId(), testUid);
//
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
index 3cbc226..e322ce5 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
@@ -279,7 +279,7 @@
IBiometricAuthenticator fingerprintAuthenticator = mock(IBiometricAuthenticator.class);
when(fingerprintAuthenticator.isHardwareDetected(any())).thenReturn(true);
when(fingerprintAuthenticator.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- mSensors.add(new BiometricSensor(id,
+ mSensors.add(new BiometricSensor(mContext, id,
TYPE_FINGERPRINT /* modality */,
Authenticators.BIOMETRIC_STRONG /* strength */,
fingerprintAuthenticator) {
@@ -314,7 +314,7 @@
IBiometricAuthenticator authenticator) throws RemoteException {
when(authenticator.isHardwareDetected(any())).thenReturn(true);
when(authenticator.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- mSensors.add(new BiometricSensor(id,
+ mSensors.add(new BiometricSensor(mContext, id,
TYPE_FACE /* modality */,
Authenticators.BIOMETRIC_STRONG /* strength */,
authenticator) {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
index abc8737..a5fbab5 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
@@ -1278,10 +1278,10 @@
for (int i = 0; i < testCases.length; i++) {
final BiometricSensor sensor =
- new BiometricSensor(0 /* id */,
+ new BiometricSensor(mContext, 0 /* id */,
BiometricAuthenticator.TYPE_FINGERPRINT,
testCases[i][0],
- null /* impl */) {
+ mock(IBiometricAuthenticator.class)) {
@Override
boolean confirmationAlwaysRequired(int userId) {
return false;
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/InvalidationTrackerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/InvalidationTrackerTest.java
index bb2b1c2..ee5ab92 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/InvalidationTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/InvalidationTrackerTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricManager.Authenticators;
@@ -35,7 +36,10 @@
import com.android.server.biometrics.BiometricService.InvalidationTracker;
+import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@@ -43,29 +47,37 @@
@SmallTest
public class InvalidationTrackerTest {
+ @Mock
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
@Test
public void testCallbackReceived_whenAllStrongSensorsInvalidated() throws Exception {
final IBiometricAuthenticator authenticator1 = mock(IBiometricAuthenticator.class);
when(authenticator1.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- final TestSensor sensor1 = new TestSensor(0 /* id */,
+ final TestSensor sensor1 = new TestSensor(mContext, 0 /* id */,
BiometricAuthenticator.TYPE_FINGERPRINT, Authenticators.BIOMETRIC_STRONG,
authenticator1);
final IBiometricAuthenticator authenticator2 = mock(IBiometricAuthenticator.class);
when(authenticator2.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- final TestSensor sensor2 = new TestSensor(1 /* id */,
+ final TestSensor sensor2 = new TestSensor(mContext, 1 /* id */,
BiometricAuthenticator.TYPE_FINGERPRINT, Authenticators.BIOMETRIC_STRONG,
authenticator2);
final IBiometricAuthenticator authenticator3 = mock(IBiometricAuthenticator.class);
when(authenticator3.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- final TestSensor sensor3 = new TestSensor(2 /* id */,
+ final TestSensor sensor3 = new TestSensor(mContext, 2 /* id */,
BiometricAuthenticator.TYPE_FACE, Authenticators.BIOMETRIC_STRONG,
authenticator3);
final IBiometricAuthenticator authenticator4 = mock(IBiometricAuthenticator.class);
when(authenticator4.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
- final TestSensor sensor4 = new TestSensor(3 /* id */,
+ final TestSensor sensor4 = new TestSensor(mContext, 3 /* id */,
BiometricAuthenticator.TYPE_FACE, Authenticators.BIOMETRIC_WEAK,
authenticator4);
@@ -101,8 +113,9 @@
private static class TestSensor extends BiometricSensor {
- TestSensor(int id, int modality, int strength, IBiometricAuthenticator impl) {
- super(id, modality, strength, impl);
+ TestSensor(@NonNull Context context, int id, int modality, int strength,
+ @NonNull IBiometricAuthenticator impl) {
+ super(context, id, modality, strength, impl);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
index 7dd0734..c5ed20a 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -188,7 +188,7 @@
// Request it to be canceled. The operation can be canceled immediately, and the scheduler
// should go back to idle, since in this case the framework has not even requested the HAL
// to authenticate yet.
- mScheduler.cancelAuthentication(mToken);
+ mScheduler.cancelAuthenticationOrDetection(mToken);
assertNull(mScheduler.mCurrentOperation);
}
@@ -298,7 +298,7 @@
mScheduler.mPendingOperations.getFirst().mState);
// Request cancel before the authentication client has started
- mScheduler.cancelAuthentication(mToken);
+ mScheduler.cancelAuthenticationOrDetection(mToken);
waitForIdle();
assertEquals(Operation.STATE_WAITING_IN_QUEUE_CANCELING,
mScheduler.mPendingOperations.getFirst().mState);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 4e9367a..78e2dee 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -4032,20 +4032,20 @@
}
@Test
- public void testGetSetEnterpriseNetworkPreference() throws Exception {
+ public void testGetSetPreferentialNetworkService() throws Exception {
assertExpectException(SecurityException.class, null,
- () -> dpm.setEnterpriseNetworkPreferenceEnabled(false));
+ () -> dpm.setPreferentialNetworkServiceEnabled(false));
assertExpectException(SecurityException.class, null,
- () -> dpm.isEnterpriseNetworkPreferenceEnabled());
+ () -> dpm.isPreferentialNetworkServiceEnabled());
final int managedProfileUserId = 15;
final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, 19436);
addManagedProfile(admin1, managedProfileAdminUid, admin1);
mContext.binder.callingUid = managedProfileAdminUid;
- dpm.setEnterpriseNetworkPreferenceEnabled(false);
- assertThat(dpm.isEnterpriseNetworkPreferenceEnabled()).isFalse();
+ dpm.setPreferentialNetworkServiceEnabled(false);
+ assertThat(dpm.isPreferentialNetworkServiceEnabled()).isFalse();
verify(getServices().connectivityManager, times(1)).setProfileNetworkPreference(
eq(UserHandle.of(managedProfileUserId)),
eq(ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT),
@@ -4053,8 +4053,8 @@
any()
);
- dpm.setEnterpriseNetworkPreferenceEnabled(true);
- assertThat(dpm.isEnterpriseNetworkPreferenceEnabled()).isTrue();
+ dpm.setPreferentialNetworkServiceEnabled(true);
+ assertThat(dpm.isPreferentialNetworkServiceEnabled()).isTrue();
verify(getServices().connectivityManager, times(1)).setProfileNetworkPreference(
eq(UserHandle.of(managedProfileUserId)),
eq(ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE),
@@ -5090,6 +5090,46 @@
}
@Test
+ public void resetPasswordWithToken_NumericPin() throws Exception {
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ // adding a token
+ final byte[] token = new byte[32];
+ final long handle = 123456;
+ when(getServices().lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM),
+ nullable(EscrowTokenStateChangeCallback.class)))
+ .thenReturn(handle);
+ assertThat(dpm.setResetPasswordToken(admin1, token)).isTrue();
+
+ // Test resetting with a numeric pin
+ final String pin = "123456";
+ when(getServices().lockPatternUtils.setLockCredentialWithToken(
+ LockscreenCredential.createPin(pin), handle, token,
+ UserHandle.USER_SYSTEM)).thenReturn(true);
+ assertThat(dpm.resetPasswordWithToken(admin1, pin, token, 0)).isTrue();
+ }
+
+ @Test
+ public void resetPasswordWithToken_EmptyPassword() throws Exception {
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ // adding a token
+ final byte[] token = new byte[32];
+ final long handle = 123456;
+ when(getServices().lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM),
+ nullable(EscrowTokenStateChangeCallback.class)))
+ .thenReturn(handle);
+ assertThat(dpm.setResetPasswordToken(admin1, token)).isTrue();
+
+ // Test resetting with an empty password
+ final String password = "";
+ when(getServices().lockPatternUtils.setLockCredentialWithToken(
+ LockscreenCredential.createNone(), handle, token,
+ UserHandle.USER_SYSTEM)).thenReturn(true);
+ assertThat(dpm.resetPasswordWithToken(admin1, password, token, 0)).isTrue();
+ }
+
+ @Test
public void testIsActivePasswordSufficient() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
mContext.packageName = admin1.getPackageName();
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
index c8099e2..cda659f 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
@@ -27,10 +27,13 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -45,6 +48,7 @@
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.DisplayManager;
+import android.hardware.fingerprint.IUdfpsHbmListener;
import android.os.Handler;
import android.os.Looper;
import android.provider.DeviceConfig;
@@ -61,9 +65,11 @@
import com.android.internal.util.Preconditions;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.util.test.FakeSettingsProviderRule;
+import com.android.server.LocalServices;
import com.android.server.display.DisplayModeDirector.BrightnessObserver;
import com.android.server.display.DisplayModeDirector.DesiredDisplayModeSpecs;
import com.android.server.display.DisplayModeDirector.Vote;
+import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.testutils.FakeDeviceConfigInterface;
import org.junit.Before;
@@ -71,6 +77,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -95,6 +102,8 @@
private Handler mHandler;
@Rule
public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
+ @Mock
+ public StatusBarManagerInternal mStatusBarMock;
@Before
public void setUp() throws Exception {
@@ -104,6 +113,9 @@
when(mContext.getContentResolver()).thenReturn(resolver);
mInjector = new FakesInjector();
mHandler = new Handler(Looper.getMainLooper());
+
+ LocalServices.removeServiceForTest(StatusBarManagerInternal.class);
+ LocalServices.addService(StatusBarManagerInternal.class, mStatusBarMock);
}
private DisplayModeDirector createDirectorFromRefreshRateArray(
@@ -338,7 +350,7 @@
void verifyBrightnessObserverCall(DisplayModeDirector director, float minFps, float peakFps,
float defaultFps, float brightnessObserverMin, float brightnessObserverMax) {
- BrightnessObserver brightnessObserver = Mockito.mock(BrightnessObserver.class);
+ BrightnessObserver brightnessObserver = mock(BrightnessObserver.class);
director.injectBrightnessObserver(brightnessObserver);
director.getDesiredDisplayModeSpecsWithInjectedFpsSettings(minFps, peakFps, defaultFps);
verify(brightnessObserver)
@@ -581,7 +593,7 @@
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 20 /*lux*/));
Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
- assertVoteForRefreshRateLocked(vote, 90 /*fps*/);
+ assertVoteForRefreshRate(vote, 90 /*fps*/);
setBrightness(125);
// Sensor reads 1000 lux,
@@ -611,7 +623,7 @@
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
- Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
.registerListener(
listenerCaptor.capture(),
eq(lightSensor),
@@ -631,7 +643,7 @@
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 9000));
vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
- assertVoteForRefreshRateLocked(vote, 60 /*fps*/);
+ assertVoteForRefreshRate(vote, 60 /*fps*/);
}
@Test
@@ -654,21 +666,21 @@
director.start(sensorManager);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
- Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
.registerListener(
listenerCaptor.capture(),
eq(lightSensor),
anyInt(),
any(Handler.class));
- // Dispaly state changed from On to Doze
+ // Display state changed from On to Doze
director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE);
- Mockito.verify(sensorManager)
+ verify(sensorManager)
.unregisterListener(listenerCaptor.capture());
- // Dispaly state changed from Doze to On
+ // Display state changed from Doze to On
director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
- Mockito.verify(sensorManager, times(2))
+ verify(sensorManager, times(2))
.registerListener(
listenerCaptor.capture(),
eq(lightSensor),
@@ -677,7 +689,42 @@
}
- private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) {
+ @Test
+ public void testUdfpsListenerGetsRegistered() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f, 110.f}, 0);
+ verify(mStatusBarMock, never()).setUdfpsHbmListener(any());
+
+ director.start(createMockSensorManager());
+ verify(mStatusBarMock).setUdfpsHbmListener(eq(director.getUdpfsObserver()));
+ }
+
+ @Test
+ public void testGbhmVotesFor60hz() throws Exception {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f, 110.f}, 0);
+ director.start(createMockSensorManager());
+ ArgumentCaptor<IUdfpsHbmListener> captor =
+ ArgumentCaptor.forClass(IUdfpsHbmListener.class);
+ verify(mStatusBarMock).setUdfpsHbmListener(captor.capture());
+ IUdfpsHbmListener hbmListener = captor.getValue();
+
+ // Should be no vote initially
+ Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
+ assertNull(vote);
+
+ // Enabling GHBM votes for 60hz
+ hbmListener.onHbmEnabled(IUdfpsHbmListener.GLOBAL_HBM, DISPLAY_ID);
+ vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
+ assertVoteForRefreshRate(vote, 60.f);
+
+ // Disabling GHBM removes the vote
+ hbmListener.onHbmDisabled(IUdfpsHbmListener.GLOBAL_HBM, DISPLAY_ID);
+ vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
+ assertNull(vote);
+ }
+
+ private void assertVoteForRefreshRate(Vote vote, float refreshRate) {
assertThat(vote).isNotNull();
final DisplayModeDirector.RefreshRateRange expectedRange =
new DisplayModeDirector.RefreshRateRange(refreshRate, refreshRate);
@@ -787,7 +834,7 @@
}
private static SensorManager createMockSensorManager(Sensor... sensors) {
- SensorManager sensorManager = Mockito.mock(SensorManager.class);
+ SensorManager sensorManager = mock(SensorManager.class);
when(sensorManager.getSensorList(anyInt())).then((invocation) -> {
List<Sensor> requestedSensors = new ArrayList<>();
int type = invocation.getArgument(0);
diff --git a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
index 5c9b830..5363a17e 100644
--- a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
+++ b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
@@ -416,6 +416,21 @@
}
@Test
+ public void installFontFile_sameVersion() throws Exception {
+ FakeFontFileParser parser = new FakeFontFileParser();
+ FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+ UpdatableFontDir dir = new UpdatableFontDir(
+ mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
+ mConfigFile, mCurrentTimeSupplier);
+ dir.loadFontFileMap();
+
+ dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
+ dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
+ assertThat(dir.getFontFileMap()).containsKey("test.ttf");
+ assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(1);
+ }
+
+ @Test
public void installFontFile_downgrade() throws Exception {
FakeFontFileParser parser = new FakeFontFileParser();
FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
@@ -494,7 +509,7 @@
}
@Test
- public void installFontFile_olderThanPreinstalledFont() throws Exception {
+ public void installFontFile_preinstalled_upgrade() throws Exception {
FakeFontFileParser parser = new FakeFontFileParser();
FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1");
@@ -503,6 +518,36 @@
mConfigFile, mCurrentTimeSupplier);
dir.loadFontFileMap();
+ dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2", GOOD_SIGNATURE)));
+ assertThat(dir.getFontFileMap()).containsKey("test.ttf");
+ assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(2);
+ }
+
+ @Test
+ public void installFontFile_preinstalled_sameVersion() throws Exception {
+ FakeFontFileParser parser = new FakeFontFileParser();
+ FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+ FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1");
+ UpdatableFontDir dir = new UpdatableFontDir(
+ mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
+ mConfigFile, mCurrentTimeSupplier);
+ dir.loadFontFileMap();
+
+ dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
+ assertThat(dir.getFontFileMap()).containsKey("test.ttf");
+ assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(1);
+ }
+
+ @Test
+ public void installFontFile_preinstalled_downgrade() throws Exception {
+ FakeFontFileParser parser = new FakeFontFileParser();
+ FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+ FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,2");
+ UpdatableFontDir dir = new UpdatableFontDir(
+ mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
+ mConfigFile, mCurrentTimeSupplier);
+ dir.loadFontFileMap();
+
try {
dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1",
GOOD_SIGNATURE)));
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
index 375704e..e2b6a99 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
@@ -65,7 +65,7 @@
R.bool.config_cecHdmiCecVersion20_default);
doReturn(true).when(resources).getBoolean(
- R.bool.config_cecSendStandbyOnSleep_userConfigurable);
+ R.bool.config_cecPowerControlMode_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerControlModeTv_allowed);
doReturn(true).when(resources).getBoolean(
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
index c834510..a37f94b 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
@@ -403,7 +403,7 @@
@Test
public void setStringValue_NotConfigurable() {
- setBooleanResource(R.bool.config_cecSendStandbyOnSleep_userConfigurable, false);
+ setBooleanResource(R.bool.config_cecPowerControlMode_userConfigurable, false);
HdmiCecConfig hdmiCecConfig = new HdmiCecConfig(mContext, mStorageAdapter);
assertThrows(IllegalArgumentException.class,
() -> hdmiCecConfig.setStringValue(
diff --git a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
index 401d6e3..2f77126 100644
--- a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
@@ -39,6 +39,8 @@
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.InetAddress;
+import java.util.ArrayList;
import java.util.Arrays;
/**
@@ -53,8 +55,8 @@
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream outputStream = new DataOutputStream(byteStream);
- IpConfiguration expectedConfig = new IpConfiguration(IpAssignment.DHCP,
- ProxySettings.NONE, null, null);
+ final IpConfiguration expectedConfig =
+ newIpConfiguration(IpAssignment.DHCP, ProxySettings.NONE, null, null);
// Emulate writing to old format.
writeDhcpConfigV2(outputStream, KEY_CONFIG, expectedConfig);
@@ -78,18 +80,23 @@
final String DNS_IP_ADDR_1 = "1.2.3.4";
final String DNS_IP_ADDR_2 = "5.6.7.8";
- StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
- staticIpConfiguration.ipAddress = new LinkAddress(IP_ADDR_1);
- staticIpConfiguration.dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_1));
- staticIpConfiguration.dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_2));
+ final ArrayList<InetAddress> dnsServers = new ArrayList<>();
+ dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_1));
+ dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_2));
+ final StaticIpConfiguration staticIpConfiguration1 = new StaticIpConfiguration.Builder()
+ .setIpAddress(new LinkAddress(IP_ADDR_1))
+ .setDnsServers(dnsServers).build();
+ final StaticIpConfiguration staticIpConfiguration2 = new StaticIpConfiguration.Builder()
+ .setIpAddress(new LinkAddress(IP_ADDR_2))
+ .setDnsServers(dnsServers).build();
ProxyInfo proxyInfo =
ProxyInfo.buildDirectProxy("10.10.10.10", 88, Arrays.asList("host1", "host2"));
- IpConfiguration expectedConfig1 = new IpConfiguration(IpAssignment.STATIC,
- ProxySettings.STATIC, staticIpConfiguration, proxyInfo);
- IpConfiguration expectedConfig2 = new IpConfiguration(expectedConfig1);
- expectedConfig2.getStaticIpConfiguration().ipAddress = new LinkAddress(IP_ADDR_2);
+ IpConfiguration expectedConfig1 = newIpConfiguration(IpAssignment.STATIC,
+ ProxySettings.STATIC, staticIpConfiguration1, proxyInfo);
+ IpConfiguration expectedConfig2 = newIpConfiguration(IpAssignment.STATIC,
+ ProxySettings.STATIC, staticIpConfiguration2, proxyInfo);
ArrayMap<String, IpConfiguration> expectedNetworks = new ArrayMap<>();
expectedNetworks.put(IFACE_1, expectedConfig1);
@@ -107,14 +114,24 @@
assertEquals(expectedNetworks.get(IFACE_2), actualNetworks.get(IFACE_2));
}
+ private IpConfiguration newIpConfiguration(IpAssignment ipAssignment,
+ ProxySettings proxySettings, StaticIpConfiguration staticIpConfig, ProxyInfo info) {
+ final IpConfiguration config = new IpConfiguration();
+ config.setIpAssignment(ipAssignment);
+ config.setProxySettings(proxySettings);
+ config.setStaticIpConfiguration(staticIpConfig);
+ config.setHttpProxy(info);
+ return config;
+ }
+
// This is simplified snapshot of code that was used to store values in V2 format (key as int).
private static void writeDhcpConfigV2(DataOutputStream out, int configKey,
IpConfiguration config) throws IOException {
out.writeInt(2); // VERSION 2
- switch (config.ipAssignment) {
+ switch (config.getIpAssignment()) {
case DHCP:
out.writeUTF("ipAssignment");
- out.writeUTF(config.ipAssignment.toString());
+ out.writeUTF(config.getIpAssignment().toString());
break;
default:
fail("Not supported in test environment");
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index e9e2486..352832b 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -87,6 +87,7 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
@@ -226,7 +227,8 @@
private static final String TEST_SSID = "AndroidAP";
private static final String TEST_IMSI = "310210";
private static final int TEST_SUB_ID = 42;
- private static final int TEST_NET_ID = 24;
+ private static final Network TEST_NETWORK = mock(Network.class, CALLS_REAL_METHODS);
+
private static NetworkTemplate sTemplateWifi = buildTemplateWifi(TEST_SSID);
private static NetworkTemplate sTemplateMobileAll = buildTemplateMobileAll(TEST_IMSI);
@@ -1637,7 +1639,7 @@
@Test
public void testOpportunisticQuota() throws Exception {
- final Network net = new Network(TEST_NET_ID);
+ final Network net = TEST_NETWORK;
final NetworkPolicyManagerInternal internal = LocalServices
.getService(NetworkPolicyManagerInternal.class);
@@ -1759,11 +1761,10 @@
assertNotNull(callback);
expectNetworkStateSnapshot(true /* roaming */);
callback.onCapabilitiesChanged(
- new Network(TEST_NET_ID),
- buildNetworkCapabilities(TEST_SUB_ID, true /* roaming */));
+ TEST_NETWORK, buildNetworkCapabilities(TEST_SUB_ID, true /* roaming */));
assertEquals(0, internal.getSubscriptionOpportunisticQuota(
- new Network(TEST_NET_ID), NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH));
+ TEST_NETWORK, NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH));
}
}
@@ -2013,14 +2014,14 @@
}
private NetworkCapabilities buildNetworkCapabilities(int subId, boolean roaming) {
- final NetworkCapabilities nc = new NetworkCapabilities();
- nc.addTransportType(TRANSPORT_CELLULAR);
+ final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
+ builder.addTransportType(TRANSPORT_CELLULAR);
if (!roaming) {
- nc.addCapability(NET_CAPABILITY_NOT_ROAMING);
+ builder.addCapability(NET_CAPABILITY_NOT_ROAMING);
}
- nc.setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder()
+ builder.setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder()
.setSubscriptionId(subId).build());
- return nc;
+ return builder.build();
}
private NetworkPolicy buildDefaultFakeMobilePolicy() {
@@ -2061,10 +2062,9 @@
private static NetworkStateSnapshot buildWifi() {
final LinkProperties prop = new LinkProperties();
prop.setInterfaceName(TEST_IFACE);
- final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
- networkCapabilities.addTransportType(TRANSPORT_WIFI);
- networkCapabilities.setSSID(TEST_SSID);
- return new NetworkStateSnapshot(new Network(TEST_NET_ID), networkCapabilities, prop,
+ final NetworkCapabilities networkCapabilities = new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_WIFI).setSsid(TEST_SSID).build();
+ return new NetworkStateSnapshot(TEST_NETWORK, networkCapabilities, prop,
null /*subscriberId*/, TYPE_WIFI);
}
@@ -2086,7 +2086,7 @@
when(mCarrierConfigManager.getConfigForSubId(eq(TEST_SUB_ID)))
.thenReturn(mCarrierConfig);
List<NetworkStateSnapshot> snapshots = List.of(new NetworkStateSnapshot(
- new Network(TEST_NET_ID),
+ TEST_NETWORK,
buildNetworkCapabilities(TEST_SUB_ID, roaming),
buildLinkProperties(TEST_IFACE), TEST_IMSI, TYPE_MOBILE));
when(mConnManager.getAllNetworkStateSnapshot()).thenReturn(snapshots);
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 589b3b4..198fb4f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -691,7 +691,8 @@
@Override
public void putDocuments(String packageName, String databaseName,
- List<Bundle> documentBundles, int userId, IAppSearchBatchResultCallback callback)
+ List<Bundle> documentBundles, int userId, long binderCallStartTimeMillis,
+ IAppSearchBatchResultCallback callback)
throws RemoteException {
final List<GenericDocument> docs = new ArrayList<>(documentBundles.size());
for (Bundle bundle : documentBundles) {
@@ -2041,6 +2042,11 @@
return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
}
+ protected void updatePackageShortcut(String packageName, String shortcutId, int userId,
+ Consumer<ShortcutInfo> cb) {
+ mService.updatePackageShortcutForTest(packageName, shortcutId, userId, cb);
+ }
+
protected void assertShortcutExists(String packageName, String shortcutId, int userId) {
assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
}
@@ -2236,6 +2242,10 @@
return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
}
+ protected void updateCallerShortcut(String shortcutId, Consumer<ShortcutInfo> cb) {
+ updatePackageShortcut(getCallingPackage(), shortcutId, getCallingUserId(), cb);
+ }
+
protected List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
final List<ShortcutInfo>[] ret = new List[1];
runWithCaller(launcher, userId, () -> {
@@ -2395,6 +2405,8 @@
deleteAllSavedFiles();
+ mMockAppSearchManager.removeShortcuts();
+
initService();
mService.applyRestore(payload, USER_0);
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 4d0beef..c16e498 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -1702,8 +1702,8 @@
// Because setDynamicShortcuts will update the timestamps when ranks are changing,
// we explicitly set timestamps here.
- getCallerShortcut("s1").setTimestamp(5000);
- getCallerShortcut("s2").setTimestamp(1000);
+ updateCallerShortcut("s1", si -> si.setTimestamp(5000));
+ updateCallerShortcut("s2", si -> si.setTimestamp(1000));
setCaller(CALLING_PACKAGE_2);
final ShortcutInfo s2_2 = makeShortcut("s2");
@@ -1713,9 +1713,9 @@
makeComponent(ShortcutActivity.class));
assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
- getCallerShortcut("s2").setTimestamp(1500);
- getCallerShortcut("s3").setTimestamp(3000);
- getCallerShortcut("s4").setTimestamp(500);
+ updateCallerShortcut("s2", si -> si.setTimestamp(1500));
+ updateCallerShortcut("s3", si -> si.setTimestamp(3000));
+ updateCallerShortcut("s4", si -> si.setTimestamp(500));
setCaller(CALLING_PACKAGE_3);
final ShortcutInfo s3_2 = makeShortcutWithLocusId("s3", makeLocusId("l2"));
@@ -1723,7 +1723,7 @@
assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
- getCallerShortcut("s3").setTimestamp(START_TIME + 5000);
+ updateCallerShortcut("s3", si -> si.setTimestamp(START_TIME + 5000));
setCaller(LAUNCHER_1);
@@ -7686,7 +7686,7 @@
assertEquals("http://www/", si.getIntent().getData().toString());
assertEquals("foo/bar", si.getIntent().getType());
assertEquals(
- new ComponentName("abc", ".xyz"), si.getIntent().getComponent());
+ new ComponentName("abc", "abc.xyz"), si.getIntent().getComponent());
assertEquals(set("cat1", "cat2"), si.getIntent().getCategories());
assertEquals("value1", si.getIntent().getStringExtra("key1"));
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
new file mode 100644
index 0000000..aaf40d7
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.power.hint;
+
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.IHintSession;
+import android.os.Process;
+
+import com.android.server.FgThread;
+import com.android.server.power.hint.HintManagerService.AppHintSession;
+import com.android.server.power.hint.HintManagerService.Injector;
+import com.android.server.power.hint.HintManagerService.NativeWrapper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for {@link com.android.server.power.hint.HintManagerService}.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:HintManagerServiceTest
+ */
+public class HintManagerServiceTest {
+ private static final long DEFAULT_HINT_PREFERRED_RATE = 16666666L;
+ private static final long DEFAULT_TARGET_DURATION = 16666666L;
+ private static final int UID = Process.myUid();
+ private static final int TID = Process.myPid();
+ private static final int TGID = Process.getThreadGroupLeader(TID);
+ private static final int[] SESSION_TIDS_A = new int[] {TID};
+ private static final int[] SESSION_TIDS_B = new int[] {TID};
+ private static final long[] DURATIONS_THREE = new long[] {1L, 100L, 1000L};
+ private static final long[] TIMESTAMPS_THREE = new long[] {1L, 2L, 3L};
+ private static final long[] DURATIONS_ZERO = new long[] {};
+ private static final long[] TIMESTAMPS_ZERO = new long[] {};
+ private static final long[] TIMESTAMPS_TWO = new long[] {1L, 2L};
+
+ @Mock private Context mContext;
+ @Mock private HintManagerService.NativeWrapper mNativeWrapperMock;
+
+ private HintManagerService mService;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mNativeWrapperMock.halGetHintSessionPreferredRate())
+ .thenReturn(DEFAULT_HINT_PREFERRED_RATE);
+ when(mNativeWrapperMock.halCreateHintSession(eq(TGID), eq(UID), eq(SESSION_TIDS_A),
+ eq(DEFAULT_TARGET_DURATION))).thenReturn(1L);
+ when(mNativeWrapperMock.halCreateHintSession(eq(TGID), eq(UID), eq(SESSION_TIDS_B),
+ eq(DEFAULT_TARGET_DURATION))).thenReturn(2L);
+ }
+
+ private HintManagerService createService() {
+ mService = new HintManagerService(mContext, new Injector() {
+ NativeWrapper createNativeWrapper() {
+ return mNativeWrapperMock;
+ }
+ });
+ return mService;
+ }
+
+ @Test
+ public void testInitializeService() {
+ HintManagerService service = createService();
+ verify(mNativeWrapperMock).halInit();
+ assertThat(service.mHintSessionPreferredRate).isEqualTo(DEFAULT_HINT_PREFERRED_RATE);
+ }
+
+ @Test
+ public void testCreateHintSession() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ IHintSession a = service.getBinderServiceInstance().createHintSession(token,
+ SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+ assertNotNull(a);
+
+ IHintSession b = service.getBinderServiceInstance().createHintSession(token,
+ SESSION_TIDS_B, DEFAULT_TARGET_DURATION);
+ assertNotEquals(a, b);
+ }
+
+ @Test
+ public void testPauseResumeHintSession() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ // Set session to background and calling updateHintAllowed() would invoke pause();
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0);
+ final Object sync = new Object();
+ FgThread.getHandler().post(() -> {
+ synchronized (sync) {
+ sync.notify();
+ }
+ });
+ synchronized (sync) {
+ sync.wait();
+ }
+ assumeFalse(a.updateHintAllowed());
+ verify(mNativeWrapperMock, times(1)).halPauseHintSession(anyLong());
+
+ // Set session to foreground and calling updateHintAllowed() would invoke resume();
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
+ FgThread.getHandler().post(() -> {
+ synchronized (sync) {
+ sync.notify();
+ }
+ });
+ synchronized (sync) {
+ sync.wait();
+ }
+ assumeTrue(a.updateHintAllowed());
+ verify(mNativeWrapperMock, times(1)).halResumeHintSession(anyLong());
+ }
+
+ @Test
+ public void testCloseHintSession() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ IHintSession a = service.getBinderServiceInstance().createHintSession(token,
+ SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ a.close();
+ verify(mNativeWrapperMock, times(1)).halCloseHintSession(anyLong());
+ }
+
+ @Test
+ public void testUpdateTargetWorkDuration() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ IHintSession a = service.getBinderServiceInstance().createHintSession(token,
+ SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.updateTargetWorkDuration(-1L);
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.updateTargetWorkDuration(0L);
+ });
+
+ a.updateTargetWorkDuration(100L);
+ verify(mNativeWrapperMock, times(1)).halUpdateTargetWorkDuration(anyLong(), eq(100L));
+ }
+
+ @Test
+ public void testReportActualWorkDuration() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ a.updateTargetWorkDuration(100L);
+ a.reportActualWorkDuration(DURATIONS_THREE, TIMESTAMPS_THREE);
+ verify(mNativeWrapperMock, times(1)).halReportActualWorkDuration(anyLong(),
+ eq(DURATIONS_THREE), eq(TIMESTAMPS_THREE));
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration(DURATIONS_ZERO, TIMESTAMPS_THREE);
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration(DURATIONS_THREE, TIMESTAMPS_ZERO);
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration(DURATIONS_THREE, TIMESTAMPS_TWO);
+ });
+
+ reset(mNativeWrapperMock);
+ // Set session to background, then the duration would not be updated.
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0);
+ final Object sync = new Object();
+ FgThread.getHandler().post(() -> {
+ synchronized (sync) {
+ sync.notify();
+ }
+ });
+ synchronized (sync) {
+ sync.wait();
+ }
+ assumeFalse(a.updateHintAllowed());
+ a.reportActualWorkDuration(DURATIONS_THREE, TIMESTAMPS_THREE);
+ verify(mNativeWrapperMock, never()).halReportActualWorkDuration(anyLong(), any(), any());
+ }
+
+ @Test
+ public void testDoHintInBackground() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
+ final Object sync = new Object();
+ FgThread.getHandler().post(() -> {
+ synchronized (sync) {
+ sync.notify();
+ }
+ });
+ synchronized (sync) {
+ sync.wait();
+ }
+ assertFalse(a.updateHintAllowed());
+ }
+
+ @Test
+ public void testDoHintInForeground() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
+ assertTrue(a.updateHintAllowed());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
index 7903a90..2b358ea 100644
--- a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
@@ -16,7 +16,12 @@
package com.android.server.recoverysystem;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED;
+import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH;
+
import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.AdditionalMatchers.not;
import static org.mockito.ArgumentMatchers.any;
@@ -274,8 +279,7 @@
verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "foobar", true),
- is(true));
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "foobar", true);
verify(mIPowerManager).reboot(anyBoolean(), eq("foobar"), anyBoolean());
}
@@ -373,8 +377,7 @@
anyInt())).thenReturn(3);
when(mSharedPreferences.getLong(eq(RecoverySystemService.LSKF_CAPTURED_TIMESTAMP_PREF),
anyLong())).thenReturn(40_000L);
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
- is(true));
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true);
verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
verify(mMetricsReporter).reportRebootEscrowRebootMetrics(eq(0), eq(1000),
eq(1) /* client count */, eq(2) /* request count */, eq(true) /* slot switch */,
@@ -386,19 +389,20 @@
public void rebootWithLskf_slotMismatch_Failure() throws Exception {
assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
mRecoverySystemService.onPreparedForReboot(true);
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", false),
- is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMATCH,
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", false));
}
@Test
public void rebootWithLskf_withoutPrepare_Failure() throws Exception {
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
- is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED,
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true));
}
@Test
public void rebootWithLskf_withNullCallerId_Failure() throws Exception {
- assertThat(mRecoverySystemService.rebootWithLskf(null, null, true), is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_INVALID_PACKAGE_NAME,
+ mRecoverySystemService.rebootWithLskf(null, null, true));
verifyNoMoreInteractions(mIPowerManager);
}
@@ -410,8 +414,7 @@
// Client B's clear won't affect client A's preparation.
assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
- is(true));
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true);
verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
}
@@ -428,8 +431,7 @@
when(mSharedPreferences.getLong(eq(RecoverySystemService.LSKF_CAPTURED_TIMESTAMP_PREF),
anyLong())).thenReturn(60_000L);
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
- is(true));
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true);
verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
verify(mMetricsReporter).reportRebootEscrowRebootMetrics(eq(0), eq(1000),
eq(2) /* client count */, eq(2) /* request count */, eq(true) /* slot switch */,
@@ -450,17 +452,15 @@
anyLong())).thenReturn(60_000L);
assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
- is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED,
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true));
verifyNoMoreInteractions(mIPowerManager);
verify(mMetricsReporter).reportRebootEscrowRebootMetrics(not(eq(0)), eq(1000),
eq(1) /* client count */, anyInt() /* request count */, eq(true) /* slot switch */,
anyBoolean(), eq(40), eq(1)/* lskf capture count */);
assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
- assertThat(
- mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
- is(true));
+ mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true);
verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
verify(mMetricsReporter).reportRebootEscrowRebootMetrics((eq(0)), eq(2000),
@@ -476,16 +476,15 @@
// Client A clears
assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
- assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
- is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED,
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true));
verifyNoMoreInteractions(mIPowerManager);
// Client B clears
assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
verify(mLockSettingsInternal).clearRebootEscrow();
- assertThat(
- mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
- is(false));
+ assertEquals(RESUME_ON_REBOOT_REBOOT_ERROR_LSKF_NOT_CAPTURED,
+ mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true));
verifyNoMoreInteractions(mIPowerManager);
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 8991e9f..916a278 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -44,6 +44,8 @@
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
+import static android.content.pm.PackageManager.PERMISSION_DENIED;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.server.usage.AppStandbyController.DEFAULT_ELAPSED_TIME_THRESHOLDS;
import static com.android.server.usage.AppStandbyController.DEFAULT_SCREEN_TIME_THRESHOLDS;
@@ -56,6 +58,8 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
+import static org.mockito.AdditionalMatchers.not;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -81,6 +85,7 @@
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
import android.util.ArraySet;
+import android.util.Pair;
import android.view.Display;
import androidx.test.InstrumentationRegistry;
@@ -114,8 +119,10 @@
@SmallTest
public class AppStandbyControllerTests {
- private static final String PACKAGE_1 = "com.example.foo";
+ private static final String PACKAGE_1 = "com.example.foo.1";
private static final int UID_1 = 10000;
+ private static final String PACKAGE_2 = "com.example.foo.2";
+ private static final int UID_2 = 20000;
private static final String PACKAGE_EXEMPTED_1 = "com.android.exempted";
private static final int UID_EXEMPTED_1 = 10001;
private static final String PACKAGE_SYSTEM_HEADFULL = "com.example.system.headfull";
@@ -124,6 +131,8 @@
private static final int UID_SYSTEM_HEADLESS = 10003;
private static final String PACKAGE_WELLBEING = "com.example.wellbeing";
private static final int UID_WELLBEING = 10004;
+ private static final String PACKAGE_BACKGROUND_LOCATION = "com.example.backgroundLocation";
+ private static final int UID_BACKGROUND_LOCATION = 10005;
private static final int USER_ID = 0;
private static final int USER_ID2 = 10;
private static final UserHandle USER_HANDLE_USER2 = new UserHandle(USER_ID2);
@@ -196,6 +205,7 @@
int[] mRunningUsers = new int[] {USER_ID};
List<UserHandle> mCrossProfileTargets = Collections.emptyList();
boolean mDeviceIdleMode = false;
+ Set<Pair<String, Integer>> mClockApps = new ArraySet<>();
DeviceConfig.Properties.Builder mSettingsBuilder =
new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_APP_STANDBY)
.setLong("screen_threshold_active", 0)
@@ -254,6 +264,11 @@
}
@Override
+ boolean hasScheduleExactAlarm(String packageName, int uid) {
+ return mClockApps.contains(Pair.create(packageName, uid));
+ }
+
+ @Override
void updatePowerWhitelistCache() {
}
@@ -349,6 +364,12 @@
pi.packageName = PACKAGE_1;
packages.add(pi);
+ PackageInfo pInfo = new PackageInfo();
+ pInfo.applicationInfo = new ApplicationInfo();
+ pInfo.applicationInfo.uid = UID_2;
+ pInfo.packageName = PACKAGE_2;
+ packages.add(pInfo);
+
PackageInfo pie = new PackageInfo();
pie.applicationInfo = new ApplicationInfo();
pie.applicationInfo.uid = UID_EXEMPTED_1;
@@ -376,7 +397,14 @@
piw.packageName = PACKAGE_WELLBEING;
packages.add(piw);
+ PackageInfo pib = new PackageInfo();
+ pib.applicationInfo = new ApplicationInfo();
+ pib.applicationInfo.uid = UID_BACKGROUND_LOCATION;
+ pib.packageName = PACKAGE_BACKGROUND_LOCATION;
+ packages.add(pib);
+
doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt());
+
try {
for (int i = 0; i < packages.size(); ++i) {
PackageInfo pkg = packages.get(i);
@@ -387,6 +415,18 @@
.getPackageUidAsUser(eq(pkg.packageName), anyInt(), anyInt());
doReturn(pkg.applicationInfo).when(mockPm)
.getApplicationInfo(eq(pkg.packageName), anyInt());
+
+ if (pkg.packageName.equals(PACKAGE_BACKGROUND_LOCATION)) {
+ doReturn(PERMISSION_GRANTED).when(mockPm).checkPermission(
+ eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
+ eq(pkg.packageName));
+ doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(
+ not(eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)),
+ eq(pkg.packageName));
+ } else {
+ doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(anyString(),
+ eq(pkg.packageName));
+ }
}
} catch (PackageManager.NameNotFoundException nnfe) {}
}
@@ -1662,6 +1702,29 @@
}
@Test
+ public void testClockAppElevated() throws Exception {
+ mInjector.mClockApps.add(Pair.create(PACKAGE_1, UID_1));
+
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_1);
+
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_2);
+ assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_2);
+
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD;
+
+ // Make sure a clock app does not get lowered below WORKING_SET.
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE,
+ REASON_MAIN_TIMEOUT);
+ assertBucket(STANDBY_BUCKET_WORKING_SET, PACKAGE_1);
+
+ // A non clock app should be able to fall lower than WORKING_SET.
+ mController.setAppStandbyBucket(PACKAGE_2, USER_ID, STANDBY_BUCKET_RARE,
+ REASON_MAIN_TIMEOUT);
+ assertBucket(STANDBY_BUCKET_RARE, PACKAGE_2);
+ }
+
+ @Test
public void testChangingSettings_ElapsedThreshold_Invalid() {
mInjector.mSettingsBuilder
.setLong("elapsed_threshold_active", -1)
@@ -1787,6 +1850,24 @@
assertEquals(93 * DAY_MS, mController.mAppStandbyScreenThresholds[4]);
}
+ /**
+ * Package with ACCESS_BACKGROUND_LOCATION permission has minimum bucket
+ * STANDBY_BUCKET_FREQUENT.
+ * @throws Exception
+ */
+ @Test
+ public void testBackgroundLocationBucket() throws Exception {
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime,
+ PACKAGE_BACKGROUND_LOCATION);
+ assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_BACKGROUND_LOCATION);
+
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD;
+ // Make sure PACKAGE_BACKGROUND_LOCATION does not get lowered than STANDBY_BUCKET_FREQUENT.
+ mController.setAppStandbyBucket(PACKAGE_BACKGROUND_LOCATION, USER_ID, STANDBY_BUCKET_RARE,
+ REASON_MAIN_TIMEOUT);
+ assertBucket(STANDBY_BUCKET_FREQUENT, PACKAGE_BACKGROUND_LOCATION);
+ }
+
private String getAdminAppsStr(int userId) {
return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 958b23f..7d86961 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -91,7 +91,7 @@
private HandlerThread mThread;
- private long mUptimeMillis;
+ private long mElapsedTime;
AppTimeLimitController.TimeLimitCallbackListener mListener =
new AppTimeLimitController.TimeLimitCallbackListener() {
@@ -116,8 +116,8 @@
}
@Override
- protected long getUptimeMillis() {
- return mUptimeMillis;
+ protected long getElapsedRealtime() {
+ return mElapsedTime;
}
@Override
@@ -1108,6 +1108,6 @@
}
private void setTime(long time) {
- mUptimeMillis = time;
+ mElapsedTime = time;
}
}
diff --git a/services/tests/servicestests/src/com/android/server/uwb/OWNERS b/services/tests/servicestests/src/com/android/server/uwb/OWNERS
new file mode 100644
index 0000000..c31a2f1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/uwb/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/core/java/android/uwb/OWNERS
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java b/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
index c29593f..f659698 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
@@ -182,7 +182,9 @@
private static VibratorInfo createVibratorInfo(VibratorInfo.FrequencyMapping frequencyMapping,
int... capabilities) {
int cap = IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0);
- return new VibratorInfo(/* id= */ 0, cap, null, null, null, /* qFactor= */ Float.NaN,
- frequencyMapping);
+ return new VibratorInfo.Builder(0)
+ .setCapabilities(cap)
+ .setFrequencyMapping(frequencyMapping)
+ .build();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
index 014bfd2..e739a76 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
@@ -76,4 +76,8 @@
@Override
public void cancel() {
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
index 3ca9060..3f9caa9 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
@@ -34,7 +34,7 @@
import android.hardware.input.IInputDevicesChangedListener;
import android.hardware.input.IInputManager;
import android.hardware.input.InputManager;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.Handler;
import android.os.Process;
import android.os.VibrationAttributes;
@@ -67,8 +67,8 @@
private static final String REASON = "some reason";
private static final VibrationAttributes VIBRATION_ATTRIBUTES =
new VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_ALARM).build();
- private static final CombinedVibrationEffect SYNCED_EFFECT =
- CombinedVibrationEffect.createSynced(VibrationEffect.createOneShot(100, 255));
+ private static final CombinedVibration SYNCED_EFFECT =
+ CombinedVibration.createParallel(VibrationEffect.createOneShot(100, 255));
@Rule public MockitoRule rule = MockitoJUnit.rule();
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
index c439b9c..5743982 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -34,7 +34,7 @@
import android.hardware.vibrator.Braking;
import android.hardware.vibrator.IVibrator;
import android.hardware.vibrator.IVibratorManager;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.Process;
@@ -109,7 +109,7 @@
public void vibrate_noVibrator_ignoresVibration() {
mVibratorProviders.clear();
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
waitForCompletion(thread);
@@ -122,7 +122,7 @@
@Test
public void vibrate_missingVibrators_ignoresVibration() {
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSequential()
+ CombinedVibration effect = CombinedVibration.startSequential()
.addNext(2, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addNext(3, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine();
@@ -311,7 +311,7 @@
long vibrationId = 1;
VibrationEffect fallback = VibrationEffect.createOneShot(10, 100);
- Vibration vibration = createVibration(vibrationId, CombinedVibrationEffect.createSynced(
+ Vibration vibration = createVibration(vibrationId, CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK)));
vibration.addFallback(VibrationEffect.EFFECT_CLICK, fallback);
VibrationThread thread = startThreadAndDispatcher(vibration);
@@ -498,7 +498,7 @@
mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_TICK);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(VIBRATOR_ID, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine();
@@ -524,7 +524,7 @@
mVibratorProviders.get(3).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
waitForCompletion(thread);
@@ -557,7 +557,7 @@
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
.compose();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.addVibrator(3, VibrationEffect.createWaveform(
@@ -603,7 +603,7 @@
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
.compose();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSequential()
+ CombinedVibration effect = CombinedVibration.startSequential()
.addNext(3, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), /* delay= */ 50)
.addNext(1, VibrationEffect.createOneShot(10, 100), /* delay= */ 50)
.addNext(2, composed, /* delay= */ 50)
@@ -652,7 +652,7 @@
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 100)
.compose();
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(composed);
+ CombinedVibration effect = CombinedVibration.createParallel(composed);
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
assertTrue(waitUntil(t -> !mVibratorProviders.get(1).getEffectSegments().isEmpty()
@@ -686,7 +686,7 @@
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
.compose();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.addVibrator(3, VibrationEffect.createWaveform(new long[]{10}, new int[]{100}, -1))
@@ -717,7 +717,7 @@
when(mThreadCallbacks.prepareSyncedVibration(anyLong(), any())).thenReturn(false);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(10, 100))
.addVibrator(2, VibrationEffect.createWaveform(new long[]{5}, new int[]{200}, -1))
.combine();
@@ -746,7 +746,7 @@
when(mThreadCallbacks.triggerSyncedVibration(anyLong())).thenReturn(false);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(10, 100))
.addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.combine();
@@ -772,7 +772,7 @@
mVibratorProviders.get(3).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createWaveform(
new long[]{5, 10, 10}, new int[]{1, 2, 3}, -1))
.addVibrator(2, VibrationEffect.createWaveform(
@@ -851,7 +851,7 @@
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f, 100)
@@ -885,7 +885,7 @@
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
long vibrationId = 1;
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createWaveform(
new long[]{100, 100}, new int[]{1, 2}, 0))
.addVibrator(2, VibrationEffect.createOneShot(100, 100))
@@ -938,11 +938,11 @@
}
private VibrationThread startThreadAndDispatcher(long vibrationId, VibrationEffect effect) {
- return startThreadAndDispatcher(vibrationId, CombinedVibrationEffect.createSynced(effect));
+ return startThreadAndDispatcher(vibrationId, CombinedVibration.createParallel(effect));
}
private VibrationThread startThreadAndDispatcher(long vibrationId,
- CombinedVibrationEffect effect) {
+ CombinedVibration effect) {
return startThreadAndDispatcher(createVibration(vibrationId, effect));
}
@@ -982,7 +982,7 @@
mTestLooper.dispatchAll();
}
- private Vibration createVibration(long id, CombinedVibrationEffect effect) {
+ private Vibration createVibration(long id, CombinedVibration effect) {
return new Vibration(mVibrationToken, (int) id, effect, ATTRS, UID, PACKAGE_NAME, "reason");
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
index 2e9aad1..59370e2 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
@@ -298,8 +298,10 @@
VibratorInfo.FrequencyMapping frequencyMapping = new VibratorInfo.FrequencyMapping(
Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
when(mNativeWrapperMock.getInfo(/* suggestedFrequencyRange= */ 100)).thenReturn(
- new VibratorInfo(VIBRATOR_ID, capabilities, null, null, null, Float.NaN,
- frequencyMapping));
+ new VibratorInfo.Builder(VIBRATOR_ID)
+ .setCapabilities(capabilities)
+ .setFrequencyMapping(frequencyMapping)
+ .build());
}
private PrebakedSegment createPrebaked(int effectId, int effectStrength) {
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index 12ced38..b4c1de1 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -49,7 +49,7 @@
import android.hardware.vibrator.IVibratorManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.Handler;
import android.os.IBinder;
import android.os.IVibratorStateListener;
@@ -231,10 +231,10 @@
assertNotNull(service.getVibratorInfo(1));
assertFalse(service.isVibrating(1));
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
vibrate(service, effect, HAPTIC_FEEDBACK_ATTRS);
- service.cancelVibrate(service);
+ service.cancelVibrate(/* usageFilter= */ -1, service);
assertTrue(service.setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
@@ -343,7 +343,7 @@
service.registerVibratorStateListener(i, listeners[i]);
}
- vibrate(service, CombinedVibrationEffect.startSynced()
+ vibrate(service, CombinedVibration.startParallel()
.addVibrator(0, VibrationEffect.createOneShot(40, 100))
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.combine(), ALARM_ATTRS);
@@ -361,7 +361,7 @@
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
mVibratorProviders.get(3).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
assertTrue(createSystemReadyService().setAlwaysOnEffect(
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
@@ -382,7 +382,7 @@
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
mVibratorProviders.get(4).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK))
.addVibrator(3, VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
@@ -409,7 +409,7 @@
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
mVibratorProviders.get(3).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
assertTrue(createSystemReadyService().setAlwaysOnEffect(
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
@@ -427,7 +427,7 @@
mockVibrators(1);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
assertFalse(createSystemReadyService().setAlwaysOnEffect(
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
@@ -440,7 +440,7 @@
mockVibrators(1);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSequential()
+ CombinedVibration effect = CombinedVibration.startSequential()
.addNext(0, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.combine();
assertFalse(createSystemReadyService().setAlwaysOnEffect(
@@ -454,9 +454,9 @@
mockVibrators(1);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect mono = CombinedVibrationEffect.createSynced(
+ CombinedVibration mono = CombinedVibration.createParallel(
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
- CombinedVibrationEffect stereo = CombinedVibrationEffect.startSynced()
+ CombinedVibration stereo = CombinedVibration.startParallel()
.addVibrator(0, VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
.combine();
assertFalse(service.setAlwaysOnEffect(UID, PACKAGE_NAME, 1, mono, ALARM_ATTRS));
@@ -566,6 +566,54 @@
}
@Test
+ public void vibrate_withOngoingRepeatingVibration_ignoresEffect() throws Exception {
+ mockVibrators(1);
+ mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+ VibratorManagerService service = createSystemReadyService();
+
+ VibrationEffect repeatingEffect = VibrationEffect.createWaveform(
+ new long[]{10_000, 10_000}, new int[]{128, 255}, 1);
+ vibrate(service, repeatingEffect, new VibrationAttributes.Builder().setUsage(
+ VibrationAttributes.USAGE_UNKNOWN).build());
+
+ // VibrationThread will start this vibration async, so wait before checking it started.
+ assertTrue(waitUntil(s -> !mVibratorProviders.get(1).getEffectSegments().isEmpty(),
+ service, TEST_TIMEOUT_MILLIS));
+
+ vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK),
+ new VibrationAttributes.Builder().setUsage(
+ VibrationAttributes.USAGE_TOUCH).build());
+
+ // Wait before checking it never played a second effect.
+ assertFalse(waitUntil(s -> mVibratorProviders.get(1).getEffectSegments().size() > 1,
+ service, /* timeout= */ 50));
+ }
+
+ @Test
+ public void vibrate_withOngoingAlarmVibration_ignoresEffect() throws Exception {
+ mockVibrators(1);
+ mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+ VibratorManagerService service = createSystemReadyService();
+
+ VibrationEffect alarmEffect = VibrationEffect.createWaveform(
+ new long[]{10_000, 10_000}, new int[]{128, 255}, -1);
+ vibrate(service, alarmEffect, new VibrationAttributes.Builder().setUsage(
+ VibrationAttributes.USAGE_ALARM).build());
+
+ // VibrationThread will start this vibration async, so wait before checking it started.
+ assertTrue(waitUntil(s -> !mVibratorProviders.get(1).getEffectSegments().isEmpty(),
+ service, TEST_TIMEOUT_MILLIS));
+
+ vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK),
+ new VibrationAttributes.Builder().setUsage(
+ VibrationAttributes.USAGE_TOUCH).build());
+
+ // Wait before checking it never played a second effect.
+ assertFalse(waitUntil(s -> mVibratorProviders.get(1).getEffectSegments().size() > 1,
+ service, /* timeout= */ 50));
+ }
+
+ @Test
public void vibrate_withInputDevices_vibratesInputDevices() throws Exception {
mockVibrators(1);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
@@ -576,7 +624,7 @@
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 1);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
+ CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.createOneShot(10, 10));
vibrate(service, effect, ALARM_ATTRS);
verify(mIInputManagerMock).vibrateCombined(eq(1), eq(effect), any());
@@ -632,7 +680,7 @@
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 100)
.compose();
- CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(composed);
+ CombinedVibration effect = CombinedVibration.createParallel(composed);
// Wait for vibration to start, it should finish right away with trigger callback.
vibrate(service, effect, ALARM_ATTRS);
@@ -664,7 +712,7 @@
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
@@ -690,7 +738,7 @@
fakeVibrator1.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.combine();
@@ -710,7 +758,7 @@
when(mNativeWrapperMock.prepareSynced(any())).thenReturn(false);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(10, 50))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.combine();
@@ -731,7 +779,7 @@
when(mNativeWrapperMock.triggerSynced(anyLong())).thenReturn(false);
VibratorManagerService service = createSystemReadyService();
- CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
+ CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(10, 50))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.combine();
@@ -761,22 +809,22 @@
fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
VibratorManagerService service = createSystemReadyService();
- vibrate(service, CombinedVibrationEffect.startSynced()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
- .combine(), ALARM_ATTRS);
- assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
- service, TEST_TIMEOUT_MILLIS));
-
- vibrate(service, CombinedVibrationEffect.startSequential()
+ vibrate(service, CombinedVibration.startSequential()
.addNext(1, VibrationEffect.createOneShot(20, 100))
.combine(), NOTIFICATION_ATTRS);
- assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
+ assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
service, TEST_TIMEOUT_MILLIS));
vibrate(service, VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
.compose(), HAPTIC_FEEDBACK_ATTRS);
+ assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 3,
+ service, TEST_TIMEOUT_MILLIS));
+
+ vibrate(service, CombinedVibration.startParallel()
+ .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .combine(), ALARM_ATTRS);
assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 4,
service, TEST_TIMEOUT_MILLIS));
@@ -785,17 +833,17 @@
assertEquals(4, fakeVibrator.getEffectSegments().size());
assertEquals(1, fakeVibrator.getAmplitudes().size());
- // Alarm vibration is always VIBRATION_INTENSITY_HIGH.
- PrebakedSegment expected = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
- assertEquals(expected, fakeVibrator.getEffectSegments().get(0));
-
// Notification vibrations will be scaled with SCALE_VERY_HIGH.
assertTrue(0.6 < fakeVibrator.getAmplitudes().get(0));
// Haptic feedback vibrations will be scaled with SCALE_LOW.
- assertTrue(0.5 < ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale());
- assertTrue(0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(3)).getScale());
+ assertTrue(0.5 < ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(1)).getScale());
+ assertTrue(0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale());
+
+ // Alarm vibration is always VIBRATION_INTENSITY_HIGH.
+ PrebakedSegment expected = new PrebakedSegment(
+ VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ assertEquals(expected, fakeVibrator.getEffectSegments().get(3));
// Ring vibrations have intensity OFF and are not played.
}
@@ -805,7 +853,7 @@
mockVibrators(1, 2);
VibratorManagerService service = createSystemReadyService();
vibrate(service,
- CombinedVibrationEffect.startSynced()
+ CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(1000, 100))
.combine(),
HAPTIC_FEEDBACK_ATTRS);
@@ -832,17 +880,42 @@
}
@Test
- public void cancelVibrate_stopsVibrating() throws Exception {
+ public void cancelVibrate_withoutUsageFilter_stopsVibrating() throws Exception {
mockVibrators(1);
VibratorManagerService service = createSystemReadyService();
- service.cancelVibrate(service);
+ service.cancelVibrate(/* usageFilter= */ -1, service);
assertFalse(service.isVibrating(1));
- vibrate(service, VibrationEffect.createOneShot(10_000, 100), ALARM_ATTRS);
+ vibrate(service, VibrationEffect.createOneShot(10 * TEST_TIMEOUT_MILLIS, 100), ALARM_ATTRS);
assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
- service.cancelVibrate(service);
+ service.cancelVibrate(/* usageFilter= */ -1, service);
+ assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+ }
+
+ @Test
+ public void cancelVibrate_withFilter_onlyCancelsVibrationWithFilteredUsage() throws Exception {
+ mockVibrators(1);
+ VibratorManagerService service = createSystemReadyService();
+
+ vibrate(service, VibrationEffect.createOneShot(10 * TEST_TIMEOUT_MILLIS, 100), ALARM_ATTRS);
+ assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+
+ // Vibration is not cancelled with a different usage.
+ service.cancelVibrate(VibrationAttributes.USAGE_RINGTONE, service);
+ assertFalse(waitUntil(s -> !s.isVibrating(1), service, /* timeout= */ 50));
+
+ // Vibration is not cancelled with a different usage class used as filter.
+ service.cancelVibrate(
+ VibrationAttributes.USAGE_CLASS_FEEDBACK | ~VibrationAttributes.USAGE_CLASS_MASK,
+ service);
+ assertFalse(waitUntil(s -> !s.isVibrating(1), service, /* timeout= */ 50));
+
+ // Vibration is cancelled with usage class as filter.
+ service.cancelVibrate(
+ VibrationAttributes.USAGE_CLASS_ALARM | ~VibrationAttributes.USAGE_CLASS_MASK,
+ service);
assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
}
@@ -893,10 +966,10 @@
private void vibrate(VibratorManagerService service, VibrationEffect effect,
VibrationAttributes attrs) {
- vibrate(service, CombinedVibrationEffect.createSynced(effect), attrs);
+ vibrate(service, CombinedVibration.createParallel(effect), attrs);
}
- private void vibrate(VibratorManagerService service, CombinedVibrationEffect effect,
+ private void vibrate(VibratorManagerService service, CombinedVibration effect,
VibrationAttributes attrs) {
service.vibrate(UID, PACKAGE_NAME, effect, attrs, "some reason", service);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
index 584bcf4..8c92a47 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
@@ -106,8 +106,8 @@
@Override
public void resolveRotation(@NonNull RotationResolverCallbackInternal callback,
- @Surface.Rotation int proposedRotation, @Surface.Rotation int currentRotation,
- @DurationMillisLong long timeoutMillis,
+ String packageName, @Surface.Rotation int proposedRotation,
+ @Surface.Rotation int currentRotation, @DurationMillisLong long timeoutMillis,
@NonNull CancellationSignal cancellationSignal) {
callback.onSuccess(mResult);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
index ff88174..00eb0f2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -64,6 +64,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
@@ -444,11 +445,14 @@
}
private void verifyStopVibrate() {
- verify(mVibrator, times(1)).cancel();
+ int alarmClassUsageFilter =
+ VibrationAttributes.USAGE_CLASS_ALARM | ~VibrationAttributes.USAGE_CLASS_MASK;
+ verify(mVibrator, times(1)).cancel(eq(alarmClassUsageFilter));
}
- private void verifyNeverStopVibrate() throws RemoteException {
+ private void verifyNeverStopVibrate() {
verify(mVibrator, never()).cancel();
+ verify(mVibrator, never()).cancel(anyInt());
}
private void verifyNeverLights() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index 27a4826..c502ed5 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -1416,6 +1416,18 @@
new ArraySet(Arrays.asList(new ComponentName("xml", "class"))));
}
+ @Test
+ public void loadDefaults_versionLatest_NoLoadDefaults() throws Exception {
+ resetComponentsAndPackages();
+ mDefaults.add(new ComponentName("default", "class"));
+ mDefaultsString = "xml/class";
+ mVersionString = String.valueOf(mService.DB_VERSION);
+ loadXml(mService);
+ assertEquals(mService.getDefaultComponents(),
+ new ArraySet(Arrays.asList(new ComponentName("xml", "class"))));
+ }
+
+
private void resetComponentsAndPackages() {
ArrayMap<Integer, ArrayMap<Integer, String>> empty = new ArrayMap(1);
ArrayMap<Integer, String> emptyPkgs = new ArrayMap(0);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
index 17c9411..c11ac3a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -18,10 +18,12 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -38,6 +40,8 @@
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
+import android.testing.TestableContext;
+import android.util.ArraySet;
import android.util.IntArray;
import android.util.TypedXmlPullParser;
import android.util.Xml;
@@ -53,6 +57,7 @@
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
public class NotificationAssistantsTest extends UiServiceTestCase {
@@ -73,6 +78,7 @@
@Mock
private ManagedServices.UserProfiles mUserProfiles;
+ private TestableContext mContext = spy(getContext());
Object mLock = new Object();
@@ -82,10 +88,11 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- getContext().setMockPackageManager(mPm);
- getContext().addMockSystemService(Context.USER_SERVICE, mUm);
- mAssistants = spy(mNm.new NotificationAssistants(getContext(), mLock, mUserProfiles, miPm));
+ mContext.setMockPackageManager(mPm);
+ mContext.addMockSystemService(Context.USER_SERVICE, mUm);
+ mAssistants = spy(mNm.new NotificationAssistants(mContext, mLock, mUserProfiles, miPm));
when(mNm.getBinderService()).thenReturn(mINm);
+ mContext.ensureTestableResources();
List<ResolveInfo> approved = new ArrayList<>();
ResolveInfo resolve = new ResolveInfo();
@@ -113,6 +120,7 @@
profileIds.add(10);
profileIds.add(12);
when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds);
+ when(mNm.isNASMigrationDone(anyInt())).thenReturn(true);
}
@Test
@@ -189,4 +197,122 @@
verify(mNm, never()).setNotificationAssistantAccessGrantedForUserInternal(
any(ComponentName.class), eq(mZero.id), anyBoolean(), anyBoolean());
}
+
+ @Test
+ public void testLoadDefaultsFromConfig() {
+ ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ ComponentName newDefaultComponent = ComponentName.unflattenFromString("package/Component2");
+
+ doReturn(new ArraySet<>(Arrays.asList(oldDefaultComponent, newDefaultComponent)))
+ .when(mAssistants).queryPackageForServices(any(), anyInt(), anyInt());
+ // Test loadDefaultsFromConfig() add the config value to mDefaultComponents instead of
+ // mDefaultFromConfig
+ when(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultAssistantAccessComponent))
+ .thenReturn(oldDefaultComponent.flattenToString());
+ mAssistants.loadDefaultsFromConfig();
+ assertEquals(new ArraySet<>(Arrays.asList(oldDefaultComponent)),
+ mAssistants.getDefaultComponents());
+ assertNull(mAssistants.getDefaultFromConfig());
+
+ // Test loadDefaultFromConfig(false) only updates the mDefaultFromConfig
+ when(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultAssistantAccessComponent))
+ .thenReturn(newDefaultComponent.flattenToString());
+ mAssistants.loadDefaultsFromConfig(false);
+ assertEquals(new ArraySet<>(Arrays.asList(oldDefaultComponent)),
+ mAssistants.getDefaultComponents());
+ assertEquals(newDefaultComponent, mAssistants.getDefaultFromConfig());
+
+ // Test resetDefaultFromConfig updates the mDefaultComponents to new config value
+ mAssistants.resetDefaultFromConfig();
+ assertEquals(new ArraySet<>(Arrays.asList(newDefaultComponent)),
+ mAssistants.getDefaultComponents());
+ assertEquals(newDefaultComponent, mAssistants.getDefaultFromConfig());
+ }
+
+ @Test
+ public void testNASSettingUpgrade_userNotSet_differentDefaultNAS() {
+ ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ ComponentName newDefaultComponent = ComponentName.unflattenFromString("package/Component2");
+
+ when(mNm.isNASMigrationDone(anyInt())).thenReturn(false);
+ doReturn(new ArraySet<>(Arrays.asList(newDefaultComponent)))
+ .when(mAssistants).queryPackageForServices(any(), anyInt(), anyInt());
+ when(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultAssistantAccessComponent))
+ .thenReturn(newDefaultComponent.flattenToString());
+
+ // User hasn't set the default NAS, set the oldNAS as the default with userSet=false here.
+ mAssistants.setPackageOrComponentEnabled(oldDefaultComponent.flattenToString(),
+ mZero.id, true, true /*enabled*/, false /*userSet*/);
+
+
+ // The migration for userSet==false happens in resetDefaultAssistantsIfNecessary
+ mAssistants.resetDefaultAssistantsIfNecessary();
+
+ // Verify the migration happened: setDefaultAssistantForUser should be called to
+ // update defaults
+ verify(mNm, times(1)).setNASMigrationDone(eq(mZero.id));
+ verify(mNm, times(1)).setDefaultAssistantForUser(eq(mZero.id));
+ assertEquals(new ArraySet<>(Arrays.asList(newDefaultComponent)),
+ mAssistants.getDefaultComponents());
+
+ when(mNm.isNASMigrationDone(anyInt())).thenReturn(true);
+
+ // Test resetDefaultAssistantsIfNecessary again since it will be called on every reboot
+ mAssistants.resetDefaultAssistantsIfNecessary();
+
+ // The migration should not happen again, the invoke time for migration should not increase
+ verify(mNm, times(1)).setNASMigrationDone(eq(mZero.id));
+ // The invoke time outside migration part should increase by 1
+ verify(mNm, times(2)).setDefaultAssistantForUser(eq(mZero.id));
+ }
+
+ @Test
+ public void testNASSettingUpgrade_userNotSet_sameDefaultNAS() {
+ ComponentName defaultComponent = ComponentName.unflattenFromString("package/Component1");
+
+ when(mNm.isNASMigrationDone(anyInt())).thenReturn(false);
+ doReturn(new ArraySet<>(Arrays.asList(defaultComponent)))
+ .when(mAssistants).queryPackageForServices(any(), anyInt(), anyInt());
+ when(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultAssistantAccessComponent))
+ .thenReturn(defaultComponent.flattenToString());
+
+ // User hasn't set the default NAS, set the oldNAS as the default with userSet=false here.
+ mAssistants.setPackageOrComponentEnabled(defaultComponent.flattenToString(),
+ mZero.id, true, true /*enabled*/, false /*userSet*/);
+
+ // The migration for userSet==false happens in resetDefaultAssistantsIfNecessary
+ mAssistants.resetDefaultAssistantsIfNecessary();
+
+ verify(mNm, times(1)).setNASMigrationDone(eq(mZero.id));
+ verify(mNm, times(1)).setDefaultAssistantForUser(eq(mZero.id));
+ assertEquals(new ArraySet<>(Arrays.asList(defaultComponent)),
+ mAssistants.getDefaultComponents());
+ }
+
+ @Test
+ public void testNASSettingUpgrade_userNotSet_defaultNASNone() {
+ ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ when(mNm.isNASMigrationDone(anyInt())).thenReturn(false);
+ doReturn(new ArraySet<>(Arrays.asList(oldDefaultComponent)))
+ .when(mAssistants).queryPackageForServices(any(), anyInt(), anyInt());
+ // New default is none
+ when(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultAssistantAccessComponent))
+ .thenReturn("");
+
+ // User hasn't set the default NAS, set the oldNAS as the default with userSet=false here.
+ mAssistants.setPackageOrComponentEnabled(oldDefaultComponent.flattenToString(),
+ mZero.id, true, true /*enabled*/, false /*userSet*/);
+
+ // The migration for userSet==false happens in resetDefaultAssistantsIfNecessary
+ mAssistants.resetDefaultAssistantsIfNecessary();
+
+ verify(mNm, times(1)).setNASMigrationDone(eq(mZero.id));
+ verify(mNm, times(1)).setDefaultAssistantForUser(eq(mZero.id));
+ assertEquals(new ArraySet<>(), mAssistants.getDefaultComponents());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 8be19f0..87efaa2 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -58,10 +58,13 @@
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING;
-import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_SILENT;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
+import static com.android.server.notification.NotificationManagerService.ACTION_DISABLE_NAS;
+import static com.android.server.notification.NotificationManagerService.ACTION_ENABLE_NAS;
+import static com.android.server.notification.NotificationManagerService.ACTION_LEARNMORE_NAS;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
@@ -313,6 +316,7 @@
@Mock
MultiRateLimiter mToastRateLimiter;
BroadcastReceiver mPackageIntentReceiver;
+ BroadcastReceiver mNASIntentReceiver;
NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake();
private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake(
1 << 30);
@@ -526,6 +530,8 @@
verify(mContext, atLeastOnce()).registerReceiverAsUser(broadcastReceiverCaptor.capture(),
any(), intentFilterCaptor.capture(), any(), any());
+ verify(mContext, atLeastOnce()).registerReceiver(broadcastReceiverCaptor.capture(),
+ intentFilterCaptor.capture());
List<BroadcastReceiver> broadcastReceivers = broadcastReceiverCaptor.getAllValues();
List<IntentFilter> intentFilters = intentFilterCaptor.getAllValues();
@@ -535,10 +541,14 @@
&& filter.hasAction(Intent.ACTION_PACKAGES_UNSUSPENDED)
&& filter.hasAction(Intent.ACTION_PACKAGES_SUSPENDED)) {
mPackageIntentReceiver = broadcastReceivers.get(i);
- break;
+ } else if (filter.hasAction(ACTION_ENABLE_NAS)
+ && filter.hasAction(ACTION_DISABLE_NAS)
+ && filter.hasAction(ACTION_LEARNMORE_NAS)) {
+ mNASIntentReceiver = broadcastReceivers.get(i);
}
}
assertNotNull("package intent receiver should exist", mPackageIntentReceiver);
+ assertNotNull("nas intent receiver should exist", mNASIntentReceiver);
// Pretend the shortcut exists
List<ShortcutInfo> shortcutInfos = new ArrayList<>();
@@ -632,6 +642,16 @@
mPackageIntentReceiver.onReceive(getContext(), intent);
}
+ private void simulateNASUpgradeBroadcast(String action, int uid) {
+ final Bundle extras = new Bundle();
+ extras.putInt(Intent.EXTRA_USER_ID, uid);
+
+ final Intent intent = new Intent(action);
+ intent.putExtras(extras);
+
+ mNASIntentReceiver.onReceive(getContext(), intent);
+ }
+
private ArrayMap<Boolean, ArrayList<ComponentName>> generateResetComponentValues() {
ArrayMap<Boolean, ArrayList<ComponentName>> changed = new ArrayMap<>();
changed.put(true, new ArrayList<>());
@@ -5730,6 +5750,223 @@
}
@Test
+ public void testNASSettingUpgrade_userSetNull_showOnBoarding() throws RemoteException {
+ ComponentName newDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ TestableNotificationManagerService service = spy(mService);
+ int userId = 11;
+ setUsers(new int[]{userId});
+ setNASMigrationDone(false, userId);
+ when(mAssistants.getDefaultFromConfig())
+ .thenReturn(newDefaultComponent);
+ when(mAssistants.getAllowedComponents(anyInt()))
+ .thenReturn(new ArrayList<>());
+ when(mAssistants.hasUserSet(userId)).thenReturn(true);
+
+ service.migrateDefaultNASShowNotificationIfNecessary();
+ assertFalse(service.isNASMigrationDone(userId));
+ verify(service, times(1)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+
+ //Test user clear data before enable/disable from onboarding notification
+ ArrayMap<Boolean, ArrayList<ComponentName>> changedListeners =
+ generateResetComponentValues();
+ when(mListeners.resetComponents(anyString(), anyInt())).thenReturn(changedListeners);
+ ArrayMap<Boolean, ArrayList<ComponentName>> changes = new ArrayMap<>();
+ changes.put(true, new ArrayList(Arrays.asList(newDefaultComponent)));
+ changes.put(false, new ArrayList());
+ when(mAssistants.resetComponents(anyString(), anyInt())).thenReturn(changes);
+
+ //Clear data
+ service.getBinderService().clearData("package", userId, false);
+ //Test migrate flow again
+ service.migrateDefaultNASShowNotificationIfNecessary();
+
+ //The notification should be still there
+ assertFalse(service.isNASMigrationDone(userId));
+ verify(service, times(2)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+ assertEquals(null, service.getApprovedAssistant(userId));
+ }
+
+ @Test
+ public void testNASSettingUpgrade_userSetDifferentDefault_showOnboarding()
+ throws RemoteException {
+ ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ ComponentName newDefaultComponent = ComponentName.unflattenFromString("package/Component2");
+ TestableNotificationManagerService service = spy(mService);
+ int userId = 11;
+ setUsers(new int[]{userId});
+ setNASMigrationDone(false, userId);
+ when(mAssistants.getDefaultComponents())
+ .thenReturn(new ArraySet<>(Arrays.asList(oldDefaultComponent)));
+ when(mAssistants.getDefaultFromConfig())
+ .thenReturn(newDefaultComponent);
+ when(mAssistants.getAllowedComponents(anyInt()))
+ .thenReturn(Arrays.asList(oldDefaultComponent));
+ when(mAssistants.hasUserSet(userId)).thenReturn(true);
+
+ service.migrateDefaultNASShowNotificationIfNecessary();
+ assertFalse(service.isNASMigrationDone(userId));
+ verify(service, times(1)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+
+ //Test user clear data before enable/disable from onboarding notification
+ ArrayMap<Boolean, ArrayList<ComponentName>> changedListeners =
+ generateResetComponentValues();
+ when(mListeners.resetComponents(anyString(), anyInt())).thenReturn(changedListeners);
+ ArrayMap<Boolean, ArrayList<ComponentName>> changes = new ArrayMap<>();
+ changes.put(true, new ArrayList(Arrays.asList(newDefaultComponent)));
+ changes.put(false, new ArrayList());
+ when(mAssistants.resetComponents(anyString(), anyInt())).thenReturn(changes);
+
+ //Clear data
+ service.getBinderService().clearData("package", userId, false);
+ //Test migrate flow again
+ service.migrateDefaultNASShowNotificationIfNecessary();
+
+ //The notification should be still there
+ assertFalse(service.isNASMigrationDone(userId));
+ verify(service, times(2)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+ assertEquals(oldDefaultComponent, service.getApprovedAssistant(userId));
+ }
+
+ @Test
+ public void testNASSettingUpgrade_multiUser() throws RemoteException {
+ ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");
+ ComponentName newDefaultComponent = ComponentName.unflattenFromString("package/Component2");
+ TestableNotificationManagerService service = spy(mService);
+ int userId1 = 11;
+ int userId2 = 12;
+ setUsers(new int[]{userId1, userId2});
+ setNASMigrationDone(false, userId1);
+ setNASMigrationDone(false, userId2);
+ when(mAssistants.getDefaultComponents())
+ .thenReturn(new ArraySet<>(Arrays.asList(oldDefaultComponent)));
+ when(mAssistants.getDefaultFromConfig())
+ .thenReturn(newDefaultComponent);
+ //User1: need onboarding
+ when(mAssistants.getAllowedComponents(userId1))
+ .thenReturn(Arrays.asList(oldDefaultComponent));
+ //User2: no onboarding
+ when(mAssistants.getAllowedComponents(userId2))
+ .thenReturn(Arrays.asList(newDefaultComponent));
+
+ when(mAssistants.hasUserSet(userId1)).thenReturn(true);
+ when(mAssistants.hasUserSet(userId2)).thenReturn(true);
+
+ service.migrateDefaultNASShowNotificationIfNecessary();
+ assertFalse(service.isNASMigrationDone(userId1));
+ assertTrue(service.isNASMigrationDone(userId2));
+
+ verify(service, times(1)).createNASUpgradeNotification(any(Integer.class));
+ // only user2's default get updated
+ verify(mAssistants, times(1)).resetDefaultFromConfig();
+ }
+
+ @Test
+ public void testNASSettingUpgrade_clearDataAfterMigrationIsDone() throws RemoteException {
+ ComponentName defaultComponent = ComponentName.unflattenFromString("package/Component");
+ TestableNotificationManagerService service = spy(mService);
+ int userId = 12;
+ setUsers(new int[]{userId});
+ when(mAssistants.getDefaultComponents())
+ .thenReturn(new ArraySet<>(Arrays.asList(defaultComponent)));
+ when(mAssistants.hasUserSet(userId)).thenReturn(true);
+ setNASMigrationDone(true, userId);
+
+ //Test User clear data
+ ArrayMap<Boolean, ArrayList<ComponentName>> changedListeners =
+ generateResetComponentValues();
+ when(mListeners.resetComponents(anyString(), anyInt())).thenReturn(changedListeners);
+ ArrayMap<Boolean, ArrayList<ComponentName>> changes = new ArrayMap<>();
+ changes.put(true, new ArrayList(Arrays.asList(defaultComponent)));
+ changes.put(false, new ArrayList());
+ when(mAssistants.resetComponents(anyString(), anyInt())).thenReturn(changes);
+
+ //Clear data
+ service.getBinderService().clearData("package", userId, false);
+ //Test migrate flow again
+ service.migrateDefaultNASShowNotificationIfNecessary();
+
+ //The notification should not appear again
+ verify(service, times(0)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+ }
+
+ @Test
+ public void testNASUpgradeNotificationDisableBroadcast() {
+ int userId = 11;
+ setUsers(new int[]{userId});
+ TestableNotificationManagerService service = spy(mService);
+ setNASMigrationDone(false, userId);
+
+ simulateNASUpgradeBroadcast(ACTION_DISABLE_NAS, userId);
+
+ assertTrue(service.isNASMigrationDone(userId));
+ // User disabled the NAS from notification, the default stored in xml should be null
+ // rather than the new default
+ verify(mAssistants, times(1)).clearDefaults();
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+
+ //No more notification after disabled
+ service.migrateDefaultNASShowNotificationIfNecessary();
+ verify(service, times(0)).createNASUpgradeNotification(eq(userId));
+ }
+
+ @Test
+ public void testNASUpgradeNotificationEnableBroadcast_multiUser() {
+ int userId1 = 11;
+ int userId2 = 12;
+ setUsers(new int[]{userId1, userId2});
+ TestableNotificationManagerService service = spy(mService);
+ setNASMigrationDone(false, userId1);
+ setNASMigrationDone(false, userId2);
+
+ simulateNASUpgradeBroadcast(ACTION_ENABLE_NAS, userId1);
+
+ assertTrue(service.isNASMigrationDone(userId1));
+ assertFalse(service.isNASMigrationDone(userId2));
+ verify(mAssistants, times(1)).resetDefaultFromConfig();
+
+ service.migrateDefaultNASShowNotificationIfNecessary();
+ verify(service, times(0)).createNASUpgradeNotification(eq(userId1));
+ }
+
+ @Test
+ public void testNASUpgradeNotificationLearnMoreBroadcast() {
+ int userId = 11;
+ setUsers(new int[]{userId});
+ TestableNotificationManagerService service = spy(mService);
+ setNASMigrationDone(false, userId);
+ doNothing().when(mContext).startActivity(any());
+
+ simulateNASUpgradeBroadcast(ACTION_LEARNMORE_NAS, userId);
+
+ verify(mContext, times(1)).startActivity(any(Intent.class));
+ assertFalse(service.isNASMigrationDone(userId));
+ verify(service, times(0)).createNASUpgradeNotification(eq(userId));
+ verify(mAssistants, times(0)).resetDefaultFromConfig();
+ }
+
+
+ private void setNASMigrationDone(boolean done, int userId) {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NAS_SETTINGS_UPDATED, done ? 1 : 0, userId);
+ }
+
+ private void setUsers(int[] userIds) {
+ List<UserInfo> users = new ArrayList<>();
+ for (int id: userIds) {
+ users.add(new UserInfo(id, String.valueOf(id), 0));
+ }
+ for (UserInfo user : users) {
+ when(mUm.getUserInfo(eq(user.id))).thenReturn(user);
+ }
+ when(mUm.getUsers()).thenReturn(users);
+ }
+
+ @Test
public void clearDefaultListenersPackageShouldEnableIt() throws RemoteException {
ArrayMap<Boolean, ArrayList<ComponentName>> changedAssistants =
generateResetComponentValues();
diff --git a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
index 78074d6..1b9308d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
@@ -77,7 +77,7 @@
dc.getImeContainer(), 1000 /* ownerUid */, TYPE_INPUT_METHOD_DIALOG,
null /* options */);
return true;
- }).when(wms).registerWindowContextListener(any(), eq(TYPE_INPUT_METHOD_DIALOG),
+ }).when(wms).attachWindowContextToDisplayArea(any(), eq(TYPE_INPUT_METHOD_DIALOG),
anyInt(), any());
mSecondaryDisplay = new TestDisplayContent.Builder(mAtm, 1000, 1000).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
index 7714a6c..ee01b7f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -53,12 +53,16 @@
private boolean mAreCornersRounded = false;
private int mColor = Color.BLACK;
+ private boolean mHasWallpaperBackground = false;
+ private int mBlurRadius = 0;
+ private float mDarkScrimAlpha = 0.5f;
@Before
public void setUp() throws Exception {
mSurfaces = new SurfaceControlMocker();
mLetterbox = new Letterbox(mSurfaces, StubTransaction::new,
- () -> mAreCornersRounded, () -> Color.valueOf(mColor));
+ () -> mAreCornersRounded, () -> Color.valueOf(mColor),
+ () -> mHasWallpaperBackground, () -> mBlurRadius, () -> mDarkScrimAlpha);
mTransaction = spy(StubTransaction.class);
}
@@ -190,6 +194,22 @@
}
@Test
+ public void testNeedsApplySurfaceChanges_wallpaperBackgroundRequested() {
+ mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+ mLetterbox.applySurfaceChanges(mTransaction);
+
+ verify(mTransaction).setAlpha(mSurfaces.top, 1.0f);
+ assertFalse(mLetterbox.needsApplySurfaceChanges());
+
+ mHasWallpaperBackground = true;
+
+ assertTrue(mLetterbox.needsApplySurfaceChanges());
+
+ mLetterbox.applySurfaceChanges(mTransaction);
+ verify(mTransaction).setAlpha(mSurfaces.top, mDarkScrimAlpha);
+ }
+
+ @Test
public void testApplySurfaceChanges_cornersNotRounded_surfaceBehindNotCreated() {
mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
mLetterbox.applySurfaceChanges(mTransaction);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 6ffdb09..5d6a5c0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -34,6 +34,7 @@
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.spyOn;
+import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -754,6 +755,7 @@
final Task alwaysOnTopTask = taskDisplayArea.createRootTask(WINDOWING_MODE_MULTI_WINDOW,
ACTIVITY_TYPE_STANDARD, true /* onTop */);
alwaysOnTopTask.setAlwaysOnTop(true);
+ alwaysOnTopTask.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, true);
assertFalse("Always on top tasks should not be visible recents",
mRecentTasks.isVisibleRecentTask(alwaysOnTopTask));
@@ -1030,9 +1032,6 @@
assertNotRestoreTask(() -> mAtm.cancelTaskWindowTransition(taskId));
assertNotRestoreTask(
() -> mAtm.resizeTask(taskId, null /* bounds */, 0 /* resizeMode */));
- assertNotRestoreTask(
- () -> mAtm.setTaskWindowingMode(taskId, WINDOWING_MODE_FULLSCREEN,
- false/* toTop */));
}
@Test
@@ -1197,8 +1196,6 @@
new int[]{ACTIVITY_TYPE_UNDEFINED}));
assertSecurityException(expectCallable, () -> mAtm.removeTask(0));
assertSecurityException(expectCallable,
- () -> mAtm.setTaskWindowingMode(0, WINDOWING_MODE_UNDEFINED, true));
- assertSecurityException(expectCallable,
() -> mAtm.moveTaskToRootTask(0, INVALID_STACK_ID, true));
assertSecurityException(expectCallable, () -> mAtm.getAllRootTaskInfos());
assertSecurityException(expectCallable,
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 7d137bc..153fd3a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -567,6 +567,37 @@
}
@Test
+ public void testFadeRotationAfterAttachAndBeforeRestore_notRestoreNavImmediately() {
+ setupForShouldAttachNavBarDuringTransition();
+ final ActivityRecord activity = createActivityRecord(mDefaultDisplay);
+ final ActivityRecord homeActivity = createHomeActivity();
+ initializeRecentsAnimationController(mController, homeActivity);
+
+ final WindowToken navToken = mDefaultDisplay.getDisplayPolicy().getNavigationBar().mToken;
+ final SurfaceControl.Transaction transaction = navToken.getPendingTransaction();
+
+ verify(mController.mStatusBar).setNavigationBarLumaSamplingEnabled(
+ mDefaultDisplay.mDisplayId, false);
+ verify(transaction).reparent(navToken.getSurfaceControl(), activity.getSurfaceControl());
+
+ final WindowContainer parent = navToken.getParent();
+ final NavBarFadeAnimationController navBarFadeAnimationController =
+ mDefaultDisplay.getDisplayPolicy().getNavBarFadeAnimationController();
+
+ FadeRotationAnimationController mockController =
+ mock(FadeRotationAnimationController.class);
+ doReturn(mockController).when(mDefaultDisplay).getFadeRotationAnimationController();
+
+ mController.cleanupAnimation(REORDER_MOVE_TO_TOP);
+ verify(mController.mStatusBar).setNavigationBarLumaSamplingEnabled(
+ mDefaultDisplay.mDisplayId, true);
+ verify(mockController).setOnShowRunnable(any());
+ verify(transaction, times(0)).reparent(navToken.getSurfaceControl(),
+ parent.getSurfaceControl());
+ verify(navBarFadeAnimationController, times(0)).fadeWindowToken(true);
+ }
+
+ @Test
public void testAttachNavBarInSplitScreenMode() {
setupForShouldAttachNavBarDuringTransition();
final ActivityRecord primary = createActivityRecordWithParentTask(mDefaultDisplay,
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 97cead1..7c2cfab 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -1360,6 +1360,31 @@
}
@Test
+ public void testSandboxDisplayApis_letterboxAppNotSandboxed() {
+ // Set up a display in landscape with an unresizable app.
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setSandboxDisplayApis(false /* sandboxDisplayApis */);
+ prepareUnresizable(mActivity, 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+ assertFitted();
+
+ // Activity max bounds not be sandboxed since sandboxing is disabled.
+ assertThat(mActivity.getMaxBounds()).isEqualTo(mActivity.mDisplayContent.getBounds());
+ }
+
+ @Test
+ public void testSandboxDisplayApis_letterboxAppSandboxed() {
+ // Set up a display in landscape with an unresizable app.
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setSandboxDisplayApis(true /* sandboxDisplayApis */);
+ prepareUnresizable(mActivity, 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+ assertFitted();
+
+ // Activity max bounds should be sandboxed since sandboxing is enabled.
+ assertActivityMaxBoundsSandboxed();
+ }
+
+
+ @Test
public void testTaskDisplayAreaNotFillDisplay() {
setUpDisplaySizeWithApp(1400, 2800);
final DisplayContent display = mActivity.mDisplayContent;
diff --git a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java
index bb9e24f..f3616da6c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java
+++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java
@@ -146,12 +146,6 @@
}
@Override
- public SurfaceControl.Transaction deferTransactionUntil(SurfaceControl sc,
- SurfaceControl barrier, long frameNumber) {
- return this;
- }
-
- @Override
public SurfaceControl.Transaction reparent(SurfaceControl sc, SurfaceControl newParent) {
return this;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
index 268969d..73b9173 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
@@ -130,35 +130,35 @@
}
@Test
- public void testCanCallerRemoveListener_NullListener_ReturnFalse() {
- assertFalse(mController.assertCallerCanRemoveListener(mClientToken,
+ public void testAssertCallerCanModifyListener_NullListener_ReturnFalse() {
+ assertFalse(mController.assertCallerCanModifyListener(mClientToken,
true /* callerCanManagerAppTokens */, TEST_UID));
}
@Test
- public void testCanCallerRemoveListener_CanManageAppTokens_ReturnTrue() {
+ public void testAssertCallerCanModifyListener_CanManageAppTokens_ReturnTrue() {
mController.registerWindowContainerListener(mClientToken, mContainer, TEST_UID,
TYPE_APPLICATION_OVERLAY, null /* options */);
- assertTrue(mController.assertCallerCanRemoveListener(mClientToken,
+ assertTrue(mController.assertCallerCanModifyListener(mClientToken,
true /* callerCanManagerAppTokens */, ANOTHER_UID));
}
@Test
- public void testCanCallerRemoveListener_SameUid_ReturnTrue() {
+ public void testAssertCallerCanModifyListener_SameUid_ReturnTrue() {
mController.registerWindowContainerListener(mClientToken, mContainer, TEST_UID,
TYPE_APPLICATION_OVERLAY, null /* options */);
- assertTrue(mController.assertCallerCanRemoveListener(mClientToken,
+ assertTrue(mController.assertCallerCanModifyListener(mClientToken,
false /* callerCanManagerAppTokens */, TEST_UID));
}
@Test(expected = UnsupportedOperationException.class)
- public void testCanCallerRemoveListener_DifferentUid_ThrowException() {
+ public void testAssertCallerCanModifyListener_DifferentUid_ThrowException() {
mController.registerWindowContainerListener(mClientToken, mContainer, TEST_UID,
TYPE_APPLICATION_OVERLAY, null /* options */);
- mController.assertCallerCanRemoveListener(mClientToken,
+ mController.assertCallerCanModifyListener(mClientToken,
false /* callerCanManagerAppTokens */, ANOTHER_UID);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index baf072d..dd0c9e6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -21,7 +21,9 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
@@ -37,11 +39,15 @@
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.content.pm.PackageManager;
+import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
@@ -179,4 +185,69 @@
assertThat(windowToken.getDisplayContent()).isEqualTo(mDefaultDisplay);
}
+
+ @Test
+ public void testAttachWindowContextToWindowToken_InvalidToken_EarlyReturn() {
+ spyOn(mWm.mWindowContextListenerController);
+
+ mWm.attachWindowContextToWindowToken(new Binder(), new Binder());
+
+ verify(mWm.mWindowContextListenerController, never()).getWindowType(any());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testAttachWindowContextToWindowToken_InvalidWindowType_ThrowException() {
+ spyOn(mWm.mWindowContextListenerController);
+
+ final WindowToken windowToken = createTestWindowToken(TYPE_INPUT_METHOD, mDefaultDisplay);
+ doReturn(INVALID_WINDOW_TYPE).when(mWm.mWindowContextListenerController)
+ .getWindowType(any());
+
+ mWm.attachWindowContextToWindowToken(new Binder(), windowToken.token);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testAttachWindowContextToWindowToken_DifferentWindowType_ThrowException() {
+ spyOn(mWm.mWindowContextListenerController);
+
+ final WindowToken windowToken = createTestWindowToken(TYPE_INPUT_METHOD, mDefaultDisplay);
+ doReturn(TYPE_APPLICATION).when(mWm.mWindowContextListenerController)
+ .getWindowType(any());
+
+ mWm.attachWindowContextToWindowToken(new Binder(), windowToken.token);
+ }
+
+ @Test
+ public void testAttachWindowContextToWindowToken_CallerNotValid_EarlyReturn() {
+ spyOn(mWm.mWindowContextListenerController);
+
+ final WindowToken windowToken = createTestWindowToken(TYPE_INPUT_METHOD, mDefaultDisplay);
+ doReturn(TYPE_INPUT_METHOD).when(mWm.mWindowContextListenerController)
+ .getWindowType(any());
+ doReturn(false).when(mWm.mWindowContextListenerController)
+ .assertCallerCanModifyListener(any(), anyBoolean(), anyInt());
+
+ mWm.attachWindowContextToWindowToken(new Binder(), windowToken.token);
+
+ verify(mWm.mWindowContextListenerController, never()).registerWindowContainerListener(
+ any(), any(), anyInt(), anyInt(), any());
+ }
+
+ @Test
+ public void testAttachWindowContextToWindowToken_CallerValid_DoRegister() {
+ spyOn(mWm.mWindowContextListenerController);
+
+ final WindowToken windowToken = createTestWindowToken(TYPE_INPUT_METHOD, mDefaultDisplay);
+ doReturn(TYPE_INPUT_METHOD).when(mWm.mWindowContextListenerController)
+ .getWindowType(any());
+ doReturn(true).when(mWm.mWindowContextListenerController)
+ .assertCallerCanModifyListener(any(), anyBoolean(), anyInt());
+
+ final IBinder clientToken = new Binder();
+ mWm.attachWindowContextToWindowToken(clientToken, windowToken.token);
+
+ verify(mWm.mWindowContextListenerController).registerWindowContainerListener(
+ eq(clientToken), eq(windowToken), anyInt(), eq(TYPE_INPUT_METHOD),
+ eq(windowToken.mOptions));
+ }
}
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 4986d18..1dc1e77 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -536,14 +536,13 @@
long getUsageRemaining() {
// If there is currently an active session, account for its usage
if (mActives > 0) {
- return mTimeLimitMs - mUsageTimeMs - (getUptimeMillis() - mLastKnownUsageTimeMs);
+ return mTimeLimitMs - mUsageTimeMs - (getElapsedRealtime() - mLastKnownUsageTimeMs);
} else {
return mTimeLimitMs - mUsageTimeMs;
}
}
}
-
private class MyHandler extends Handler {
static final int MSG_CHECK_TIMEOUT = 1;
static final int MSG_INFORM_LIMIT_REACHED_LISTENER = 2;
@@ -558,7 +557,7 @@
switch (msg.what) {
case MSG_CHECK_TIMEOUT:
synchronized (mLock) {
- ((UsageGroup) msg.obj).checkTimeout(getUptimeMillis());
+ ((UsageGroup) msg.obj).checkTimeout(getElapsedRealtime());
}
break;
case MSG_INFORM_LIMIT_REACHED_LISTENER:
@@ -585,8 +584,8 @@
/** Overrideable by a test */
@VisibleForTesting
- protected long getUptimeMillis() {
- return SystemClock.uptimeMillis();
+ protected long getElapsedRealtime() {
+ return SystemClock.elapsedRealtime();
}
/** Overrideable for testing purposes */
@@ -760,7 +759,7 @@
}
user.addUsageGroup(group);
- noteActiveLocked(user, group, getUptimeMillis());
+ noteActiveLocked(user, group, getElapsedRealtime());
}
}
@@ -813,7 +812,7 @@
observerApp.sessionUsageGroups.append(observerId, group);
user.addUsageGroup(group);
- noteActiveLocked(user, group, getUptimeMillis());
+ noteActiveLocked(user, group, getElapsedRealtime());
}
}
@@ -869,7 +868,7 @@
}
user.addUsageGroup(group);
- noteActiveLocked(user, group, getUptimeMillis());
+ noteActiveLocked(user, group, getElapsedRealtime());
}
}
@@ -914,7 +913,7 @@
return;
}
}
- final long currentTime = getUptimeMillis();
+ final long currentTime = getElapsedRealtime();
user.currentlyActive.put(name, ONE);
@@ -964,7 +963,7 @@
}
user.currentlyActive.removeAt(index);
- final long currentTime = getUptimeMillis();
+ final long currentTime = getElapsedRealtime();
// Check if any of the groups need to watch for this entity
ArrayList<UsageGroup> groups = user.observedMap.get(name);
diff --git a/services/uwb/OWNERS b/services/uwb/OWNERS
new file mode 100644
index 0000000..c31a2f1
--- /dev/null
+++ b/services/uwb/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/core/java/android/uwb/OWNERS
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index 2d979ca..bcfb302 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -434,7 +434,7 @@
}
try {
AudioRecord audioRecord = new AudioRecord(
- new AudioAttributes.Builder().setHotwordMode().build(),
+ new AudioAttributes.Builder().setHotwordModeEnabled(true).build(),
audioFormat,
getBufferSizeInBytes(
audioFormat.getSampleRate(),
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 75c8031..f0771be 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4883,11 +4883,10 @@
/**
* Return the set of IMSIs that should be considered "merged together" for data usage
- * purposes. Unlike {@link #getMergedSubscriberIds()} this API merge IMSIs based on
- * subscription grouping: IMSI of those in the same group will all be returned.
- * Return the current IMSI if there is no subscription group.
- *
- * <p>Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission.
+ * purposes. This API merges IMSIs based on subscription grouping: IMSI of those in the same
+ * group will all be returned.
+ * Return the current IMSI if there is no subscription group. See
+ * {@link SubscriptionManager#createSubscriptionGroup(List)} for the definition of a group.
*
* @hide
*/
@@ -4900,7 +4899,6 @@
return telephony.getMergedImsisFromGroup(getSubId(), getOpPackageName());
}
} catch (RemoteException ex) {
- } catch (NullPointerException ex) {
}
return new String[0];
}
diff --git a/telephony/java/android/telephony/ims/DelegateRegistrationState.java b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
index fd206c1..c00c741 100644
--- a/telephony/java/android/telephony/ims/DelegateRegistrationState.java
+++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
@@ -63,7 +63,7 @@
* This feature tag is being deregistered because the PDN that the IMS registration is on is
*changing.
* All open SIP dialogs need to be closed before the PDN change can proceed using
- * {@link SipDelegateConnection#closeDialog(String)}.
+ * {@link SipDelegateConnection#cleanupSession(String)}.
*/
public static final int DEREGISTERING_REASON_PDN_CHANGE = 3;
@@ -74,7 +74,7 @@
* a user triggered hange, such as data being enabled/disabled.
* <p>
* All open SIP dialogs associated with the new deprovisioned feature tag need to be closed
- * using {@link SipDelegateConnection#closeDialog(String)} before the IMS registration
+ * using {@link SipDelegateConnection#cleanupSession(String)} before the IMS registration
* modification can proceed.
*/
public static final int DEREGISTERING_REASON_PROVISIONING_CHANGE = 4;
@@ -84,7 +84,7 @@
* needs to change its supported feature set.
* <p>
* All open SIP Dialogs associated with this feature tag must be closed
- * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed.
+ * using {@link SipDelegateConnection#cleanupSession(String)} before this operation can proceed.
*/
public static final int DEREGISTERING_REASON_FEATURE_TAGS_CHANGING = 5;
@@ -93,7 +93,7 @@
* destroyed.
* <p>
* All open SIP Dialogs associated with this feature tag must be closed
- * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed.
+ * using {@link SipDelegateConnection#cleanupSession(String)} before this operation can proceed.
*/
public static final int DEREGISTERING_REASON_DESTROY_PENDING = 6;
diff --git a/telephony/java/android/telephony/ims/RcsConfig.java b/telephony/java/android/telephony/ims/RcsConfig.java
index 8a31211..d7c3f98 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.java
+++ b/telephony/java/android/telephony/ims/RcsConfig.java
@@ -48,8 +48,12 @@
private static final String LOG_TAG = "RcsConfig";
private static final boolean DBG = Build.IS_ENG;
- // Tag for Rcs Volte single registration defined in RCC.07 A.1.6.2
- private static final String TAG_SINGLE_REGISTRATION = "rcsVolteSingleRegistration";
+ // Tag and attribute defined in RCC.07 A.2
+ private static final String TAG_PARM = "parm";
+ private static final String ATTRIBUTE_NAME = "name";
+ private static final String ATTRIBUTE_VALUE = "value";
+ // Keyword for Rcs Volte single registration defined in RCC.07 A.1.6.2
+ private static final String PARM_SINGLE_REGISTRATION = "rcsVolteSingleRegistration";
private final HashMap<String, String> mValues = new HashMap<>();
@@ -71,7 +75,27 @@
String tag = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
- tag = xpp.getName().trim();
+ tag = xpp.getName().trim().toLowerCase();
+ if (tag.equals(TAG_PARM)) {
+ int count = xpp.getAttributeCount();
+ String key = null;
+ String value = null;
+ if (count > 1) {
+ for (int i = 0; i < count; i++) {
+ String name = xpp.getAttributeName(i).trim().toLowerCase();
+ if (name.equals(ATTRIBUTE_NAME)) {
+ key = xpp.getAttributeValue(xpp.getAttributeNamespace(i),
+ name).trim().toLowerCase();
+ } else if (name.equals(ATTRIBUTE_VALUE)) {
+ value = xpp.getAttributeValue(xpp.getAttributeNamespace(i),
+ name).trim();
+ }
+ }
+ }
+ if (key != null && value != null) {
+ mValues.put(key, value);
+ }
+ }
} else if (eventType == XmlPullParser.END_TAG) {
tag = null;
} else if (eventType == XmlPullParser.TEXT) {
@@ -102,6 +126,7 @@
* @return Returns the config value if it exists, or defaultVal.
*/
public @Nullable String getString(@NonNull String tag, @Nullable String defaultVal) {
+ tag = tag.trim().toLowerCase();
return mValues.containsKey(tag) ? mValues.get(tag) : defaultVal;
}
@@ -114,6 +139,7 @@
* @return Returns the config value if it exists and is a valid int, or defaultVal.
*/
public int getInteger(@NonNull String tag, int defaultVal) {
+ tag = tag.trim().toLowerCase();
try {
return Integer.parseInt(mValues.get(tag));
} catch (NumberFormatException e) {
@@ -131,6 +157,7 @@
* @return Returns the config value if it exists, or defaultVal.
*/
public boolean getBoolean(@NonNull String tag, boolean defaultVal) {
+ tag = tag.trim().toLowerCase();
if (!mValues.containsKey(tag)) {
return defaultVal;
}
@@ -145,15 +172,15 @@
* @return Returns true if it exists, or false.
*/
public boolean hasConfig(@NonNull String tag) {
- return mValues.containsKey(tag);
+ return mValues.containsKey(tag.trim().toLowerCase());
}
/**
* Check whether Rcs Volte single registration is supported by the config.
*/
public boolean isRcsVolteSingleRegistrationSupported() {
- return getBoolean(TAG_SINGLE_REGISTRATION, false)
- || getInteger(TAG_SINGLE_REGISTRATION, 0) != 0;
+ return getBoolean(PARM_SINGLE_REGISTRATION, false)
+ || getInteger(PARM_SINGLE_REGISTRATION, 0) != 0;
}
@Override
diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java
index 04a772c..d7a19bc 100644
--- a/telephony/java/android/telephony/ims/SipDelegateConnection.java
+++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java
@@ -74,8 +74,30 @@
* closed.
* @param callId The call-ID header value associated with the ongoing SIP Dialog that is
* closing.
+ * @deprecated closeDialog does not capture INVITE forking. Use {@link #cleanupSession} instead.
*/
- void closeDialog(@NonNull String callId);
+ @Deprecated
+ default void closeDialog(@NonNull String callId) {
+ cleanupSession(callId);
+ }
+
+ /**
+ * The SIP session associated with the provided Call-ID is being closed and routing resources
+ * associated with the session are free to be released. Each SIP session may contain multiple
+ * dialogs due to SIP INVITE forking, so this method must be called after all SIP dialogs
+ * associated with the session has closed.
+ * <p>
+ * Calling this method is also mandatory for situations where the framework IMS stack is waiting
+ * for pending SIP sessions to be closed before it can perform a handover or apply a
+ * provisioning change. See {@link DelegateRegistrationState} for more information about
+ * the scenarios where this can occur.
+ * <p>
+ * This method will need to be called for each SIP session managed by this application when it
+ * is closed.
+ * @param callId The call-ID header value associated with the ongoing SIP Dialog that is
+ * closing.
+ */
+ default void cleanupSession(@NonNull String callId) { }
/**
* Notify the SIP delegate that the SIP message has been received from
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
index ad75be4..ff1a8f0 100644
--- a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
@@ -26,5 +26,5 @@
void sendMessage(in SipMessage sipMessage, long configVersion);
void notifyMessageReceived(in String viaTransactionId);
void notifyMessageReceiveError(in String viaTransactionId, int reason);
- void closeDialog(in String callId);
+ void cleanupSession(in String callId);
}
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
index 5c9ec53..6a98d80 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
@@ -79,11 +79,11 @@
}
@Override
- public void closeDialog(String callId) {
+ public void cleanupSession(String callId) {
SipDelegate d = mDelegate;
final long token = Binder.clearCallingIdentity();
try {
- mExecutor.execute(() -> d.closeDialog(callId));
+ mExecutor.execute(() -> d.cleanupSession(callId));
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
index ad02fe5..0abb495 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
@@ -200,13 +200,13 @@
}
@Override
- public void closeDialog(String callId) {
+ public void cleanupSession(String callId) {
try {
ISipDelegate conn = getSipDelegateBinder();
if (conn == null) {
return;
}
- conn.closeDialog(callId);
+ conn.cleanupSession(callId);
} catch (RemoteException e) {
// Nothing to do here, app will eventually get remote death callback.
}
diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java
index b036b5e..d5198a0 100644
--- a/telephony/java/android/telephony/ims/stub/SipDelegate.java
+++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java
@@ -76,8 +76,30 @@
*
* @param callId The call-ID header value associated with the ongoing SIP Dialog that the
* framework is requesting be closed.
+ * @deprecated This method does not take into account INVITE forking. Use
+ * {@link #cleanupSession(String)} instead.
*/
- void closeDialog(@NonNull String callId);
+ @Deprecated
+ default void closeDialog(@NonNull String callId) { }
+
+ /**
+ * The remote IMS application has closed a SIP session and the routing resources associated
+ * with the SIP session using the provided Call-ID may now be cleaned up.
+ * <p>
+ * Typically, a SIP session will be considered closed when all associated dialogs receive a
+ * BYE request. After the session has been closed, the IMS application will call
+ * {@link SipDelegateConnection#cleanupSession(String)} to signal to the framework that
+ * resources can be released. In some cases, the framework will request that the ImsService
+ * close the session due to the open SIP session holding up an event such as applying a
+ * provisioning change or handing over to another transport type. See
+ * {@link DelegateRegistrationState}.
+ *
+ * @param callId The call-ID header value associated with the ongoing SIP Session that the
+ * framework is requesting be cleaned up.
+ */
+ default void cleanupSession(@NonNull String callId) {
+ closeDialog(callId);
+ }
/**
* The remote application has received the SIP message and is processing it.
diff --git a/tests/UpdatableSystemFontTest/Android.bp b/tests/UpdatableSystemFontTest/Android.bp
index d4f1ad3..8b0ae5c 100644
--- a/tests/UpdatableSystemFontTest/Android.bp
+++ b/tests/UpdatableSystemFontTest/Android.bp
@@ -24,18 +24,27 @@
java_test_host {
name: "UpdatableSystemFontTest",
srcs: ["src/**/*.java"],
- libs: ["tradefed", "compatibility-tradefed", "compatibility-host-util"],
+ libs: [
+ "tradefed",
+ "compatibility-tradefed",
+ "compatibility-host-util",
+ ],
static_libs: [
"frameworks-base-hostutils",
],
- test_suites: ["general-tests", "vts"],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
data: [
":NotoColorEmojiTtf",
":UpdatableSystemFontTestCertDer",
":UpdatableSystemFontTestNotoColorEmojiTtfFsvSig",
- ":UpdatableSystemFontTestNotoColorEmojiV1Ttf",
- ":UpdatableSystemFontTestNotoColorEmojiV1TtfFsvSig",
- ":UpdatableSystemFontTestNotoColorEmojiV2Ttf",
- ":UpdatableSystemFontTestNotoColorEmojiV2TtfFsvSig",
+ ":UpdatableSystemFontTestNotoColorEmojiV0Ttf",
+ ":UpdatableSystemFontTestNotoColorEmojiV0TtfFsvSig",
+ ":UpdatableSystemFontTestNotoColorEmojiVPlus1Ttf",
+ ":UpdatableSystemFontTestNotoColorEmojiVPlus1TtfFsvSig",
+ ":UpdatableSystemFontTestNotoColorEmojiVPlus2Ttf",
+ ":UpdatableSystemFontTestNotoColorEmojiVPlus2TtfFsvSig",
],
}
diff --git a/tests/UpdatableSystemFontTest/AndroidTest.xml b/tests/UpdatableSystemFontTest/AndroidTest.xml
index efe5d70..d573e93 100644
--- a/tests/UpdatableSystemFontTest/AndroidTest.xml
+++ b/tests/UpdatableSystemFontTest/AndroidTest.xml
@@ -24,10 +24,12 @@
<option name="push" value="UpdatableSystemFontTestCert.der->/data/local/tmp/UpdatableSystemFontTestCert.der" />
<option name="push" value="NotoColorEmoji.ttf->/data/local/tmp/NotoColorEmoji.ttf" />
<option name="push" value="UpdatableSystemFontTestNotoColorEmoji.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmoji.ttf.fsv_sig" />
- <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV1.ttf->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV1.ttf" />
- <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV1.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV1.ttf.fsv_sig" />
- <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV2.ttf->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV2.ttf" />
- <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV2.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV2.ttf.fsv_sig" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV0.ttf->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV0.ttf" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiV0.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV0.ttf.fsv_sig" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf.fsv_sig" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf" />
+ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig" />
</target_preparer>
<test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
index 92fa498..e684556 100644
--- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
+++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
@@ -51,18 +51,26 @@
private static final Pattern PATTERN_FONT = Pattern.compile("path = ([^, \n]*)");
private static final String NOTO_COLOR_EMOJI_TTF = "NotoColorEmoji.ttf";
- private static final String TEST_NOTO_COLOR_EMOJI_V1_TTF =
- "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV1.ttf";
- private static final String TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG =
- "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV1.ttf.fsv_sig";
- private static final String TEST_NOTO_COLOR_EMOJI_V2_TTF =
- "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV2.ttf";
- private static final String TEST_NOTO_COLOR_EMOJI_V2_TTF_FSV_SIG =
- "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV2.ttf.fsv_sig";
+
private static final String ORIGINAL_NOTO_COLOR_EMOJI_TTF =
"/data/local/tmp/NotoColorEmoji.ttf";
private static final String ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG =
"/data/local/tmp/UpdatableSystemFontTestNotoColorEmoji.ttf.fsv_sig";
+ // A font with revision == 0.
+ private static final String TEST_NOTO_COLOR_EMOJI_V0_TTF =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV0.ttf";
+ private static final String TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiV0.ttf.fsv_sig";
+ // A font with revision == original + 1
+ private static final String TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf";
+ private static final String TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf.fsv_sig";
+ // A font with revision == original + 2
+ private static final String TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf";
+ private static final String TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG =
+ "/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig";
@Rule
public final AddFsVerityCertRule mAddFsverityCertRule =
@@ -81,7 +89,7 @@
@Test
public void updateFont() throws Exception {
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
assertThat(fontPath).startsWith("/data/fonts/files/");
}
@@ -89,19 +97,39 @@
@Test
public void updateFont_twice() throws Exception {
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V2_TTF, TEST_NOTO_COLOR_EMOJI_V2_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF);
assertThat(fontPath2).startsWith("/data/fonts/files/");
assertThat(fontPath2).isNotEqualTo(fontPath);
}
@Test
+ public void updateFont_allowSameVersion() throws Exception {
+ // Update original font to the same version
+ expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
+ ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG));
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
+ String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ // Update updated font to the same version
+ expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
+ String fontPath3 = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(fontPath).startsWith("/data/fonts/files/");
+ assertThat(fontPath2).isNotEqualTo(fontPath);
+ assertThat(fontPath2).startsWith("/data/fonts/files/");
+ assertThat(fontPath3).startsWith("/data/fonts/files/");
+ assertThat(fontPath3).isNotEqualTo(fontPath);
+ }
+
+ @Test
public void updatedFont_dataFileIsImmutableAndReadable() throws Exception {
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
assertThat(fontPath).startsWith("/data");
@@ -112,27 +140,27 @@
@Test
public void updateFont_invalidCert() throws Exception {
expectRemoteCommandToFail(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V2_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
}
@Test
public void updateFont_downgradeFromSystem() throws Exception {
expectRemoteCommandToFail(String.format("cmd font update %s %s",
- ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_V0_TTF, TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG));
}
@Test
public void updateFont_downgradeFromData() throws Exception {
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V2_TTF, TEST_NOTO_COLOR_EMOJI_V2_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
expectRemoteCommandToFail(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
}
@Test
public void reboot() throws Exception {
expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V1_TTF, TEST_NOTO_COLOR_EMOJI_V1_TTF_FSV_SIG));
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
assertThat(fontPath).startsWith("/data/fonts/files/");
@@ -182,17 +210,6 @@
});
}
- private void waitUntilSystemServerIsGone() {
- waitUntil(TimeUnit.SECONDS.toMillis(30), () -> {
- try {
- return getDevice().executeShellV2Command("pid system_server").getStatus()
- == CommandStatus.FAILED;
- } catch (DeviceNotAvailableException e) {
- return false;
- }
- });
- }
-
private void waitUntil(long timeoutMillis, Supplier<Boolean> func) {
long untilMillis = System.currentTimeMillis() + timeoutMillis;
do {
diff --git a/tests/UpdatableSystemFontTest/testdata/Android.bp b/tests/UpdatableSystemFontTest/testdata/Android.bp
index f744d5d..0f01be0 100644
--- a/tests/UpdatableSystemFontTest/testdata/Android.bp
+++ b/tests/UpdatableSystemFontTest/testdata/Android.bp
@@ -38,6 +38,23 @@
genrule_defaults {
name: "updatable_system_font_increment_font_revision_default",
+}
+
+genrule {
+ name: "UpdatableSystemFontTestNotoColorEmojiV0Ttf",
+ srcs: [":NotoColorEmojiTtf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiV0.ttf"],
+ tools: ["update_font_metadata"],
+ cmd: "$(location update_font_metadata) " +
+ "--input=$(in) " +
+ "--output=$(out) " +
+ "--revision=0",
+}
+
+genrule {
+ name: "UpdatableSystemFontTestNotoColorEmojiVPlus1Ttf",
+ srcs: [":NotoColorEmojiTtf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf"],
tools: ["update_font_metadata"],
cmd: "$(location update_font_metadata) " +
"--input=$(in) " +
@@ -46,23 +63,23 @@
}
genrule {
- name: "UpdatableSystemFontTestNotoColorEmojiV1Ttf",
- defaults: ["updatable_system_font_increment_font_revision_default"],
+ name: "UpdatableSystemFontTestNotoColorEmojiVPlus2Ttf",
srcs: [":NotoColorEmojiTtf"],
- out: ["UpdatableSystemFontTestNotoColorEmojiV1.ttf"],
-}
-
-genrule {
- name: "UpdatableSystemFontTestNotoColorEmojiV2Ttf",
- defaults: ["updatable_system_font_increment_font_revision_default"],
- srcs: [":UpdatableSystemFontTestNotoColorEmojiV1Ttf"],
- out: ["UpdatableSystemFontTestNotoColorEmojiV2.ttf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf"],
+ tools: ["update_font_metadata"],
+ cmd: "$(location update_font_metadata) " +
+ "--input=$(in) " +
+ "--output=$(out) " +
+ "--revision=+2",
}
genrule_defaults {
name: "updatable_system_font_sig_gen_default",
tools: ["fsverity"],
- tool_files: [":UpdatableSystemFontTestKeyPem", ":UpdatableSystemFontTestCertPem"],
+ tool_files: [
+ ":UpdatableSystemFontTestKeyPem",
+ ":UpdatableSystemFontTestCertPem",
+ ],
cmd: "$(location fsverity) sign $(in) $(out) " +
"--key=$(location :UpdatableSystemFontTestKeyPem) " +
"--cert=$(location :UpdatableSystemFontTestCertPem) " +
@@ -77,15 +94,22 @@
}
genrule {
- name: "UpdatableSystemFontTestNotoColorEmojiV1TtfFsvSig",
+ name: "UpdatableSystemFontTestNotoColorEmojiV0TtfFsvSig",
defaults: ["updatable_system_font_sig_gen_default"],
- srcs: [":UpdatableSystemFontTestNotoColorEmojiV1Ttf"],
- out: ["UpdatableSystemFontTestNotoColorEmojiV1.ttf.fsv_sig"],
+ srcs: [":UpdatableSystemFontTestNotoColorEmojiV0Ttf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiV0.ttf.fsv_sig"],
}
genrule {
- name: "UpdatableSystemFontTestNotoColorEmojiV2TtfFsvSig",
+ name: "UpdatableSystemFontTestNotoColorEmojiVPlus1TtfFsvSig",
defaults: ["updatable_system_font_sig_gen_default"],
- srcs: [":UpdatableSystemFontTestNotoColorEmojiV2Ttf"],
- out: ["UpdatableSystemFontTestNotoColorEmojiV2.ttf.fsv_sig"],
+ srcs: [":UpdatableSystemFontTestNotoColorEmojiVPlus1Ttf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiVPlus1.ttf.fsv_sig"],
+}
+
+genrule {
+ name: "UpdatableSystemFontTestNotoColorEmojiVPlus2TtfFsvSig",
+ defaults: ["updatable_system_font_sig_gen_default"],
+ srcs: [":UpdatableSystemFontTestNotoColorEmojiVPlus2Ttf"],
+ out: ["UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig"],
}
diff --git a/tests/net/common/java/android/net/NetworkAgentConfigTest.kt b/tests/net/common/java/android/net/NetworkAgentConfigTest.kt
index 1e54093..454d5b5 100644
--- a/tests/net/common/java/android/net/NetworkAgentConfigTest.kt
+++ b/tests/net/common/java/android/net/NetworkAgentConfigTest.kt
@@ -63,8 +63,10 @@
setPartialConnectivityAcceptable(false)
setUnvalidatedConnectivityAcceptable(true)
setLegacyTypeName("TEST_NETWORK")
- disableNat64Detection()
- disableProvisioningNotification()
+ if (isAtLeastS()) {
+ setNat64DetectionEnabled(false)
+ setProvisioningNotificationEnabled(false)
+ }
}.build()
assertTrue(config.isExplicitlySelected())
@@ -73,7 +75,12 @@
assertFalse(config.isPartialConnectivityAcceptable())
assertTrue(config.isUnvalidatedConnectivityAcceptable())
assertEquals("TEST_NETWORK", config.getLegacyTypeName())
- assertFalse(config.isNat64DetectionEnabled())
- assertFalse(config.isProvisioningNotificationEnabled())
+ if (isAtLeastS()) {
+ assertFalse(config.isNat64DetectionEnabled())
+ assertFalse(config.isProvisioningNotificationEnabled())
+ } else {
+ assertTrue(config.isNat64DetectionEnabled())
+ assertTrue(config.isProvisioningNotificationEnabled())
+ }
}
}
diff --git a/tests/net/java/android/net/IpSecAlgorithmTest.java b/tests/net/java/android/net/IpSecAlgorithmTest.java
index 3a8d600..5bd2214 100644
--- a/tests/net/java/android/net/IpSecAlgorithmTest.java
+++ b/tests/net/java/android/net/IpSecAlgorithmTest.java
@@ -121,7 +121,7 @@
@Test
public void testValidationForAlgosAddedInS() throws Exception {
- if (Build.VERSION.FIRST_SDK_INT <= Build.VERSION_CODES.R) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.R) {
return;
}
@@ -194,13 +194,13 @@
private static Set<String> getMandatoryAlgos() {
return CollectionUtils.filter(
ALGO_TO_REQUIRED_FIRST_SDK.keySet(),
- i -> Build.VERSION.FIRST_SDK_INT >= ALGO_TO_REQUIRED_FIRST_SDK.get(i));
+ i -> Build.VERSION.DEVICE_INITIAL_SDK_INT >= ALGO_TO_REQUIRED_FIRST_SDK.get(i));
}
private static Set<String> getOptionalAlgos() {
return CollectionUtils.filter(
ALGO_TO_REQUIRED_FIRST_SDK.keySet(),
- i -> Build.VERSION.FIRST_SDK_INT < ALGO_TO_REQUIRED_FIRST_SDK.get(i));
+ i -> Build.VERSION.DEVICE_INITIAL_SDK_INT < ALGO_TO_REQUIRED_FIRST_SDK.get(i));
}
@Test
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 93a2bb0..47e4b5e 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -18,6 +18,7 @@
import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
+import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.NETWORK_FACTORY;
import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
@@ -356,6 +357,8 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import kotlin.reflect.KClass;
@@ -4552,9 +4555,8 @@
expectNoRequestChanged(testFactory);
testFactory.assertRequestCountEquals(0);
assertFalse(testFactory.getMyStartRequested());
- // ... and cell data to be torn down after nascent network timeout.
- cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent,
- mService.mNascentDelayMs + TEST_CALLBACK_TIMEOUT_MS);
+ // ... and cell data to be torn down immediately since it is no longer nascent.
+ cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
waitForIdle();
assertLength(1, mCm.getAllNetworks());
} finally {
@@ -10049,6 +10051,7 @@
@Test
public void testDumpDoesNotCrash() {
+ mServiceContext.setPermission(DUMP, PERMISSION_GRANTED);
// Filing a couple requests prior to testing the dump.
final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback();
final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback();
@@ -11774,6 +11777,11 @@
internetFactory.expectRequestRemove();
internetFactory.assertRequestCountEquals(0);
+ // Create a request that holds the upcoming wifi network.
+ final TestNetworkCallback wifiCallback = new TestNetworkCallback();
+ mCm.requestNetwork(new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build(),
+ wifiCallback);
+
// Now WiFi connects and it's unmetered, but it's weaker than cell.
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
@@ -11782,7 +11790,7 @@
mWiFiNetworkAgent.connect(true);
// The OEM_PAID preference prefers an unmetered network to an OEM_PAID network, so
- // the oemPaidFactory can't beat this no matter how high its score.
+ // the oemPaidFactory can't beat wifi no matter how high its score.
oemPaidFactory.expectRequestRemove();
expectNoRequestChanged(internetFactory);
@@ -11793,6 +11801,7 @@
// unmetered network, so the oemPaidNetworkFactory still can't beat this.
expectNoRequestChanged(oemPaidFactory);
internetFactory.expectRequestAdd();
+ mCm.unregisterNetworkCallback(wifiCallback);
}
/**
@@ -11992,6 +12001,33 @@
}
@Test
+ public void testSetOemNetworkPreferenceLogsRequest() throws Exception {
+ mServiceContext.setPermission(DUMP, PERMISSION_GRANTED);
+ @OemNetworkPreferences.OemNetworkPreference final int networkPref =
+ OEM_NETWORK_PREFERENCE_OEM_PAID;
+ final StringWriter stringWriter = new StringWriter();
+ final String logIdentifier = "UPDATE INITIATED: OemNetworkPreferences";
+ final Pattern pattern = Pattern.compile(logIdentifier);
+
+ final int expectedNumLogs = 2;
+ final UidRangeParcel[] uidRanges =
+ toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID));
+
+ // Call twice to generate two logs.
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME);
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME);
+ mService.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
+
+ final String dumpOutput = stringWriter.toString();
+ final Matcher matcher = pattern.matcher(dumpOutput);
+ int count = 0;
+ while (matcher.find()) {
+ count++;
+ }
+ assertEquals(expectedNumLogs, count);
+ }
+
+ @Test
public void testGetAllNetworkStateSnapshot() throws Exception {
verifyNoNetwork();
diff --git a/tests/net/java/com/android/server/connectivity/FullScoreTest.kt b/tests/net/java/com/android/server/connectivity/FullScoreTest.kt
index f0d7d86..45b575a 100644
--- a/tests/net/java/com/android/server/connectivity/FullScoreTest.kt
+++ b/tests/net/java/com/android/server/connectivity/FullScoreTest.kt
@@ -56,7 +56,7 @@
if (vpn) addTransportType(NetworkCapabilities.TRANSPORT_VPN)
if (validated) addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
}.build()
- return mixInScore(nc, nac, false /* avoidBadWifi */)
+ return mixInScore(nc, nac, validated, false /* yieldToBadWifi */)
}
@Test
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
index fec5ef3..d7535a9 100644
--- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -197,7 +197,7 @@
} else {
pkgInfo = packageInfoWithPermissions(REQUESTED_PERMISSION_GRANTED, new String[] {}, "");
}
- pkgInfo.applicationInfo.uid = UserHandle.getUid(user, UserHandle.getAppId(uid));
+ pkgInfo.applicationInfo.uid = user.getUid(UserHandle.getAppId(uid));
return pkgInfo;
}
@@ -390,7 +390,7 @@
public void expectPermission(Boolean permission, UserHandle[] users, int[] apps) {
for (final UserHandle user : users) {
for (final int app : apps) {
- final int uid = UserHandle.getUid(user, app);
+ final int uid = user.getUid(app);
if (!mApps.containsKey(uid)) {
fail("uid " + uid + " does not exist.");
}
@@ -404,7 +404,7 @@
public void expectNoPermission(UserHandle[] users, int[] apps) {
for (final UserHandle user : users) {
for (final int app : apps) {
- final int uid = UserHandle.getUid(user, app);
+ final int uid = user.getUid(app);
if (mApps.containsKey(uid)) {
fail("uid " + uid + " has listed permissions, expected none.");
}
@@ -502,9 +502,9 @@
// When MOCK_UID1 package is uninstalled and reinstalled, expect Netd to be updated
mPermissionMonitor.onPackageRemoved(
- MOCK_PACKAGE1, UserHandle.getUid(MOCK_USER1, MOCK_UID1));
+ MOCK_PACKAGE1, MOCK_USER1.getUid(MOCK_UID1));
verify(mNetdService).firewallRemoveUidInterfaceRules(aryEq(new int[] {MOCK_UID1}));
- mPermissionMonitor.onPackageAdded(MOCK_PACKAGE1, UserHandle.getUid(MOCK_USER1, MOCK_UID1));
+ mPermissionMonitor.onPackageAdded(MOCK_PACKAGE1, MOCK_USER1.getUid(MOCK_UID1));
verify(mNetdService).firewallAddUidInterfaceRules(eq("tun0"),
aryEq(new int[] {MOCK_UID1}));
@@ -541,13 +541,13 @@
mPermissionMonitor.onVpnUidRangesAdded("tun0", vpnRange, VPN_UID);
// Newly-installed package should have uid rules added
- mPermissionMonitor.onPackageAdded(MOCK_PACKAGE1, UserHandle.getUid(MOCK_USER1, MOCK_UID1));
+ mPermissionMonitor.onPackageAdded(MOCK_PACKAGE1, MOCK_USER1.getUid(MOCK_UID1));
verify(mNetdService).firewallAddUidInterfaceRules(eq("tun0"),
aryEq(new int[] {MOCK_UID1}));
// Removed package should have its uid rules removed
mPermissionMonitor.onPackageRemoved(
- MOCK_PACKAGE1, UserHandle.getUid(MOCK_USER1, MOCK_UID1));
+ MOCK_PACKAGE1, MOCK_USER1.getUid(MOCK_UID1));
verify(mNetdService).firewallRemoveUidInterfaceRules(aryEq(new int[] {MOCK_UID1}));
}
@@ -557,13 +557,13 @@
// called multiple times with the uid corresponding to each user.
private void addPackageForUsers(UserHandle[] users, String packageName, int uid) {
for (final UserHandle user : users) {
- mPermissionMonitor.onPackageAdded(packageName, UserHandle.getUid(user, uid));
+ mPermissionMonitor.onPackageAdded(packageName, user.getUid(uid));
}
}
private void removePackageForUsers(UserHandle[] users, String packageName, int uid) {
for (final UserHandle user : users) {
- mPermissionMonitor.onPackageRemoved(packageName, UserHandle.getUid(user, uid));
+ mPermissionMonitor.onPackageRemoved(packageName, user.getUid(uid));
}
}
diff --git a/tests/permission/src/com/android/framework/permission/tests/VibratorManagerServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/VibratorManagerServicePermissionTest.java
index fe68543..e0f3f03 100644
--- a/tests/permission/src/com/android/framework/permission/tests/VibratorManagerServicePermissionTest.java
+++ b/tests/permission/src/com/android/framework/permission/tests/VibratorManagerServicePermissionTest.java
@@ -23,7 +23,7 @@
import android.Manifest;
import android.content.Context;
import android.os.Binder;
-import android.os.CombinedVibrationEffect;
+import android.os.CombinedVibration;
import android.os.IVibratorManagerService;
import android.os.IVibratorStateListener;
import android.os.Process;
@@ -50,8 +50,8 @@
public class VibratorManagerServicePermissionTest {
private static final String PACKAGE_NAME = "com.android.framework.permission.tests";
- private static final CombinedVibrationEffect EFFECT =
- CombinedVibrationEffect.createSynced(
+ private static final CombinedVibration EFFECT =
+ CombinedVibration.createParallel(
VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
private static final VibrationAttributes ATTRS = new VibrationAttributes.Builder()
.setUsage(VibrationAttributes.USAGE_ALARM)
@@ -140,7 +140,7 @@
@Test
public void testCancelVibrateFails() throws RemoteException {
expectSecurityException("VIBRATE");
- mVibratorService.cancelVibrate(new Binder());
+ mVibratorService.cancelVibrate(/* usageFilter= */ -1, new Binder());
}
private void expectSecurityException(String expectedPermission) {
diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
index 43e6676..9a66343 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -39,6 +39,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.argThat;
import static org.mockito.Mockito.doAnswer;
@@ -59,7 +60,6 @@
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
-import android.net.NetworkCapabilities.Transport;
import android.net.NetworkRequest;
import android.net.TelephonyNetworkSpecifier;
import android.net.vcn.IVcnStatusCallback;
@@ -81,7 +81,6 @@
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.net.module.util.LocationPermissionChecker;
import com.android.server.VcnManagementService.VcnCallback;
import com.android.server.VcnManagementService.VcnStatusCallbackInfo;
import com.android.server.vcn.TelephonySubscriptionTracker;
@@ -162,8 +161,6 @@
mock(PersistableBundleUtils.LockingReadWriteHelper.class);
private final TelephonySubscriptionTracker mSubscriptionTracker =
mock(TelephonySubscriptionTracker.class);
- private final LocationPermissionChecker mLocationPermissionChecker =
- mock(LocationPermissionChecker.class);
private final ArgumentCaptor<VcnCallback> mVcnCallbackCaptor =
ArgumentCaptor.forClass(VcnCallback.class);
@@ -207,9 +204,6 @@
doReturn(mConfigReadWriteHelper)
.when(mMockDeps)
.newPersistableBundleLockingReadWriteHelper(any());
- doReturn(mLocationPermissionChecker)
- .when(mMockDeps)
- .newLocationPermissionChecker(eq(mMockContext));
// Setup VCN instance generation
doAnswer((invocation) -> {
@@ -521,10 +515,6 @@
@Test
public void testSetVcnConfigNotifiesStatusCallback() throws Exception {
- mVcnMgmtSvc.systemReady();
- doReturn(true)
- .when(mLocationPermissionChecker)
- .checkLocationPermission(eq(TEST_PACKAGE_NAME), any(), eq(TEST_UID), any());
triggerSubscriptionTrackerCbAndGetSnapshot(Collections.singleton(TEST_UUID_2));
mVcnMgmtSvc.registerVcnStatusCallback(TEST_UUID_2, mMockStatusCallback, TEST_PACKAGE_NAME);
@@ -667,7 +657,7 @@
private void verifyMergedNetworkCapabilities(
NetworkCapabilities mergedCapabilities,
- @Transport int transportType,
+ int transportType,
boolean isVcnManaged,
boolean isRestricted) {
assertTrue(mergedCapabilities.hasTransport(transportType));
@@ -697,10 +687,6 @@
doReturn(isVcnActive ? VCN_STATUS_CODE_ACTIVE : VCN_STATUS_CODE_SAFE_MODE)
.when(vcn)
.getStatus();
-
- doReturn(true)
- .when(mLocationPermissionChecker)
- .checkLocationPermission(eq(TEST_PACKAGE_NAME), any(), eq(TEST_UID), any());
}
private NetworkCapabilities.Builder getNetworkCapabilitiesBuilderForTransport(
@@ -793,7 +779,7 @@
.registerNetworkCallback(
eq(new NetworkRequest.Builder().clearCapabilities().build()),
captor.capture());
- captor.getValue().onCapabilitiesChanged(new Network(0), caps);
+ captor.getValue().onCapabilitiesChanged(mock(Network.class, CALLS_REAL_METHODS), caps);
}
@Test
@@ -933,8 +919,7 @@
@NonNull ParcelUuid subGroup,
@NonNull String pkgName,
int uid,
- boolean hasPermissionsforSubGroup,
- boolean hasLocationPermission)
+ boolean hasPermissionsforSubGroup)
throws Exception {
TelephonySubscriptionSnapshot snapshot =
triggerSubscriptionTrackerCbAndGetSnapshot(Collections.singleton(subGroup));
@@ -946,10 +931,6 @@
.when(snapshot)
.packageHasPermissionsForSubscriptionGroup(eq(subGroup), eq(pkgName));
- doReturn(hasLocationPermission)
- .when(mLocationPermissionChecker)
- .checkLocationPermission(eq(pkgName), any(), eq(uid), any());
-
mVcnMgmtSvc.registerVcnStatusCallback(subGroup, mMockStatusCallback, pkgName);
triggerVcnSafeMode(subGroup, snapshot, true /* enterSafeMode */);
@@ -959,11 +940,7 @@
public void testVcnStatusCallbackOnSafeModeStatusChangedWithCarrierPrivileges()
throws Exception {
triggerVcnStatusCallbackOnSafeModeStatusChanged(
- TEST_UUID_1,
- TEST_PACKAGE_NAME,
- TEST_UID,
- true /* hasPermissionsforSubGroup */,
- true /* hasLocationPermission */);
+ TEST_UUID_1, TEST_PACKAGE_NAME, TEST_UID, true /* hasPermissionsforSubGroup */);
verify(mMockStatusCallback).onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
}
@@ -972,25 +949,7 @@
public void testVcnStatusCallbackOnSafeModeStatusChangedWithoutCarrierPrivileges()
throws Exception {
triggerVcnStatusCallbackOnSafeModeStatusChanged(
- TEST_UUID_1,
- TEST_PACKAGE_NAME,
- TEST_UID,
- false /* hasPermissionsforSubGroup */,
- true /* hasLocationPermission */);
-
- verify(mMockStatusCallback, never())
- .onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
- }
-
- @Test
- public void testVcnStatusCallbackOnSafeModeStatusChangedWithoutLocationPermission()
- throws Exception {
- triggerVcnStatusCallbackOnSafeModeStatusChanged(
- TEST_UUID_1,
- TEST_PACKAGE_NAME,
- TEST_UID,
- true /* hasPermissionsforSubGroup */,
- false /* hasLocationPermission */);
+ TEST_UUID_1, TEST_PACKAGE_NAME, TEST_UID, false /* hasPermissionsforSubGroup */);
verify(mMockStatusCallback, never())
.onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
@@ -1052,9 +1011,6 @@
.when(snapshot)
.packageHasPermissionsForSubscriptionGroup(
eq(TEST_UUID_1), eq(TEST_CB_PACKAGE_NAME));
- doReturn(true)
- .when(mLocationPermissionChecker)
- .checkLocationPermission(eq(TEST_CB_PACKAGE_NAME), any(), eq(TEST_UID), any());
mVcnMgmtSvc.registerVcnStatusCallback(
TEST_UUID_1, mMockStatusCallback, TEST_CB_PACKAGE_NAME);
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
index bb67593..a2223e8 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
@@ -20,6 +20,8 @@
import static android.net.IpSecManager.DIRECTION_OUT;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED;
+import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_TEMPORARY_FAILURE;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_CONFIG_ERROR;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_INTERNAL_ERROR;
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_NETWORK_ERROR;
@@ -41,6 +43,7 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import android.net.ConnectivityManager;
import android.net.LinkAddress;
@@ -48,10 +51,9 @@
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.ipsec.ike.ChildSaProposal;
-import android.net.ipsec.ike.exceptions.AuthenticationFailedException;
import android.net.ipsec.ike.exceptions.IkeException;
import android.net.ipsec.ike.exceptions.IkeInternalException;
-import android.net.ipsec.ike.exceptions.TemporaryFailureException;
+import android.net.ipsec.ike.exceptions.IkeProtocolException;
import android.net.vcn.VcnControlPlaneIkeConfig;
import android.net.vcn.VcnManager.VcnErrorCode;
@@ -470,10 +472,17 @@
any());
}
+ private static IkeProtocolException buildMockIkeProtocolException(int errorCode) {
+ final IkeProtocolException exception = mock(IkeProtocolException.class);
+ when(exception.getErrorType()).thenReturn(errorCode);
+ return exception;
+ }
+
@Test
public void testIkeSessionClosedExceptionallyAuthenticationFailure() throws Exception {
verifyIkeSessionClosedExceptionalltyNotifiesStatusCallback(
- new AuthenticationFailedException("vcn test"), VCN_ERROR_CODE_CONFIG_ERROR);
+ buildMockIkeProtocolException(ERROR_TYPE_AUTHENTICATION_FAILED),
+ VCN_ERROR_CODE_CONFIG_ERROR);
}
@Test
@@ -485,7 +494,8 @@
@Test
public void testIkeSessionClosedExceptionallyInternalFailure() throws Exception {
verifyIkeSessionClosedExceptionalltyNotifiesStatusCallback(
- new TemporaryFailureException("vcn test"), VCN_ERROR_CODE_INTERNAL_ERROR);
+ buildMockIkeProtocolException(ERROR_TYPE_TEMPORARY_FAILURE),
+ VCN_ERROR_CODE_INTERNAL_ERROR);
}
@Test
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
index d08af9d..ced8745 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
@@ -25,7 +25,10 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -83,31 +86,30 @@
super.setUp();
mWifiInfo = mock(WifiInfo.class);
+ doReturn(mWifiInfo).when(mWifiInfo).makeCopy(anyLong());
}
private void verifyBuildNetworkCapabilitiesCommon(int transportType) {
- final NetworkCapabilities underlyingCaps = new NetworkCapabilities();
- underlyingCaps.addTransportType(transportType);
- underlyingCaps.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
- underlyingCaps.addCapability(NET_CAPABILITY_NOT_METERED);
- underlyingCaps.addCapability(NET_CAPABILITY_NOT_ROAMING);
+ final NetworkCapabilities.Builder capBuilder = new NetworkCapabilities.Builder();
+ capBuilder.addTransportType(transportType);
+ capBuilder.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
+ capBuilder.addCapability(NET_CAPABILITY_NOT_METERED);
+ capBuilder.addCapability(NET_CAPABILITY_NOT_ROAMING);
if (transportType == TRANSPORT_WIFI) {
- underlyingCaps.setTransportInfo(mWifiInfo);
- underlyingCaps.setOwnerUid(TEST_UID);
+ capBuilder.setTransportInfo(mWifiInfo);
+ capBuilder.setOwnerUid(TEST_UID);
} else if (transportType == TRANSPORT_CELLULAR) {
- underlyingCaps.setAdministratorUids(new int[] {TEST_UID});
- underlyingCaps.setNetworkSpecifier(
+ capBuilder.setNetworkSpecifier(
new TelephonyNetworkSpecifier(TEST_SUBSCRIPTION_ID_1));
}
-
- UnderlyingNetworkRecord record =
- new UnderlyingNetworkRecord(
- new Network(0), underlyingCaps, new LinkProperties(), false);
+ capBuilder.setAdministratorUids(new int[] {TEST_UID});
+ UnderlyingNetworkRecord record = new UnderlyingNetworkRecord(
+ mock(Network.class, CALLS_REAL_METHODS),
+ capBuilder.build(), new LinkProperties(), false);
final NetworkCapabilities vcnCaps =
VcnGatewayConnection.buildNetworkCapabilities(
VcnGatewayConnectionConfigTest.buildTestConfig(), record);
-
assertTrue(vcnCaps.hasTransport(TRANSPORT_CELLULAR));
assertTrue(vcnCaps.hasCapability(NET_CAPABILITY_NOT_METERED));
assertTrue(vcnCaps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
index dc73be2..98d553d 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
@@ -26,6 +26,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -93,7 +94,7 @@
protected static final UnderlyingNetworkRecord TEST_UNDERLYING_NETWORK_RECORD_1 =
new UnderlyingNetworkRecord(
- new Network(0),
+ mock(Network.class, CALLS_REAL_METHODS),
new NetworkCapabilities(),
new LinkProperties(),
false /* blocked */);
@@ -104,7 +105,7 @@
protected static final UnderlyingNetworkRecord TEST_UNDERLYING_NETWORK_RECORD_2 =
new UnderlyingNetworkRecord(
- new Network(1),
+ mock(Network.class, CALLS_REAL_METHODS),
new NetworkCapabilities(),
new LinkProperties(),
false /* blocked */);
diff --git a/tests/vcn/java/com/android/server/vcn/VcnNetworkProviderTest.java b/tests/vcn/java/com/android/server/vcn/VcnNetworkProviderTest.java
index c2c6200..f943f34 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnNetworkProviderTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnNetworkProviderTest.java
@@ -22,8 +22,6 @@
import android.annotation.NonNull;
import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.test.TestLooper;
@@ -36,9 +34,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.ArrayList;
-import java.util.List;
-
/** Tests for TelephonySubscriptionTracker */
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -46,8 +41,6 @@
private static final int TEST_SCORE_UNSATISFIED = 0;
private static final int TEST_SCORE_HIGH = 100;
private static final int TEST_PROVIDER_ID = 1;
- private static final int TEST_LEGACY_TYPE = ConnectivityManager.TYPE_MOBILE;
- private static final NetworkRequest.Type TEST_REQUEST_TYPE = NetworkRequest.Type.REQUEST;
@NonNull private final Context mContext;
@NonNull private final TestLooper mTestLooper;
@@ -94,28 +87,4 @@
mVcnNetworkProvider.onNetworkRequested(request, TEST_SCORE_UNSATISFIED, TEST_PROVIDER_ID);
verifyNoMoreInteractions(mListener);
}
-
- @Test
- public void testCachedRequestsPassedOnRegister() throws Exception {
- final List<NetworkRequest> requests = new ArrayList<>();
-
- for (int i = 0; i < 10; i++) {
- final NetworkRequest request =
- new NetworkRequest(
- new NetworkCapabilities(),
- TEST_LEGACY_TYPE,
- i /* requestId */,
- TEST_REQUEST_TYPE);
-
- requests.add(request);
- mVcnNetworkProvider.onNetworkRequested(request, i, i + 1);
- }
-
- mVcnNetworkProvider.registerListener(mListener);
- for (int i = 0; i < requests.size(); i++) {
- final NetworkRequest request = requests.get(i);
- verify(mListener).onNetworkRequested(request, i, i + 1);
- }
- verifyNoMoreInteractions(mListener);
- }
}
diff --git a/tools/fonts/Android.bp b/tools/fonts/Android.bp
new file mode 100644
index 0000000..8ea114f
--- /dev/null
+++ b/tools/fonts/Android.bp
@@ -0,0 +1,51 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+python_defaults {
+ name: "fonts_python_defaults",
+ version: {
+ py2: {
+ enabled: false,
+ embedded_launcher: false,
+ },
+ py3: {
+ enabled: true,
+ embedded_launcher: true,
+ },
+ },
+}
+
+python_binary_host {
+ name: "fontchain_linter",
+ defaults: ["fonts_python_defaults"],
+ main: "fontchain_linter.py",
+ srcs: [
+ "fontchain_linter.py",
+ ],
+ libs: [
+ "fontTools",
+ ],
+}
+
+python_binary_host {
+ name: "update_font_metadata",
+ defaults: ["fonts_python_defaults"],
+ main: "update_font_metadata.py",
+ srcs: [
+ "update_font_metadata.py",
+ ],
+ libs: [
+ "fontTools",
+ ],
+}
diff --git a/wifi/OWNERS b/wifi/OWNERS
index c1c70e2..2caf9ed 100644
--- a/wifi/OWNERS
+++ b/wifi/OWNERS
@@ -2,5 +2,4 @@
dysu@google.com
etancohen@google.com
-rpius@google.com
satk@google.com