Merge "Add detailed error logging to NICViewBinder" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index f234166..ab0d5a3 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -34,7 +34,7 @@
":com.android.window.flags.window-aconfig-java{.generated_srcjars}",
":android.hardware.biometrics.flags-aconfig-java{.generated_srcjars}",
":com.android.hardware.input-aconfig-java{.generated_srcjars}",
- ":aconfig_input_flags-java{.generated_srcjars}",
+ ":com.android.input.flags-aconfig-java{.generated_srcjars}",
":com.android.text.flags-aconfig-java{.generated_srcjars}",
":telecom_flags_core_java_lib{.generated_srcjars}",
":telephony_flags_core_java_lib{.generated_srcjars}",
@@ -58,7 +58,9 @@
":android.service.autofill.flags-aconfig-java{.generated_srcjars}",
":com.android.net.flags-aconfig-java{.generated_srcjars}",
":device_policy_aconfig_flags_lib{.generated_srcjars}",
+ ":service-jobscheduler-deviceidle.flags-aconfig-java{.generated_srcjars}",
":surfaceflinger_flags_java_lib{.generated_srcjars}",
+ ":android.view.contentcapture.flags-aconfig-java{.generated_srcjars}",
]
filegroup {
@@ -131,8 +133,8 @@
}
java_aconfig_library {
- name: "aconfig_input_flags-java",
- aconfig_declarations: "aconfig_input_flags",
+ name: "com.android.input.flags-aconfig-java",
+ aconfig_declarations: "com.android.input.flags-aconfig",
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
@@ -666,3 +668,16 @@
aconfig_declarations: "surfaceflinger_flags",
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+
+// Content Capture
+aconfig_declarations {
+ name: "android.view.contentcapture.flags-aconfig",
+ package: "android.view.contentcapture.flags",
+ srcs: ["core/java/android/view/contentcapture/flags/*.aconfig"],
+}
+
+java_aconfig_library {
+ name: "android.view.contentcapture.flags-aconfig-java",
+ aconfig_declarations: "android.view.contentcapture.flags-aconfig",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
diff --git a/Ravenwood.bp b/Ravenwood.bp
index da02298..1582266 100644
--- a/Ravenwood.bp
+++ b/Ravenwood.bp
@@ -13,7 +13,7 @@
// limitations under the License.
// We need this "trampoline" rule to force soong to give a host-side jar to
-// framework-minus-apex.ravenwood. Otherwise, soong would mix up the arch (?) and we'd get
+// framework-minus-apex.ravenwood-base. Otherwise, soong would mix up the arch (?) and we'd get
// a dex jar.
java_library {
name: "framework-minus-apex-for-hoststubgen",
@@ -26,7 +26,7 @@
}
// Generate the stub/impl from framework-all, with hidden APIs.
-java_genrule_host {
+java_genrule {
name: "framework-minus-apex.ravenwood-base",
tools: ["hoststubgen"],
cmd: "$(location hoststubgen) " +
@@ -57,7 +57,9 @@
}
// Extract the impl jar from "framework-minus-apex.ravenwood-base" for subsequent build rules.
-java_genrule_host {
+// Note this emits a "device side" output, so that ravenwood tests can (implicitly)
+// depend on it.
+java_genrule {
name: "framework-minus-apex.ravenwood",
defaults: ["hoststubgen-for-prototype-only-genrule"],
cmd: "cp $(in) $(out)",
@@ -68,3 +70,17 @@
"framework-minus-apex.ravenwood.jar",
],
}
+
+android_ravenwood_libgroup {
+ name: "ravenwood-runtime",
+ libs: [
+ "framework-minus-apex.ravenwood",
+ "hoststubgen-helper-runtime.ravenwood",
+ "hoststubgen-helper-framework-runtime.ravenwood",
+ ],
+}
+
+android_ravenwood_libgroup {
+ name: "ravenwood-utils",
+ libs: [],
+}
diff --git a/apex/jobscheduler/service/aconfig/Android.bp b/apex/jobscheduler/service/aconfig/Android.bp
index 24ecd3d..7d8a363 100644
--- a/apex/jobscheduler/service/aconfig/Android.bp
+++ b/apex/jobscheduler/service/aconfig/Android.bp
@@ -1,3 +1,19 @@
+// Device Idle
+aconfig_declarations {
+ name: "service-deviceidle.flags-aconfig",
+ package: "com.android.server.deviceidle",
+ srcs: [
+ "device_idle.aconfig",
+ ],
+}
+
+java_aconfig_library {
+ name: "service-jobscheduler-deviceidle.flags-aconfig-java",
+ aconfig_declarations: "service-deviceidle.flags-aconfig",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+ visibility: ["//frameworks/base:__subpackages__"],
+}
+
// JobScheduler
aconfig_declarations {
name: "service-job.flags-aconfig",
@@ -15,6 +31,7 @@
}
service_jobscheduler_aconfig_srcjars = [
+ ":service-jobscheduler-deviceidle.flags-aconfig-java{.generated_srcjars}",
":service-jobscheduler-job.flags-aconfig-java{.generated_srcjars}",
]
diff --git a/apex/jobscheduler/service/aconfig/device_idle.aconfig b/apex/jobscheduler/service/aconfig/device_idle.aconfig
new file mode 100644
index 0000000..fc24b30
--- /dev/null
+++ b/apex/jobscheduler/service/aconfig/device_idle.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.server.deviceidle"
+
+flag {
+ name: "disable_wakelocks_in_light_idle"
+ namespace: "backstage_power"
+ description: "Disable wakelocks for background apps while Light Device Idle is active"
+ bug: "299329948"
+}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
index 7dd3d13..c142482 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
@@ -82,6 +82,10 @@
* be a negative value if the device is not in state to be considered idle.
*/
private long mIdlenessCheckScheduledElapsed = -1;
+ /**
+ * Time (in the elapsed realtime timebase) when the device can be considered idle.
+ */
+ private long mIdleStartElapsed = Long.MAX_VALUE;
private IdlenessListener mIdleListener;
private final UiModeManager.OnProjectionStateChangedListener mOnProjectionStateChangedListener =
@@ -191,11 +195,7 @@
}
mProjectionActive = projectionActive;
if (mProjectionActive) {
- cancelIdlenessCheck();
- if (mIdle) {
- mIdle = false;
- mIdleListener.reportNewIdleState(mIdle);
- }
+ exitIdle();
} else {
maybeScheduleIdlenessCheck("Projection ended");
}
@@ -209,6 +209,7 @@
pw.print(" mDockIdle: "); pw.println(mDockIdle);
pw.print(" mProjectionActive: "); pw.println(mProjectionActive);
pw.print(" mIdlenessCheckScheduledElapsed: "); pw.println(mIdlenessCheckScheduledElapsed);
+ pw.print(" mIdleStartElapsed: "); pw.println(mIdleStartElapsed);
}
@Override
@@ -270,11 +271,7 @@
if (DEBUG) {
Slog.v(TAG, "exiting idle");
}
- cancelIdlenessCheck();
- if (mIdle) {
- mIdle = false;
- mIdleListener.reportNewIdleState(mIdle);
- }
+ exitIdle();
break;
case Intent.ACTION_SCREEN_OFF:
case Intent.ACTION_DREAMING_STARTED:
@@ -302,6 +299,12 @@
}
private void maybeScheduleIdlenessCheck(String reason) {
+ if (mIdle) {
+ if (DEBUG) {
+ Slog.w(TAG, "Already idle. Redundant reason=" + reason);
+ }
+ return;
+ }
if ((!mScreenOn || mDockIdle) && !mProjectionActive) {
final long nowElapsed = sElapsedRealtimeClock.millis();
final long inactivityThresholdMs = mIsStablePower
@@ -319,19 +322,32 @@
mIdlenessCheckScheduledElapsed = nowElapsed;
}
final long when = mIdlenessCheckScheduledElapsed + inactivityThresholdMs;
+ if (when == mIdleStartElapsed) {
+ if (DEBUG) {
+ Slog.i(TAG, "No change to idle start time");
+ }
+ return;
+ }
+ mIdleStartElapsed = when;
if (DEBUG) {
Slog.v(TAG, "Scheduling idle : " + reason + " now:" + nowElapsed
- + " checkElapsed=" + mIdlenessCheckScheduledElapsed + " when=" + when);
+ + " checkElapsed=" + mIdlenessCheckScheduledElapsed
+ + " when=" + mIdleStartElapsed);
}
mAlarm.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- when, mIdleWindowSlop, "JS idleness",
+ mIdleStartElapsed, mIdleWindowSlop, "JS idleness",
AppSchedulingModuleThread.getExecutor(), mIdleAlarmListener);
}
}
- private void cancelIdlenessCheck() {
+ private void exitIdle() {
mAlarm.cancel(mIdleAlarmListener);
mIdlenessCheckScheduledElapsed = -1;
+ mIdleStartElapsed = Long.MAX_VALUE;
+ if (mIdle) {
+ mIdle = false;
+ mIdleListener.reportNewIdleState(false);
+ }
}
private void handleIdleTrigger() {
diff --git a/api/Android.bp b/api/Android.bp
index de4435e..4d56b37 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -334,6 +334,16 @@
visibility: ["//frameworks/base/api"],
}
+// We resolve dependencies on APIs in modules by depending on a prebuilt of the whole
+// platform (sdk_system_current_android). That prebuilt does not include module-lib APIs,
+// so use the prebuilt module-lib stubs for modules that export module-lib stubs that the
+// non-updatable part depends on.
+non_updatable_api_deps_on_modules = [
+ "sdk_module-lib_current_framework-tethering",
+ "sdk_module-lib_current_framework-connectivity-t",
+ "sdk_system_current_android",
+]
+
// Defaults with module APIs in the classpath (mostly from prebuilts).
// Suitable for compiling android-non-updatable.
stubs_defaults {
@@ -345,19 +355,7 @@
"packages/modules/Media/apex/aidl/stable",
],
},
- libs: [
- "art.module.public.api",
- "sdk_module-lib_current_framework-tethering",
- "sdk_module-lib_current_framework-connectivity-t",
- "sdk_public_current_framework-bluetooth",
- // There are a few classes from modules used by the core that
- // need to be resolved by metalava. We use a prebuilt stub of the
- // full sdk to ensure we can resolve them. If a new class gets added,
- // the prebuilts/sdk/current needs to be updated.
- "sdk_system_current_android",
- // NOTE: The below can be removed once the prebuilt stub contains IKE.
- "sdk_system_current_android.net.ipsec.ike",
- ],
+ libs: non_updatable_api_deps_on_modules,
}
// Defaults for the java_sdk_libraries of unbundled jars from framework.
diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp
index 5688b96..f6f6929 100644
--- a/api/StubLibraries.bp
+++ b/api/StubLibraries.bp
@@ -351,17 +351,7 @@
"android-non-updatable_from_source_defaults",
],
srcs: [":module-lib-api-stubs-docs-non-updatable"],
- libs: [
- // We cannot depend on all-modules-module-lib-stubs, because the module-lib stubs
- // depend on this stub. We resolve dependencies on APIs in modules by depending
- // on a prebuilt of the whole platform (sdk_system_current_android).
- // That prebuilt does not include module-lib APIs, so use the prebuilt module-lib
- // stubs for modules that export module-lib stubs that the non-updatable part
- // depends on.
- "sdk_module-lib_current_framework-tethering",
- "sdk_module-lib_current_framework-connectivity-t",
- "sdk_system_current_android",
- ],
+ libs: non_updatable_api_deps_on_modules,
dist: {
dir: "apistubs/android/module-lib",
},
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 70811bb..9ea3dfc 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -248,7 +248,7 @@
* The length limit of Association tag.
* @hide
*/
- private static final int ASSOCIATION_TAG_LENGTH_LIMIT = 100;
+ private static final int ASSOCIATION_TAG_LENGTH_LIMIT = 1024;
/**
* Callback for applications to receive updates about and the outcome of
@@ -1427,7 +1427,7 @@
/**
* Sets the {@link AssociationInfo#getTag() tag} for this association.
*
- * <p>The length of the tag must be at most 100 characters to save disk space.
+ * <p>The length of the tag must be at most 1024 characters to save disk space.
*
* <p>This allows to store useful information about the associated devices.
*
@@ -1441,7 +1441,8 @@
Objects.requireNonNull(tag, "tag cannot be null");
if (tag.length() > ASSOCIATION_TAG_LENGTH_LIMIT) {
- throw new IllegalArgumentException("Length of the tag must be at most 100 characters");
+ throw new IllegalArgumentException("Length of the tag must be at most"
+ + ASSOCIATION_TAG_LENGTH_LIMIT + " characters");
}
try {
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 7b874cc..2081ced 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -47,6 +47,8 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Static utility methods for dealing with databases and {@link Cursor}s.
@@ -1585,6 +1587,38 @@
}
/**
+ * A regular expression that matches the first three characters in a SQL statement, after
+ * skipping past comments and whitespace. PREFIX_GROUP_NUM is the regex group that contains
+ * the matching prefix string. If PREFIX_REGEX is changed, PREFIX_GROUP_NUM may require an
+ * update too.
+ */
+ private static final String PREFIX_REGEX =
+ "(" // Zero-or more...
+ + "\\s+" // Leading space
+ + "|"
+ + "--.*?\n" // Line comment
+ + "|"
+ + "/\\*[\\w\\W]*?\\*/" // Block comment
+ + ")*"
+ + "(\\w\\w\\w)"; // Three word-characters
+ private static final int PREFIX_GROUP_NUM = 2;
+ private static final Pattern sPrefixPattern = Pattern.compile(PREFIX_REGEX);
+
+ /**
+ * Return the three-letter prefix of a SQL statement, skipping past whitespace and comments.
+ * Comments either start with "--" and run to the end of the line or are C-style block
+ * comments. The function returns null if a prefix could not be found.
+ */
+ private static String getSqlStatementPrefixExtended(String sql) {
+ Matcher m = sPrefixPattern.matcher(sql);
+ if (m.lookingAt()) {
+ return m.group(PREFIX_GROUP_NUM).toUpperCase(Locale.ROOT);
+ } else {
+ return null;
+ }
+ }
+
+ /**
* Return the extended statement type for the SQL statement. This is not a public API and it
* can return values that are not publicly visible.
* @hide
@@ -1630,6 +1664,9 @@
*/
public static int getSqlStatementTypeExtended(@NonNull String sql) {
int type = categorizeStatement(getSqlStatementPrefixSimple(sql), sql);
+ if (type == STATEMENT_COMMENT) {
+ type = categorizeStatement(getSqlStatementPrefixExtended(sql), sql);
+ }
return type;
}
diff --git a/core/java/android/hardware/biometrics/flags.aconfig b/core/java/android/hardware/biometrics/flags.aconfig
index 56ec763..375fdb5 100644
--- a/core/java/android/hardware/biometrics/flags.aconfig
+++ b/core/java/android/hardware/biometrics/flags.aconfig
@@ -16,7 +16,7 @@
flag {
name: "get_op_id_crypto_object"
- namespace: "biometrics"
+ namespace: "biometrics_framework"
description: "Feature flag for adding a get operation id api to CryptoObject."
bug: "307601768"
}
diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig
index a1885ae..43c38f3 100644
--- a/core/java/android/text/flags/flags.aconfig
+++ b/core/java/android/text/flags/flags.aconfig
@@ -75,10 +75,3 @@
description: "A feature flag that implements line break word style auto."
bug: "280005585"
}
-
-flag {
- name: "inter_character_justification"
- namespace: "text"
- description: "A feature flag that implement inter character justification."
- bug: "283193133"
-}
diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java
index 155f508..2945c8f 100644
--- a/core/java/android/util/ArrayMap.java
+++ b/core/java/android/util/ArrayMap.java
@@ -21,8 +21,6 @@
import com.android.internal.util.ArrayUtils;
-import libcore.util.EmptyArray;
-
import java.util.Arrays;
import java.util.Collection;
import java.util.ConcurrentModificationException;
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index 73114e2..adebe2c 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -20,8 +20,6 @@
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
-import libcore.util.EmptyArray;
-
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core/java/android/util/Base64.java b/core/java/android/util/Base64.java
index 33cc5e3..92abd7c 100644
--- a/core/java/android/util/Base64.java
+++ b/core/java/android/util/Base64.java
@@ -26,7 +26,6 @@
* href="http://www.ietf.org/rfc/rfc2045.txt">2045</a> and <a
* href="http://www.ietf.org/rfc/rfc3548.txt">3548</a>.
*/
-@android.ravenwood.annotations.RavenwoodWholeClassKeep
public class Base64 {
/**
* Default values for encoder/decoder flags.
diff --git a/core/java/android/util/EmptyArray.java b/core/java/android/util/EmptyArray.java
new file mode 100644
index 0000000..1216024
--- /dev/null
+++ b/core/java/android/util/EmptyArray.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 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.util;
+
+import android.annotation.NonNull;
+
+/**
+ * Empty array is immutable. Use a shared empty array to avoid allocation.
+ *
+ * @hide
+ */
+public final class EmptyArray {
+ private EmptyArray() {}
+
+ public static final @NonNull boolean[] BOOLEAN = new boolean[0];
+ public static final @NonNull byte[] BYTE = new byte[0];
+ public static final @NonNull char[] CHAR = new char[0];
+ public static final @NonNull double[] DOUBLE = new double[0];
+ public static final @NonNull float[] FLOAT = new float[0];
+ public static final @NonNull int[] INT = new int[0];
+ public static final @NonNull long[] LONG = new long[0];
+ public static final @NonNull Object[] OBJECT = new Object[0];
+ public static final @NonNull String[] STRING = new String[0];
+}
diff --git a/core/java/android/util/IntArray.java b/core/java/android/util/IntArray.java
index ac76fc2..c04a71c 100644
--- a/core/java/android/util/IntArray.java
+++ b/core/java/android/util/IntArray.java
@@ -19,8 +19,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
-import libcore.util.EmptyArray;
-
import java.util.Arrays;
/**
diff --git a/core/java/android/util/LongArray.java b/core/java/android/util/LongArray.java
index 9f269ed..3101c0d 100644
--- a/core/java/android/util/LongArray.java
+++ b/core/java/android/util/LongArray.java
@@ -23,8 +23,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
-import libcore.util.EmptyArray;
-
import java.util.Arrays;
/**
diff --git a/core/java/android/util/LongArrayQueue.java b/core/java/android/util/LongArrayQueue.java
index 5c701db..354f8df 100644
--- a/core/java/android/util/LongArrayQueue.java
+++ b/core/java/android/util/LongArrayQueue.java
@@ -19,8 +19,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
-import libcore.util.EmptyArray;
-
import java.util.NoSuchElementException;
/**
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index 2f14b25..8402ab2 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -24,8 +24,6 @@
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.LongObjPredicate;
-import libcore.util.EmptyArray;
-
import java.util.Arrays;
import java.util.Objects;
diff --git a/core/java/android/util/LongSparseLongArray.java b/core/java/android/util/LongSparseLongArray.java
index f23ec91..d4a0126 100644
--- a/core/java/android/util/LongSparseLongArray.java
+++ b/core/java/android/util/LongSparseLongArray.java
@@ -23,8 +23,6 @@
import com.android.internal.util.GrowingArrayUtils;
import com.android.internal.util.Preconditions;
-import libcore.util.EmptyArray;
-
/**
* Map of {@code long} to {@code long}. Unlike a normal array of longs, there
* can be gaps in the indices. It is intended to be more memory efficient than using a
diff --git a/core/java/android/util/Range.java b/core/java/android/util/Range.java
index 41c171a..750696b 100644
--- a/core/java/android/util/Range.java
+++ b/core/java/android/util/Range.java
@@ -19,7 +19,8 @@
import static com.android.internal.util.Preconditions.*;
import android.annotation.Nullable;
-import android.hardware.camera2.utils.HashCodeHelpers;
+
+import java.util.Objects;
/**
* Immutable class for describing the range of two numeric values.
@@ -351,7 +352,7 @@
*/
@Override
public int hashCode() {
- return HashCodeHelpers.hashCodeGeneric(mLower, mUpper);
+ return Objects.hash(mLower, mUpper);
}
private final T mLower;
diff --git a/core/java/android/util/SparseArray.java b/core/java/android/util/SparseArray.java
index cd03d83..c18cac3 100644
--- a/core/java/android/util/SparseArray.java
+++ b/core/java/android/util/SparseArray.java
@@ -22,8 +22,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
-import libcore.util.EmptyArray;
-
import java.util.Objects;
/**
diff --git a/core/java/android/util/SparseBooleanArray.java b/core/java/android/util/SparseBooleanArray.java
index 12a9900..795f4c9 100644
--- a/core/java/android/util/SparseBooleanArray.java
+++ b/core/java/android/util/SparseBooleanArray.java
@@ -22,8 +22,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
-import libcore.util.EmptyArray;
-
/**
* SparseBooleanArrays map integers to booleans.
* Unlike a normal array of booleans
diff --git a/core/java/android/util/SparseIntArray.java b/core/java/android/util/SparseIntArray.java
index 0e98c28..24d04be 100644
--- a/core/java/android/util/SparseIntArray.java
+++ b/core/java/android/util/SparseIntArray.java
@@ -21,8 +21,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
-import libcore.util.EmptyArray;
-
import java.util.Arrays;
/**
diff --git a/core/java/android/util/SparseLongArray.java b/core/java/android/util/SparseLongArray.java
index e86b647..4b257e6 100644
--- a/core/java/android/util/SparseLongArray.java
+++ b/core/java/android/util/SparseLongArray.java
@@ -19,8 +19,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
-import libcore.util.EmptyArray;
-
/**
* SparseLongArrays map integers to longs. Unlike a normal array of longs,
* there can be gaps in the indices. It is intended to be more memory efficient
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 42ac74c..ad326e4 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -11,6 +11,7 @@
roosa@google.com
jreck@google.com
siyamed@google.com
+mount@google.com
# Autofill
per-file ViewStructure.java = file:/core/java/android/service/autofill/OWNERS
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index e4e8b7b5b..163dfa2 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -424,11 +424,13 @@
TextureLayer layer = getTextureLayer();
if (layer != null) {
+ Trace.traceBegin(Trace.TRACE_TAG_VIEW, "TextureView#draw()");
applyUpdate();
applyTransformMatrix();
mLayer.setLayerPaint(mLayerPaint); // ensure layer paint is up to date
recordingCanvas.drawTextureLayer(layer);
+ Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
}
}
diff --git a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
new file mode 100644
index 0000000..3c15518
--- /dev/null
+++ b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
@@ -0,0 +1,8 @@
+package: "android.view.contentcapture.flags"
+
+flag {
+ name: "run_on_background_thread_enabled"
+ namespace: "machine_learning"
+ description: "Feature flag for running content capture tasks on background thread"
+ bug: "309411951"
+}
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 1a2d202..5bfa3d7 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -55,6 +55,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* Used to communicate information about what is changing during a transition to a TransitionPlayer.
@@ -610,7 +611,7 @@
private final WindowContainerToken mContainer;
private WindowContainerToken mParent;
private WindowContainerToken mLastParent;
- private final SurfaceControl mLeash;
+ private SurfaceControl mLeash;
private @TransitionMode int mMode = TRANSIT_NONE;
private @ChangeFlags int mFlags = FLAG_NONE;
private final Rect mStartAbsBounds = new Rect();
@@ -697,6 +698,11 @@
mLastParent = lastParent;
}
+ /** Sets the animation leash for controlling this change's container */
+ public void setLeash(@NonNull SurfaceControl leash) {
+ mLeash = Objects.requireNonNull(leash);
+ }
+
/** Sets the transition mode for this change */
public void setMode(@TransitionMode int mode) {
mMode = mode;
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index b64771b..686e1fc 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -21,11 +21,10 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.util.ArraySet;
+import android.util.EmptyArray;
import dalvik.system.VMRuntime;
-import libcore.util.EmptyArray;
-
import java.io.File;
import java.lang.reflect.Array;
import java.util.ArrayList;
@@ -84,6 +83,38 @@
return (T[])VMRuntime.getRuntime().newUnpaddedArray(clazz, minLen);
}
+ public static byte[] newUnpaddedByteArray$ravenwood(int minLen) {
+ return new byte[minLen];
+ }
+
+ public static char[] newUnpaddedCharArray$ravenwood(int minLen) {
+ return new char[minLen];
+ }
+
+ public static int[] newUnpaddedIntArray$ravenwood(int minLen) {
+ return new int[minLen];
+ }
+
+ public static boolean[] newUnpaddedBooleanArray$ravenwood(int minLen) {
+ return new boolean[minLen];
+ }
+
+ public static long[] newUnpaddedLongArray$ravenwood(int minLen) {
+ return new long[minLen];
+ }
+
+ public static float[] newUnpaddedFloatArray$ravenwood(int minLen) {
+ return new float[minLen];
+ }
+
+ public static Object[] newUnpaddedObjectArray$ravenwood(int minLen) {
+ return new Object[minLen];
+ }
+
+ public static <T> T[] newUnpaddedArray$ravenwood(Class<T> clazz, int minLen) {
+ return (T[]) Array.newInstance(clazz, minLen);
+ }
+
/**
* Checks if the beginnings of two byte arrays are equal.
*
diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java
index b462c21..87324db 100644
--- a/core/java/com/android/internal/util/LatencyTracker.java
+++ b/core/java/com/android/internal/util/LatencyTracker.java
@@ -25,6 +25,7 @@
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FACE_WAKE_AND_UNLOCK;
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FINGERPRINT_WAKE_AND_UNLOCK;
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FOLD_TO_AOD;
+import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME;
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOAD_SHARE_SHEET;
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOCKSCREEN_UNLOCK;
import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_NOTIFICATION_BIG_PICTURE_LOADED;
@@ -222,6 +223,11 @@
*/
public static final int ACTION_NOTIFICATION_BIG_PICTURE_LOADED = 23;
+ /**
+ * Time it takes to unlock the device via udfps, until the whole launcher appears.
+ */
+ public static final int ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME = 24;
+
private static final int[] ACTIONS_ALL = {
ACTION_EXPAND_PANEL,
ACTION_TOGGLE_RECENTS,
@@ -247,6 +253,7 @@
ACTION_REQUEST_IME_HIDDEN,
ACTION_SMARTSPACE_DOORBELL,
ACTION_NOTIFICATION_BIG_PICTURE_LOADED,
+ ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME,
};
/** @hide */
@@ -275,6 +282,7 @@
ACTION_REQUEST_IME_HIDDEN,
ACTION_SMARTSPACE_DOORBELL,
ACTION_NOTIFICATION_BIG_PICTURE_LOADED,
+ ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Action {
@@ -306,6 +314,7 @@
UIACTION_LATENCY_REPORTED__ACTION__ACTION_REQUEST_IME_HIDDEN,
UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL,
UIACTION_LATENCY_REPORTED__ACTION__ACTION_NOTIFICATION_BIG_PICTURE_LOADED,
+ UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME,
};
private final Object mLock = new Object();
@@ -492,6 +501,8 @@
return "ACTION_SMARTSPACE_DOORBELL";
case UIACTION_LATENCY_REPORTED__ACTION__ACTION_NOTIFICATION_BIG_PICTURE_LOADED:
return "ACTION_NOTIFICATION_BIG_PICTURE_LOADED";
+ case UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME:
+ return "ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME";
default:
throw new IllegalArgumentException("Invalid action");
}
diff --git a/core/res/res/values-af-watch/strings.xml b/core/res/res/values-af-watch/strings.xml
index 21ba346..15bc1f3 100644
--- a/core/res/res/values-af-watch/strings.xml
+++ b/core/res/res/values-af-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Nood-SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-stelselopdatering"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am-watch/strings.xml b/core/res/res/values-am-watch/strings.xml
index ad9b696..243ba55 100644
--- a/core/res/res/values-am-watch/strings.xml
+++ b/core/res/res/values-am-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"አነፍናፊዎች"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"የነፍስ አድን ድንገተኛ ጥሪ"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"የWear OS ስርዓት ዝማኔ"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ar-watch/strings.xml b/core/res/res/values-ar-watch/strings.xml
index a8ca4cc..2a8248b 100644
--- a/core/res/res/values-ar-watch/strings.xml
+++ b/core/res/res/values-ar-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"أجهزة الاستشعار"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"اتصالات الطوارئ"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"تحديث نظام التشغيل Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as-watch/strings.xml b/core/res/res/values-as-watch/strings.xml
index 5dc8863..d65b58d 100644
--- a/core/res/res/values-as-watch/strings.xml
+++ b/core/res/res/values-as-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ছেন্সৰসমূহ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"জৰুৰীকালীন SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OSৰ ছিষ্টেম আপডে’ট"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index df4f28a..517ae9a 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1941,8 +1941,8 @@
<string name="importance_from_user" msgid="2782756722448800447">"এই জাননীবোৰৰ গুৰুত্ব আপুনি ছেট কৰব লাগিব।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"এই কার্যৰ সৈতে জড়িত থকা লোকসকলক ভিত্তি কৰি এইয়া গুৰুত্বপূর্ণ বুলি বিবেচনা কৰা হৈছ।"</string>
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"কাষ্টম এপৰ জাননী"</string>
- <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>ক <xliff:g id="ACCOUNT">%2$s</xliff:g>ৰ (এই একাউণ্টটোৰ এজন ব্যৱহাৰকাৰী ইতিমধ্যে আছে) জৰিয়তে এজন নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে ?"</string>
- <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>ক <xliff:g id="ACCOUNT">%2$s</xliff:g>ৰ জৰিয়তে এজন নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে?"</string>
+ <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>ক <xliff:g id="ACCOUNT">%2$s</xliff:g>ৰ (এই একাউণ্টটোৰ এগৰাকী ব্যৱহাৰকাৰী ইতিমধ্যে আছে) জৰিয়তে এগৰাকী নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে ?"</string>
+ <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>ক <xliff:g id="ACCOUNT">%2$s</xliff:g>ৰ জৰিয়তে এগৰাকী নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="supervised_user_creation_label" msgid="6884904353827427515">"নিৰীক্ষণত থকা ব্যৱহাৰকাৰী যোগ দিয়ক"</string>
<string name="language_selection_title" msgid="52674936078683285">"ভাষা যোগ কৰক"</string>
<string name="country_selection_title" msgid="5221495687299014379">"অঞ্চলৰ অগ্ৰাধিকাৰ"</string>
diff --git a/core/res/res/values-az-watch/strings.xml b/core/res/res/values-az-watch/strings.xml
index cf1b7a5..15b640b 100644
--- a/core/res/res/values-az-watch/strings.xml
+++ b/core/res/res/values-az-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorlar"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Fövqəladə halda SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS sistem güncəlləməsi"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-b+sr+Latn-watch/strings.xml b/core/res/res/values-b+sr+Latn-watch/strings.xml
index da58726..fc0b05d 100644
--- a/core/res/res/values-b+sr+Latn-watch/strings.xml
+++ b/core/res/res/values-b+sr+Latn-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Hitna pomoć"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Ažuriranje sistema za Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-be-watch/strings.xml b/core/res/res/values-be-watch/strings.xml
index 75e6307..bd3f77a 100644
--- a/core/res/res/values-be-watch/strings.xml
+++ b/core/res/res/values-be-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Датчыкі"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Экстранны выклік"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Абнаўленне сістэмы Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg-watch/strings.xml b/core/res/res/values-bg-watch/strings.xml
index 7977f66..e72ec96 100644
--- a/core/res/res/values-bg-watch/strings.xml
+++ b/core/res/res/values-bg-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Сензори"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Спешно повикване SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Системна актуализация за Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn-watch/strings.xml b/core/res/res/values-bn-watch/strings.xml
index c98d372..9b6ad6b 100644
--- a/core/res/res/values-bn-watch/strings.xml
+++ b/core/res/res/values-bn-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"সেন্সরগুলি"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ইমারজেন্সি SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS সিস্টেম আপডেট"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs-watch/strings.xml b/core/res/res/values-bs-watch/strings.xml
index da58726..e4a774a 100644
--- a/core/res/res/values-bs-watch/strings.xml
+++ b/core/res/res/values-bs-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Hitni pozivi"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Ažuriranje Wear OS sistema"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 8104b59..20f1d68 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1690,8 +1690,8 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Ukloni"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Želite li pojačati zvuk iznad preporučenog nivoa?\n\nDužim slušanjem glasnog zvuka možete oštetiti sluh."</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Nastaviti slušati pri visokoj jačini zvuka?\n\nJačina zvuka slušalica je bila visoka duže od preporučenog, što može oštetiti sluh"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Otkriven je glasan zvuk\n\nJačina zvuka slušalica je bila viša od preporučenog, što može oštetiti sluh"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Nastaviti slušati pri visokoj jačini zvuka?\n\nJačina zvuka slušalica je bila visoka duže nego što se preporučuje, što može oštetiti sluh"</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Otkriven je glasan zvuk\n\nJačina zvuka slušalica je bila viša od preporučene, što može oštetiti sluh"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Želite li koristiti Prečicu za pristupačnost?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kada je prečica uključena, pritiskom i držanjem oba dugmeta za jačinu zvuka u trajanju od 3 sekunde pokrenut će se funkcija pristupačnosti."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Uključiti prečicu za funkcije pristupačnosti?"</string>
diff --git a/core/res/res/values-ca-watch/strings.xml b/core/res/res/values-ca-watch/strings.xml
index 21ba346..98f1daa 100644
--- a/core/res/res/values-ca-watch/strings.xml
+++ b/core/res/res/values-ca-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergència SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Actualització del sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs-watch/strings.xml b/core/res/res/values-cs-watch/strings.xml
index 6c9d718..2ddd534 100644
--- a/core/res/res/values-cs-watch/strings.xml
+++ b/core/res/res/values-cs-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzory"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Tísňové volání"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Aktualizace systému Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da-watch/strings.xml b/core/res/res/values-da-watch/strings.xml
index fa296b6..26e7b72 100644
--- a/core/res/res/values-da-watch/strings.xml
+++ b/core/res/res/values-da-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorer"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Alarm-SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-systemopdatering"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de-watch/strings.xml b/core/res/res/values-de-watch/strings.xml
index 3f693a9..370ea92 100644
--- a/core/res/res/values-de-watch/strings.xml
+++ b/core/res/res/values-de-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensoren"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Notfall-SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-Systemupdate"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 3faf328..2c1adb8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1689,8 +1689,8 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Entfernen"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Lautstärke über den Schwellenwert anheben?\n\nWenn du über einen längeren Zeitraum Musik in hoher Lautstärke hörst, kann dies dein Gehör schädigen."</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Weiter mit hoher Lautstärke hören?\n\nDu hast deine Kopfhörer länger als empfohlen mit einer hohen Lautstärke betrieben. Das kann deinem Hörvermögen schaden"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Lautes Geräusch erkannt\n\nDu hast deine Kopfhörer lauter als empfohlen eingestellt. Das kann deinem Hörvermögen schaden"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Weiter mit hoher Lautstärke hören?\n\nDeine Kopfhörer sind schon länger als empfohlen auf hohe Lautstärke eingestellt – das kann deinem Hörvermögen schaden"</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Hohe Lautstärke erkannt\n\nDu hast deine Kopfhörer lauter als empfohlen eingestellt – das kann deinem Hörvermögen schaden"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Verknüpfung für Bedienungshilfen verwenden?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Wenn die Verknüpfung aktiviert ist, kannst du die beiden Lautstärketasten drei Sekunden lang gedrückt halten, um eine Bedienungshilfe zu starten."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Verknüpfung für Bedienungshilfen aktivieren?"</string>
diff --git a/core/res/res/values-el-watch/strings.xml b/core/res/res/values-el-watch/strings.xml
index 4d5b10d..55de5f2 100644
--- a/core/res/res/values-el-watch/strings.xml
+++ b/core/res/res/values-el-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Αισθητήρες"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Έκτακτη ανάγκη SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Ενημέρωση συστήματος Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rAU-watch/strings.xml b/core/res/res/values-en-rAU-watch/strings.xml
index 21ba346..e550f9e 100644
--- a/core/res/res/values-en-rAU-watch/strings.xml
+++ b/core/res/res/values-en-rAU-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS system update"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rCA-watch/strings.xml b/core/res/res/values-en-rCA-watch/strings.xml
index 21ba346..5008fac 100644
--- a/core/res/res/values-en-rCA-watch/strings.xml
+++ b/core/res/res/values-en-rCA-watch/strings.xml
@@ -21,4 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <string name="reboot_to_update_prepare" msgid="4129802024411268230">"Preparing to update"</string>
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS system update"</string>
+ <string name="select_input_method" msgid="1285150113084396451">"Choose input"</string>
</resources>
diff --git a/core/res/res/values-en-rGB-watch/strings.xml b/core/res/res/values-en-rGB-watch/strings.xml
index 21ba346..e550f9e 100644
--- a/core/res/res/values-en-rGB-watch/strings.xml
+++ b/core/res/res/values-en-rGB-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS system update"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN-watch/strings.xml b/core/res/res/values-en-rIN-watch/strings.xml
index 21ba346..e550f9e 100644
--- a/core/res/res/values-en-rIN-watch/strings.xml
+++ b/core/res/res/values-en-rIN-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS system update"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rXC-watch/strings.xml b/core/res/res/values-en-rXC-watch/strings.xml
index 4ed361d..8910f31 100644
--- a/core/res/res/values-en-rXC-watch/strings.xml
+++ b/core/res/res/values-en-rXC-watch/strings.xml
@@ -21,4 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensors"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <string name="reboot_to_update_prepare" msgid="4129802024411268230">"Preparing to update"</string>
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS system update"</string>
+ <string name="select_input_method" msgid="1285150113084396451">"Choose input"</string>
</resources>
diff --git a/core/res/res/values-es-rUS-watch/strings.xml b/core/res/res/values-es-rUS-watch/strings.xml
index dea270b..5c5b660 100644
--- a/core/res/res/values-es-rUS-watch/strings.xml
+++ b/core/res/res/values-es-rUS-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergencia SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Actualización del sistema de Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es-watch/strings.xml b/core/res/res/values-es-watch/strings.xml
index dea270b..1877b42 100644
--- a/core/res/res/values-es-watch/strings.xml
+++ b/core/res/res/values-es-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergencia SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Actualización del sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index f310c93..b76229a 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1690,8 +1690,8 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Quitar"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos."</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"¿Seguir escuchando a un volumen alto?\n\nEl volumen de los auriculares ha estado alto durante más tiempo del recomendado, lo que puede dañar tu audición"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Sonido alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"¿Seguir escuchando a un volumen alto?\n\nEl volumen de los auriculares ha estado alto durante más tiempo del recomendado, lo que puede dañar tu audición."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Sonido alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"¿Utilizar acceso directo de accesibilidad?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Si el acceso directo está activado, pulsa los dos botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"¿Quieres activar el acceso directo a las funciones de accesibilidad?"</string>
diff --git a/core/res/res/values-et-watch/strings.xml b/core/res/res/values-et-watch/strings.xml
index 4888bc1..09ff2e5 100644
--- a/core/res/res/values-et-watch/strings.xml
+++ b/core/res/res/values-et-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Andurid"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Hädaabikõne"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-i süsteemivärskendus"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu-watch/strings.xml b/core/res/res/values-eu-watch/strings.xml
index 7bb5e9d..3d739a0 100644
--- a/core/res/res/values-eu-watch/strings.xml
+++ b/core/res/res/values-eu-watch/strings.xml
@@ -21,4 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sentsoreak"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS larrialdia"</string>
+ <string name="reboot_to_update_prepare" msgid="4129802024411268230">"Eguneratzeko prestatzen"</string>
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS sistemaren eguneratzea"</string>
+ <string name="select_input_method" msgid="1285150113084396451">"Aukeratu idazketa-metodo bat"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index a163ed8..86eaf0a 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1689,8 +1689,8 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Kendu"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Bolumena gomendatutako mailatik gora igo nahi duzu?\n\nMusika bolumen handian eta denbora luzez entzuteak entzumena kalte diezazuke."</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Bolumen altuan entzuten jarraitu nahi duzu?\n\nEntzungailuen bolumena gomendatutako denboran baino gehiagoan eduki da ozen, eta baliteke horrek entzumena kaltetzea"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Soinu ozen bat hauteman da\n\nEntzungailuen bolumena gomendatutakoa baino ozenago eduki da, eta baliteke horrek entzumena kaltetzea"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Bolumen altuan entzuten jarraitu nahi duzu?\n\nEntzungailuen bolumena gomendatutako denbora baino luzaroago egon da ozen, eta baliteke horrek entzumena kaltetzea"</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Soinua ozenegia dela hauteman da\n\nEntzungailuen bolumena gomendatutakoa baino ozenago eduki da, eta baliteke horrek entzumena kaltetzea"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Erabilerraztasun-lasterbidea erabili nahi duzu?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Lasterbidea aktibatuta dagoenean, bi bolumen-botoiak hiru segundoz sakatuta abiaraziko da erabilerraztasun-eginbidea."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Erabilerraztasun-eginbideetarako lasterbidea aktibatu nahi duzu?"</string>
diff --git a/core/res/res/values-fa-watch/strings.xml b/core/res/res/values-fa-watch/strings.xml
index 4bd0216..0607c37 100644
--- a/core/res/res/values-fa-watch/strings.xml
+++ b/core/res/res/values-fa-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"حسگرها"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"کمک اضطراری"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"بهروزرسانی سیستم Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi-watch/strings.xml b/core/res/res/values-fi-watch/strings.xml
index d565979c3..a8e873d 100644
--- a/core/res/res/values-fi-watch/strings.xml
+++ b/core/res/res/values-fi-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Anturit"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Hätäpuhelut"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS ‑järjestelmäpäivitys"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA-watch/strings.xml b/core/res/res/values-fr-rCA-watch/strings.xml
index dc71b35..babd6ca 100644
--- a/core/res/res/values-fr-rCA-watch/strings.xml
+++ b/core/res/res/values-fr-rCA-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Capteurs"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Appel d\'urgence"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Mise à jour du système Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-watch/strings.xml b/core/res/res/values-fr-watch/strings.xml
index dc71b35..130c466 100644
--- a/core/res/res/values-fr-watch/strings.xml
+++ b/core/res/res/values-fr-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Capteurs"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS Urgence"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Mise à jour du système Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl-watch/strings.xml b/core/res/res/values-gl-watch/strings.xml
index dea270b..f11990a 100644
--- a/core/res/res/values-gl-watch/strings.xml
+++ b/core/res/res/values-gl-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emerxencia SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Actualización do sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu-watch/strings.xml b/core/res/res/values-gu-watch/strings.xml
index 8d38a68..331ffa7 100644
--- a/core/res/res/values-gu-watch/strings.xml
+++ b/core/res/res/values-gu-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"સેન્સર્સ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ઇમર્જન્સી સહાય"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OSની સિસ્ટમ અપડેટ"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi-watch/strings.xml b/core/res/res/values-hi-watch/strings.xml
index e73ce77..75ff50d 100644
--- a/core/res/res/values-hi-watch/strings.xml
+++ b/core/res/res/values-hi-watch/strings.xml
@@ -20,5 +20,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permgrouplab_sensors" msgid="2439544173324807471">"संवेदक"</string>
+ <string name="permgrouplab_sensors" msgid="2439544173324807471">"सेंसर"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"इमरजेंसी एसओएस"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS का सिस्टम अपडेट"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr-watch/strings.xml b/core/res/res/values-hr-watch/strings.xml
index da58726..237b4c0 100644
--- a/core/res/res/values-hr-watch/strings.xml
+++ b/core/res/res/values-hr-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS poziv"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Ažuriranje sustava Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu-watch/strings.xml b/core/res/res/values-hu-watch/strings.xml
index b8053c1..00c7b04 100644
--- a/core/res/res/values-hu-watch/strings.xml
+++ b/core/res/res/values-hu-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Érzékelők"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Segélyhívás"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-rendszerfrissítés"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy-watch/strings.xml b/core/res/res/values-hy-watch/strings.xml
index 4966e04..3de85ed 100644
--- a/core/res/res/values-hy-watch/strings.xml
+++ b/core/res/res/values-hy-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Սենսորներ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Շտապ կանչեր"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS համակարգի թարմացում"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index ccea0cc..9c2c2c5 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1689,7 +1689,7 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Հեռացնել"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Ձայնը բարձրացնե՞լ խորհուրդ տրվող մակարդակից ավել:\n\nԵրկարատև բարձրաձայն լսելը կարող է վնասել ձեր լսողությունը:"</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Պահե՞լ ձայնը բարձրացրած\n\nԱկանջակալների ձայնի ուժգնությունը տևական ժամանակ ավելի բարձր է եղել առաջարկվող մակարդակից, ինչը կարող է վնասել ձեր լսողությունը"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Բարձր պահե՞լ ձայնը\n\nԱկանջակալների ձայնի ուժգնությունը տևական ժամանակ ավելի բարձր է եղել առաջարկվող մակարդակից, ինչը կարող է վնասել ձեր լսողությունը"</string>
<string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Հայտնաբերվել է ձայնի բարձր ուժգնություն\n\nԱկանջակալների ձայնի ուժգնությունը բարձր է առաջարկվող մակարդակից, ինչը կարող է վնասել ձեր լսողությունը"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Օգտագործե՞լ Մատչելիության դյուրանցումը։"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Հատուկ գործառույթն օգտագործելու համար սեղմեք և 3 վայրկյան սեղմած պահեք ձայնի ուժգնության երկու կոճակները, երբ գործառույթը միացված է:"</string>
diff --git a/core/res/res/values-in-watch/strings.xml b/core/res/res/values-in-watch/strings.xml
index 4d64473..34eaa91 100644
--- a/core/res/res/values-in-watch/strings.xml
+++ b/core/res/res/values-in-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensor"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Darurat SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Update sistem Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is-watch/strings.xml b/core/res/res/values-is-watch/strings.xml
index 041a534..50781a8 100644
--- a/core/res/res/values-is-watch/strings.xml
+++ b/core/res/res/values-is-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Skynjarar"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Neyðartilkynning"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Kerfisuppfærsla Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it-watch/strings.xml b/core/res/res/values-it-watch/strings.xml
index e22f614..e01c55f 100644
--- a/core/res/res/values-it-watch/strings.xml
+++ b/core/res/res/values-it-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS emergenze"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Aggiornamento di sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index e6bc552..9ffadbe 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1691,7 +1691,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Rimuovi"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Vuoi aumentare il volume oltre il livello consigliato?\n\nL\'ascolto ad alto volume per lunghi periodi di tempo potrebbe danneggiare l\'udito."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Vuoi continuare ad ascoltare a un volume alto?\n\nIl volume delle cuffie è rimasto alto per un periodo superiore a quello raccomandato, con il rischio di danneggiare l\'udito"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Rilevato un suono forte\n\nIl volume delle cuffie è più alto di quello raccomandato, con il rischio di danneggiare l\'udito"</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Rilevato suono forte\n\nIl volume delle cuffie è più alto di quello raccomandato e potrebbe danneggiare il tuo udito"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Usare la scorciatoia Accessibilità?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando la scorciatoia è attiva, puoi premere entrambi i pulsanti del volume per tre secondi per avviare una funzione di accessibilità."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vuoi attivare la scorciatoia per le funzioni di accessibilità?"</string>
diff --git a/core/res/res/values-iw-watch/strings.xml b/core/res/res/values-iw-watch/strings.xml
index d03a499..3dc8a86 100644
--- a/core/res/res/values-iw-watch/strings.xml
+++ b/core/res/res/values-iw-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"חיישנים"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"מצב חירום"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"עדכון מערכת של Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja-watch/strings.xml b/core/res/res/values-ja-watch/strings.xml
index 05ee203..7e19843 100644
--- a/core/res/res/values-ja-watch/strings.xml
+++ b/core/res/res/values-ja-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"センサー"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"緊急 SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS システム アップデート"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka-watch/strings.xml b/core/res/res/values-ka-watch/strings.xml
index e91e2d3..993d6d2 100644
--- a/core/res/res/values-ka-watch/strings.xml
+++ b/core/res/res/values-ka-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"სენსორები"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"გადაუდებელი დახმარება"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS სისტემის განახლება"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kk-watch/strings.xml b/core/res/res/values-kk-watch/strings.xml
index 6eb05ba..622350c 100644
--- a/core/res/res/values-kk-watch/strings.xml
+++ b/core/res/res/values-kk-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Сенсорлар"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Құтқару қызметін шақыру"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS жүйесін жаңарту"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km-watch/strings.xml b/core/res/res/values-km-watch/strings.xml
index dd72ee4..ae7ba7d 100644
--- a/core/res/res/values-km-watch/strings.xml
+++ b/core/res/res/values-km-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ឧបករណ៍ចាប់សញ្ញា"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS ពេលមានអាសន្ន"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"បច្ចុប្បន្នភាពប្រព័ន្ធ Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn-watch/strings.xml b/core/res/res/values-kn-watch/strings.xml
index b5cf763..6b7af18 100644
--- a/core/res/res/values-kn-watch/strings.xml
+++ b/core/res/res/values-kn-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ಸೆನ್ಸರ್ಗಳು"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ತುರ್ತು SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS ಸಿಸ್ಟಂ ಅಪ್ಡೇಟ್"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko-watch/strings.xml b/core/res/res/values-ko-watch/strings.xml
index a9cbb63..c5bf069 100644
--- a/core/res/res/values-ko-watch/strings.xml
+++ b/core/res/res/values-ko-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"센서"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"긴급 SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS 시스템 업데이트"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 0608283..b867fe6 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1690,7 +1690,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"삭제"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"권장 수준 이상으로 볼륨을 높이시겠습니까?\n\n높은 볼륨으로 장시간 청취하면 청력에 손상이 올 수 있습니다."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"계속해서 높은 볼륨으로 들으시겠습니까?\n\n헤드폰 볼륨이 권장 시간보다 오랫동안 높은 상태였으며 이로 인해 청력 손상이 발생할 수 있습니다."</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"큰 소리가 감지됨\n\n헤드폰 볼륨이 권장 시간보다 오랫동안 높은 상태였으며 이로 인해 청력 손상이 발생할 수 있습니다."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"큰 소리가 감지됨\n\n헤드폰 볼륨이 권장 수준보다 높으며 이로 인해 청력 손상이 발생할 수 있습니다."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"접근성 단축키를 사용하시겠습니까?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"단축키가 사용 설정된 경우 볼륨 버튼 두 개를 동시에 3초간 누르면 접근성 기능이 시작됩니다."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"접근성 기능 바로가기를 사용 설정하시겠습니까?"</string>
diff --git a/core/res/res/values-ky-watch/strings.xml b/core/res/res/values-ky-watch/strings.xml
index 4095282..df2b762 100644
--- a/core/res/res/values-ky-watch/strings.xml
+++ b/core/res/res/values-ky-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Сенсорлор"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Кырсыктаганда чалуу"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS системасын жаңыртуу"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo-watch/strings.xml b/core/res/res/values-lo-watch/strings.xml
index e83751a..d4804d3 100644
--- a/core/res/res/values-lo-watch/strings.xml
+++ b/core/res/res/values-lo-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ເຊັນເຊີ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS ສຸກເສີນ"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"ອັບເດດລະບົບ Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt-watch/strings.xml b/core/res/res/values-lt-watch/strings.xml
index bf6e92a..ba40587 100644
--- a/core/res/res/values-lt-watch/strings.xml
+++ b/core/res/res/values-lt-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Jutikliai"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Pagalbos iškv. kr. atv."</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"„Wear OS“ sistemos naujinys"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv-watch/strings.xml b/core/res/res/values-lv-watch/strings.xml
index e22f614..77817e9 100644
--- a/core/res/res/values-lv-watch/strings.xml
+++ b/core/res/res/values-lv-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Ārkārtas zvans"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS sistēmas atjauninājums"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk-watch/strings.xml b/core/res/res/values-mk-watch/strings.xml
index 7977f66..b2e4218 100644
--- a/core/res/res/values-mk-watch/strings.xml
+++ b/core/res/res/values-mk-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Сензори"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Итна помош"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Системско ажурирање на Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml-watch/strings.xml b/core/res/res/values-ml-watch/strings.xml
index 807f1a9..e543254 100644
--- a/core/res/res/values-ml-watch/strings.xml
+++ b/core/res/res/values-ml-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"സെൻസറുകൾ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"എമർജൻസി SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS സിസ്റ്റം അപ്ഡേറ്റ്"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn-watch/strings.xml b/core/res/res/values-mn-watch/strings.xml
index b00580f..d01f174 100644
--- a/core/res/res/values-mn-watch/strings.xml
+++ b/core/res/res/values-mn-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Мэдрэгч"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Яаралтай тусламж"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-н систем шинэчлэлт"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr-watch/strings.xml b/core/res/res/values-mr-watch/strings.xml
index 0bc7ad6..6092559 100644
--- a/core/res/res/values-mr-watch/strings.xml
+++ b/core/res/res/values-mr-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"सेन्सर"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"आणीबाणी SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS संबंधित सिस्टीम अपडेट"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms-watch/strings.xml b/core/res/res/values-ms-watch/strings.xml
index cadbbbd..b223c03 100644
--- a/core/res/res/values-ms-watch/strings.xml
+++ b/core/res/res/values-ms-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Penderia"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS Kecemasan"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Kemaskinian sistem Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my-watch/strings.xml b/core/res/res/values-my-watch/strings.xml
index c471b3831..b0f1809 100644
--- a/core/res/res/values-my-watch/strings.xml
+++ b/core/res/res/values-my-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"အာရုံခံကိရိယာများ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"အရေးပေါ် SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS စနစ် အပ်ဒိတ်လုပ်ခြင်း"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb-watch/strings.xml b/core/res/res/values-nb-watch/strings.xml
index fa296b6..6038976 100644
--- a/core/res/res/values-nb-watch/strings.xml
+++ b/core/res/res/values-nb-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorer"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS-alarm"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-systemoppdatering"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne-watch/strings.xml b/core/res/res/values-ne-watch/strings.xml
index 8c0df82..7f20abd 100644
--- a/core/res/res/values-ne-watch/strings.xml
+++ b/core/res/res/values-ne-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"सेन्सरहरू"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"आपत्कालीन सेवामा फोन गर्ने सुविधा"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS को सिस्टम अपडेट"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl-watch/strings.xml b/core/res/res/values-nl-watch/strings.xml
index 3f693a9..bdcaf42 100644
--- a/core/res/res/values-nl-watch/strings.xml
+++ b/core/res/res/values-nl-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensoren"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS-systeemupdate"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index ae7d366..a4bedd3 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1689,8 +1689,8 @@
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Verwijderen"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Volume verhogen tot boven het aanbevolen niveau?\n\nAls je langere tijd op hoog volume naar muziek luistert, raakt je gehoor mogelijk beschadigd."</string>
- <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Wil je blijven luisteren op hoog volume?\n\nHet hoofdtelefoonvolume is langer dan de aanbevolen tijd hoog geweest, wat je gehoor kan beschadigen"</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Hard geluid gedetecteerd\n\nHet hoofdtelefoonvolume is hoger dan aanbevolen, wat je gehoor kan beschadigen"</string>
+ <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Wil je blijven luisteren op hoog volume?\n\nHet hoofdtelefoonvolume is langer dan de aanbevolen tijd hoog geweest. Dit kan je gehoor beschadigen."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Hard geluid gedetecteerd\n\nHet hoofdtelefoonvolume is hoger dan aanbevolen. Dit kan je gehoor beschadigen."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Snelkoppeling toegankelijkheid gebruiken?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Als de snelkoppeling aanstaat, houd je beide volumeknoppen 3 seconden ingedrukt om een toegankelijkheidsfunctie te starten."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Snelkoppeling voor toegankelijkheidsfuncties aanzetten?"</string>
diff --git a/core/res/res/values-or-watch/strings.xml b/core/res/res/values-or-watch/strings.xml
index 8b11631..7fd7c19 100644
--- a/core/res/res/values-or-watch/strings.xml
+++ b/core/res/res/values-or-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ସେନ୍ସର୍"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ଜରୁରୀକାଳୀନ SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS ସିଷ୍ଟମ୍ ଅପଡେଟ୍"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa-watch/strings.xml b/core/res/res/values-pa-watch/strings.xml
index b1eb3a7..fd31f9b 100644
--- a/core/res/res/values-pa-watch/strings.xml
+++ b/core/res/res/values-pa-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"ਸੰੰਵੇਦਕ"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ਐਮਰਜੈਂਸੀ ਸਹਾਇਤਾ"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl-watch/strings.xml b/core/res/res/values-pl-watch/strings.xml
index 2d81625..4f4b661 100644
--- a/core/res/res/values-pl-watch/strings.xml
+++ b/core/res/res/values-pl-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Czujniki"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Połączenie alarmowe"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Aktualizacja systemu Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR-watch/strings.xml b/core/res/res/values-pt-rBR-watch/strings.xml
index dea270b..e06a547 100644
--- a/core/res/res/values-pt-rBR-watch/strings.xml
+++ b/core/res/res/values-pt-rBR-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS de emergência"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Atualização do sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT-watch/strings.xml b/core/res/res/values-pt-rPT-watch/strings.xml
index dea270b..d828e37 100644
--- a/core/res/res/values-pt-rPT-watch/strings.xml
+++ b/core/res/res/values-pt-rPT-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Urgência SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Atualização do sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-watch/strings.xml b/core/res/res/values-pt-watch/strings.xml
index dea270b..e06a547 100644
--- a/core/res/res/values-pt-watch/strings.xml
+++ b/core/res/res/values-pt-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensores"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS de emergência"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Atualização do sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro-watch/strings.xml b/core/res/res/values-ro-watch/strings.xml
index da58726..27f926e 100644
--- a/core/res/res/values-ro-watch/strings.xml
+++ b/core/res/res/values-ro-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzori"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Apel de urgență"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Actualizare de sistem pentru Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru-watch/strings.xml b/core/res/res/values-ru-watch/strings.xml
index b8416c3..fc0d3b7 100644
--- a/core/res/res/values-ru-watch/strings.xml
+++ b/core/res/res/values-ru-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Датчики"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Экстренные вызовы"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Обновление Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si-watch/strings.xml b/core/res/res/values-si-watch/strings.xml
index bab95aa..0017070 100644
--- a/core/res/res/values-si-watch/strings.xml
+++ b/core/res/res/values-si-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"සංවේදක"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"හදිසි SOS උදවු"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS පද්ධති යාවත්කාලීනය"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk-watch/strings.xml b/core/res/res/values-sk-watch/strings.xml
index 6c9d718..790e424 100644
--- a/core/res/res/values-sk-watch/strings.xml
+++ b/core/res/res/values-sk-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Senzory"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Pomoc v tiesni"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Aktualizácia systému Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl-watch/strings.xml b/core/res/res/values-sl-watch/strings.xml
index 0afcaa3..1954f29 100644
--- a/core/res/res/values-sl-watch/strings.xml
+++ b/core/res/res/values-sl-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Tipala"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Nujni primer"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Posodobitev sistema Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sq-watch/strings.xml b/core/res/res/values-sq-watch/strings.xml
index 093d3b1..a35d397 100644
--- a/core/res/res/values-sq-watch/strings.xml
+++ b/core/res/res/values-sq-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorët"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Thirrja e urgjencës"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Përditësimi i sistemit Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr-watch/strings.xml b/core/res/res/values-sr-watch/strings.xml
index 7977f66..edc4a8b 100644
--- a/core/res/res/values-sr-watch/strings.xml
+++ b/core/res/res/values-sr-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Сензори"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Хитна помоћ"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Ажурирање система за Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv-watch/strings.xml b/core/res/res/values-sv-watch/strings.xml
index fa296b6..d3afbf6 100644
--- a/core/res/res/values-sv-watch/strings.xml
+++ b/core/res/res/values-sv-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorer"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS-larm"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Systemuppdatering av Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw-watch/strings.xml b/core/res/res/values-sw-watch/strings.xml
index bf6b2c5..7c4d6970 100644
--- a/core/res/res/values-sw-watch/strings.xml
+++ b/core/res/res/values-sw-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Vihisi"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Vipengele vya Dharura"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Sasisho la mfumo wa Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta-watch/strings.xml b/core/res/res/values-ta-watch/strings.xml
index baaa696..342e46e 100644
--- a/core/res/res/values-ta-watch/strings.xml
+++ b/core/res/res/values-ta-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"உணர்விகள்"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"அவசர உதவி"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS சிஸ்டம் புதுப்பிப்பு"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te-watch/strings.xml b/core/res/res/values-te-watch/strings.xml
index 3a487bd..056733f 100644
--- a/core/res/res/values-te-watch/strings.xml
+++ b/core/res/res/values-te-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"సెన్సార్లు"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ఎమర్జెన్సీ సహాయం"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS సిస్టమ్ అప్డేట్"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th-watch/strings.xml b/core/res/res/values-th-watch/strings.xml
index bc4be24..37fbd63 100644
--- a/core/res/res/values-th-watch/strings.xml
+++ b/core/res/res/values-th-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"เซ็นเซอร์"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS ฉุกเฉิน"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"อัปเดตระบบ Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl-watch/strings.xml b/core/res/res/values-tl-watch/strings.xml
index 961cccf..2213858 100644
--- a/core/res/res/values-tl-watch/strings.xml
+++ b/core/res/res/values-tl-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Mga Sensor"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Emergency SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Pag-update ng system ng Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr-watch/strings.xml b/core/res/res/values-tr-watch/strings.xml
index 19add08..42c543d 100644
--- a/core/res/res/values-tr-watch/strings.xml
+++ b/core/res/res/values-tr-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensörler"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Acil Yardım"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS sistem güncellemesi"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk-watch/strings.xml b/core/res/res/values-uk-watch/strings.xml
index b8416c3..5bcd773 100644
--- a/core/res/res/values-uk-watch/strings.xml
+++ b/core/res/res/values-uk-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Датчики"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Екстрені виклики"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Оновлення системи Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur-watch/strings.xml b/core/res/res/values-ur-watch/strings.xml
index ec1089c..6d6c735 100644
--- a/core/res/res/values-ur-watch/strings.xml
+++ b/core/res/res/values-ur-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"سینسرز"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"ایمرجنسی SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS سسٹم اپ ڈیٹ"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz-watch/strings.xml b/core/res/res/values-uz-watch/strings.xml
index cf1b7a5..93bce9b 100644
--- a/core/res/res/values-uz-watch/strings.xml
+++ b/core/res/res/values-uz-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Sensorlar"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Favqulodda yordam"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS uchun tizim yangilanishi"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi-watch/strings.xml b/core/res/res/values-vi-watch/strings.xml
index 162a223..f4e17f3 100644
--- a/core/res/res/values-vi-watch/strings.xml
+++ b/core/res/res/values-vi-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Cảm biến"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"SOS khẩn cấp"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Bản cập nhật hệ thống Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN-watch/strings.xml b/core/res/res/values-zh-rCN-watch/strings.xml
index d047d8e..470544d 100644
--- a/core/res/res/values-zh-rCN-watch/strings.xml
+++ b/core/res/res/values-zh-rCN-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"传感器"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"紧急求救"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS 系统更新"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK-watch/strings.xml b/core/res/res/values-zh-rHK-watch/strings.xml
index 668061e..456f3cf 100644
--- a/core/res/res/values-zh-rHK-watch/strings.xml
+++ b/core/res/res/values-zh-rHK-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"感應器"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"緊急求救"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS 系統更新"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW-watch/strings.xml b/core/res/res/values-zh-rTW-watch/strings.xml
index 668061e..456f3cf 100644
--- a/core/res/res/values-zh-rTW-watch/strings.xml
+++ b/core/res/res/values-zh-rTW-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"感應器"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"緊急求救"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Wear OS 系統更新"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu-watch/strings.xml b/core/res/res/values-zu-watch/strings.xml
index a19d77f..edb0a6d 100644
--- a/core/res/res/values-zu-watch/strings.xml
+++ b/core/res/res/values-zu-watch/strings.xml
@@ -21,4 +21,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permgrouplab_sensors" msgid="2439544173324807471">"Izinzwa"</string>
+ <string name="global_action_emergency" msgid="2097576936362874627">"Isimo esiphuthumayo se-SOS"</string>
+ <!-- no translation found for reboot_to_update_prepare (4129802024411268230) -->
+ <skip />
+ <string name="reboot_to_update_title" msgid="8043761242418682803">"Isibuyekezo sesistimu ye-Wear OS"</string>
+ <!-- no translation found for select_input_method (1285150113084396451) -->
+ <skip />
</resources>
diff --git a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
index 13ce253..2323527 100644
--- a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
@@ -96,13 +96,28 @@
assertEquals(othr, getSqlStatementType("-- cmt\n SE"));
assertEquals(othr, getSqlStatementType("WITH"));
- // Test the extended statement types.
+ // Verify that leading line-comments are skipped.
+ assertEquals(sel, getSqlStatementType("-- cmt\n SELECT"));
+ assertEquals(sel, getSqlStatementType("-- line 1\n-- line 2\n SELECT"));
+ assertEquals(sel, getSqlStatementType("-- line 1\nSELECT"));
+ // Verify that embedded comments do not confuse the scanner.
+ assertEquals(sel, getSqlStatementType("-- line 1\nSELECT\n-- line 3\n"));
- final int wit = STATEMENT_WITH;
- assertEquals(wit, getSqlStatementTypeExtended("WITH"));
+ // Verify that leading block-comments are skipped.
+ assertEquals(sel, getSqlStatementType("/* foo */SELECT"));
+ assertEquals(sel, getSqlStatementType("/* line 1\n line 2\n*/\nSELECT"));
+ assertEquals(sel, getSqlStatementType("/* UPDATE\nline 2*/\nSELECT"));
+ // Verify that embedded comment characters do not confuse the scanner.
+ assertEquals(sel, getSqlStatementType("/* Foo /* /* // ** */SELECT"));
- final int cmt = STATEMENT_COMMENT;
- assertEquals(cmt, getSqlStatementTypeExtended("-- cmt\n SELECT"));
+ // Mix it up with comment types
+ assertEquals(sel, getSqlStatementType("/* foo */ -- bar\n SELECT"));
+
+ // Test the extended statement types. Note that the STATEMENT_COMMENT type is not possible,
+ // since leading comments are skipped.
+
+ final int with = STATEMENT_WITH;
+ assertEquals(with, getSqlStatementTypeExtended("WITH"));
final int cre = STATEMENT_CREATE;
assertEquals(cre, getSqlStatementTypeExtended("CREATE TABLE t1 (i int)"));
diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java
index 4ee987b..3fc08ee 100644
--- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java
+++ b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java
@@ -39,9 +39,13 @@
import org.junit.runner.RunWith;
import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.Phaser;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -231,4 +235,116 @@
// This exception is expected.
}
}
+
+ /**
+ * Count the number of rows in the database <count> times. The answer must match <expected>
+ * every time. Any errors are reported back to the main thread through the <errors>
+ * array. The ticker forces the database reads to be interleaved with database operations from
+ * the sibling threads.
+ */
+ private void concurrentReadOnlyReader(SQLiteDatabase database, int count, long expected,
+ List<Throwable> errors, Phaser ticker) {
+
+ final String query = "--comment\nSELECT count(*) from t1";
+
+ try {
+ for (int i = count; i > 0; i--) {
+ ticker.arriveAndAwaitAdvance();
+ long r = DatabaseUtils.longForQuery(database, query, null);
+ if (r != expected) {
+ // The type of the exception is not important. Only the message matters.
+ throw new RuntimeException(
+ String.format("concurrentRead expected %d, got %d", expected, r));
+ }
+ }
+ } catch (Throwable t) {
+ errors.add(t);
+ } finally {
+ ticker.arriveAndDeregister();
+ }
+ }
+
+ /**
+ * Insert a new row <count> times. Any errors are reported back to the main thread through
+ * the <errors> array. The ticker forces the database reads to be interleaved with database
+ * operations from the sibling threads.
+ */
+ private void concurrentImmediateWriter(SQLiteDatabase database, int count,
+ List<Throwable> errors, Phaser ticker) {
+ database.beginTransaction();
+ try {
+ int n = 100;
+ for (int i = count; i > 0; i--) {
+ ticker.arriveAndAwaitAdvance();
+ database.execSQL(String.format("INSERT INTO t1 (i) VALUES (%d)", n++));
+ }
+ database.setTransactionSuccessful();
+ } catch (Throwable t) {
+ errors.add(t);
+ } finally {
+ database.endTransaction();
+ ticker.arriveAndDeregister();
+ }
+ }
+
+ /**
+ * This test verifies that a read-only transaction can be started, and it is deferred. A
+ * deferred transaction does not take a database locks until the database is accessed. This
+ * test verifies that the implicit connection selection process correctly identifies
+ * read-only transactions even when they are preceded by a comment.
+ */
+ @Test
+ public void testReadOnlyTransaction() throws Exception {
+ // Enable WAL for concurrent read and write transactions.
+ mDatabase.enableWriteAheadLogging();
+
+ // Create the t1 table and put some data in it.
+ mDatabase.beginTransaction();
+ try {
+ mDatabase.execSQL("CREATE TABLE t1 (i int);");
+ mDatabase.execSQL("INSERT INTO t1 (i) VALUES (2)");
+ mDatabase.execSQL("INSERT INTO t1 (i) VALUES (3)");
+ mDatabase.setTransactionSuccessful();
+ } finally {
+ mDatabase.endTransaction();
+ }
+
+ // Threads install errors in this array.
+ final List<Throwable> errors = Collections.synchronizedList(new ArrayList<Throwable>());
+
+ // This forces the read and write threads to execute in a lock-step, round-robin fashion.
+ Phaser ticker = new Phaser(3);
+
+ // Create three threads that will perform transactions. One thread is a writer and two
+ // are readers. The intent is that the readers begin before the writer commits, so the
+ // readers always see a database with two rows.
+ Thread readerA = new Thread(() -> {
+ concurrentReadOnlyReader(mDatabase, 4, 2, errors, ticker);
+ });
+ Thread readerB = new Thread(() -> {
+ concurrentReadOnlyReader(mDatabase, 4, 2, errors, ticker);
+ });
+ Thread writerC = new Thread(() -> {
+ concurrentImmediateWriter(mDatabase, 4, errors, ticker);
+ });
+
+ readerA.start();
+ readerB.start();
+ writerC.start();
+
+ // All three threads should have completed. Give the total set 1s. The 10ms delay for
+ // the second and third threads is just a small, positive number.
+ readerA.join(1000);
+ assertFalse(readerA.isAlive());
+ readerB.join(10);
+ assertFalse(readerB.isAlive());
+ writerC.join(10);
+ assertFalse(writerC.isAlive());
+
+ // The writer added 4 rows to the database.
+ long r = DatabaseUtils.longForQuery(mDatabase, "SELECT count(*) from t1", null);
+ assertEquals(6, r);
+
+ assertTrue("ReadThread failed with errors: " + errors, errors.isEmpty());
+ }
}
diff --git a/framework-minus-apex-ravenwood-policies.txt b/framework-minus-apex-ravenwood-policies.txt
index 6bac58b..8e76fd2 100644
--- a/framework-minus-apex-ravenwood-policies.txt
+++ b/framework-minus-apex-ravenwood-policies.txt
@@ -1 +1,91 @@
# Ravenwood "policy" file for framework-minus-apex.
+
+# Collections
+class android.util.ArrayMap stubclass
+class android.util.ArraySet stubclass
+class android.util.LongSparseArray stubclass
+class android.util.SparseArrayMap stubclass
+class android.util.SparseArray stubclass
+class android.util.SparseBooleanArray stubclass
+class android.util.SparseIntArray stubclass
+class android.util.SparseLongArray stubclass
+class android.util.ContainerHelpers stubclass
+class android.util.EmptyArray stubclass
+class android.util.MapCollections stubclass
+
+# Logging
+class android.util.Log stubclass
+class android.util.Log !com.android.hoststubgen.nativesubstitution.Log_host
+class android.util.LogPrinter stubclass
+
+# String Manipulation
+class android.util.Printer stubclass
+class android.util.PrintStreamPrinter stubclass
+class android.util.PrintWriterPrinter stubclass
+class android.util.StringBuilderPrinter stubclass
+
+# Properties
+class android.util.Property stubclass
+class android.util.FloatProperty stubclass
+class android.util.IntProperty stubclass
+class android.util.NoSuchPropertyException stubclass
+class android.util.ReflectiveProperty stubclass
+
+# Exceptions
+class android.util.AndroidException stubclass
+class android.util.AndroidRuntimeException stubclass
+
+# JSON
+class android.util.JsonReader stubclass
+class android.util.JsonWriter stubclass
+class android.util.MalformedJsonException stubclass
+
+# Base64
+class android.util.Base64 stubclass
+class android.util.Base64DataException stubclass
+class android.util.Base64InputStream stubclass
+class android.util.Base64OutputStream stubclass
+
+# Data Holders
+class android.util.MutableFloat stubclass
+class android.util.MutableShort stubclass
+class android.util.MutableBoolean stubclass
+class android.util.MutableByte stubclass
+class android.util.MutableChar stubclass
+class android.util.MutableDouble stubclass
+class android.util.Pair stubclass
+class android.util.Range stubclass
+class android.util.Rational stubclass
+class android.util.Size stubclass
+class android.util.SizeF stubclass
+
+# Proto
+class android.util.proto.EncodedBuffer stubclass
+class android.util.proto.ProtoInputStream stubclass
+class android.util.proto.ProtoOutputStream stubclass
+class android.util.proto.ProtoParseException stubclass
+class android.util.proto.ProtoStream stubclass
+class android.util.proto.ProtoUtils stubclass
+class android.util.proto.WireTypeMismatchException stubclass
+
+# Misc
+class android.util.Dumpable stubclass
+class android.util.DebugUtils stubclass
+class android.util.UtilConfig stubclass
+class android.util.Patterns stubclass
+
+# Internals
+class com.android.internal.util.ArrayUtils stubclass
+ method newUnpaddedByteArray (I)[B @newUnpaddedByteArray$ravenwood
+ method newUnpaddedCharArray (I)[C @newUnpaddedCharArray$ravenwood
+ method newUnpaddedIntArray (I)[I @newUnpaddedIntArray$ravenwood
+ method newUnpaddedBooleanArray (I)[Z @newUnpaddedBooleanArray$ravenwood
+ method newUnpaddedLongArray (I)[J @newUnpaddedLongArray$ravenwood
+ method newUnpaddedFloatArray (I)[F @newUnpaddedFloatArray$ravenwood
+ method newUnpaddedObjectArray (I)[Ljava/lang/Object; @newUnpaddedObjectArray$ravenwood
+ method newUnpaddedArray (Ljava/lang/Class;I)[Ljava/lang/Object; @newUnpaddedArray$ravenwood
+
+class com.android.internal.util.GrowingArrayUtils stubclass
+class com.android.internal.util.LineBreakBufferedWriter stubclass
+class com.android.internal.util.Preconditions stubclass
+class com.android.internal.util.StringPool stubclass
diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
index d2360e9..657720e 100644
--- a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
+++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
@@ -21,7 +21,7 @@
<solid
android:color="?androidprv:attr/materialColorSurfaceContainerHigh"
/>
- <corners android:radius="20dp" />
+ <corners android:radius="18sp" />
<padding
android:left="20dp"
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 55a9132..de9d2a2 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -185,10 +185,11 @@
<dimen name="bubble_pointer_overlap">1dp</dimen>
<!-- Extra padding around the dismiss target for bubbles -->
<dimen name="bubble_dismiss_slop">16dp</dimen>
- <!-- Height of button allowing users to adjust settings for bubbles. -->
- <dimen name="bubble_manage_button_height">36dp</dimen>
- <!-- Height of manage button including margins. -->
- <dimen name="bubble_manage_button_total_height">68dp</dimen>
+ <!-- Height of button allowing users to adjust settings for bubbles. We use sp so that the
+ button can scale with the font size. -->
+ <dimen name="bubble_manage_button_height">36sp</dimen>
+ <!-- Touch area height of the manage button. -->
+ <dimen name="bubble_manage_button_touch_area_height">48dp</dimen>
<!-- The margin around the outside of the manage button. -->
<dimen name="bubble_manage_button_margin">16dp</dimen>
<!-- Height of an item in the bubble manage menu. -->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/Interpolators.java b/libs/WindowManager/Shell/src/com/android/wm/shell/animation/Interpolators.java
index 880579d..2ec9e8b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/Interpolators.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/animation/Interpolators.java
@@ -88,8 +88,6 @@
public static final PathInterpolator DIM_INTERPOLATOR =
new PathInterpolator(.23f, .87f, .52f, -0.11f);
- public static final Interpolator DECELERATE = new PathInterpolator(0f, 0f, 0.5f, 1f);
-
// Create the default emphasized interpolator
private static PathInterpolator createEmphasizedInterpolator() {
Path path = new Path();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
index 8ec297e..5a15674 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
@@ -89,7 +89,6 @@
private final PointF mInitialTouchPos = new PointF();
private final Interpolator mPostAnimationInterpolator = Interpolators.EMPHASIZED;
- private final Interpolator mYMovementInterpolator = Interpolators.DECELERATE;
private final Interpolator mProgressInterpolator = new DecelerateInterpolator();
private final Matrix mTransformMatrix = new Matrix();
@@ -164,7 +163,7 @@
float yDirection = rawYDelta < 0 ? -1 : 1;
// limit yDelta interpretation to 1/2 of screen height in either direction
float deltaYRatio = Math.min(height / 2f, Math.abs(rawYDelta)) / (height / 2f);
- float interpolatedYRatio = mYMovementInterpolator.getInterpolation(deltaYRatio);
+ float interpolatedYRatio = mProgressInterpolator.getInterpolation(deltaYRatio);
// limit y-shift so surface never passes 8dp screen margin
float deltaY = yDirection * interpolatedYRatio * Math.max(0f,
(height - scaledHeight) / 2f - mVerticalMargin);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
index 312e88d..dc65919 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
@@ -34,6 +34,9 @@
@Qualifier
public @interface ReturnToHome {}
+ @Qualifier
+ public @interface DialogClose {}
+
/** Retrieve the {@link BackAnimationRunner} associated with this animation. */
public abstract BackAnimationRunner getRunner();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
index 62b18f3..26d2097 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
@@ -33,17 +33,22 @@
public ShellBackAnimationRegistry(
@ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation,
@ShellBackAnimation.CrossTask @Nullable ShellBackAnimation crossTaskAnimation,
+ @ShellBackAnimation.DialogClose @Nullable ShellBackAnimation dialogCloseAnimation,
@ShellBackAnimation.CustomizeActivity @Nullable
ShellBackAnimation customizeActivityAnimation,
@ShellBackAnimation.ReturnToHome @Nullable
ShellBackAnimation defaultBackToHomeAnimation) {
if (crossActivityAnimation != null) {
mAnimationDefinition.set(
+ BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner());
+ }
+ if (crossTaskAnimation != null) {
+ mAnimationDefinition.set(
BackNavigationInfo.TYPE_CROSS_TASK, crossTaskAnimation.getRunner());
}
- if (crossActivityAnimation != null) {
+ if (dialogCloseAnimation != null) {
mAnimationDefinition.set(
- BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner());
+ BackNavigationInfo.TYPE_DIALOG_CLOSE, dialogCloseAnimation.getRunner());
}
if (defaultBackToHomeAnimation != null) {
mAnimationDefinition.set(
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 0568eda..c7ab6aa 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
@@ -57,6 +57,7 @@
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
+import android.view.TouchDelegate;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
@@ -470,6 +471,17 @@
R.layout.bubble_manage_button, this /* parent */, false /* attach */);
addView(mManageButton);
mManageButton.setVisibility(visibility);
+ post(() -> {
+ int touchAreaHeight =
+ getResources().getDimensionPixelSize(
+ R.dimen.bubble_manage_button_touch_area_height);
+ Rect r = new Rect();
+ mManageButton.getHitRect(r);
+ int extraTouchArea = (touchAreaHeight - r.height()) / 2;
+ r.top -= extraTouchArea;
+ r.bottom += extraTouchArea;
+ setTouchDelegate(new TouchDelegate(r, mManageButton));
+ });
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index 17e06e9..144c456 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -198,9 +198,10 @@
mPointerHeight = res.getDimensionPixelSize(R.dimen.bubble_pointer_height);
mPointerMargin = res.getDimensionPixelSize(R.dimen.bubble_pointer_margin);
mPointerOverlap = res.getDimensionPixelSize(R.dimen.bubble_pointer_overlap);
- mManageButtonHeightIncludingMargins =
- res.getDimensionPixelSize(R.dimen.bubble_manage_button_total_height);
mManageButtonHeight = res.getDimensionPixelSize(R.dimen.bubble_manage_button_height);
+ mManageButtonHeightIncludingMargins =
+ mManageButtonHeight
+ + 2 * res.getDimensionPixelSize(R.dimen.bubble_manage_button_margin);
mExpandedViewMinHeight = res.getDimensionPixelSize(R.dimen.bubble_expanded_default_height);
mOverflowHeight = res.getDimensionPixelSize(R.dimen.bubble_overflow_height);
mMinimumFlyoutWidthLargeScreen = res.getDimensionPixelSize(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index 64294c9..beae96e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -646,11 +646,12 @@
@Provides
static KeyguardTransitionHandler provideKeyguardTransitionHandler(
ShellInit shellInit,
+ ShellController shellController,
Transitions transitions,
@ShellMainThread Handler mainHandler,
@ShellMainThread ShellExecutor mainExecutor) {
return new KeyguardTransitionHandler(
- shellInit, transitions, mainHandler, mainExecutor);
+ shellInit, shellController, transitions, mainHandler, mainExecutor);
}
@WMSingleton
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java
index b34c6b2..3be7d97 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java
@@ -38,6 +38,7 @@
return new ShellBackAnimationRegistry(
crossActivity,
crossTask,
+ /* dialogCloseAnimation */ null,
customizeActivity,
/* defaultBackToHomeAnimation= */ null);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
index dba7f4b..0890861 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
@@ -50,6 +50,8 @@
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.sysui.KeyguardChangeListener;
+import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions.TransitionFinishCallback;
@@ -59,10 +61,12 @@
*
* <p>This takes the highest priority.
*/
-public class KeyguardTransitionHandler implements Transitions.TransitionHandler {
+public class KeyguardTransitionHandler
+ implements Transitions.TransitionHandler, KeyguardChangeListener {
private static final String TAG = "KeyguardTransition";
private final Transitions mTransitions;
+ private final ShellController mShellController;
private final Handler mMainHandler;
private final ShellExecutor mMainExecutor;
@@ -81,6 +85,9 @@
// transition.
private boolean mIsLaunchingActivityOverLockscreen;
+ // Last value reported by {@link KeyguardChangeListener}.
+ private boolean mKeyguardShowing = true;
+
private final class StartedTransition {
final TransitionInfo mInfo;
final SurfaceControl.Transaction mFinishT;
@@ -93,12 +100,15 @@
mPlayer = player;
}
}
+
public KeyguardTransitionHandler(
@NonNull ShellInit shellInit,
+ @NonNull ShellController shellController,
@NonNull Transitions transitions,
@NonNull Handler mainHandler,
@NonNull ShellExecutor mainExecutor) {
mTransitions = transitions;
+ mShellController = shellController;
mMainHandler = mainHandler;
mMainExecutor = mainExecutor;
shellInit.addInitCallback(this::onInit, this);
@@ -106,6 +116,7 @@
private void onInit() {
mTransitions.addHandler(this);
+ mShellController.addKeyguardChangeListener(this);
}
/**
@@ -121,6 +132,16 @@
}
@Override
+ public void onKeyguardVisibilityChanged(
+ boolean visible, boolean occluded, boolean animatingDismiss) {
+ mKeyguardShowing = visible;
+ }
+
+ public boolean isKeyguardShowing() {
+ return mKeyguardShowing;
+ }
+
+ @Override
public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
index c20d23e..271a3b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
@@ -64,6 +64,7 @@
import com.android.wm.shell.util.TransitionUtil;
import java.util.ArrayList;
+import java.util.function.Consumer;
/**
* Handles the Recents (overview) animation. Only one of these can run at a time. A recents
@@ -130,21 +131,21 @@
wct.sendPendingIntent(intent, fillIn, options);
final RecentsController controller = new RecentsController(listener);
RecentsMixedHandler mixer = null;
- Transitions.TransitionHandler mixedHandler = null;
+ Consumer<IBinder> setTransitionForMixer = null;
for (int i = 0; i < mMixers.size(); ++i) {
- mixedHandler = mMixers.get(i).handleRecentsRequest(wct);
- if (mixedHandler != null) {
+ setTransitionForMixer = mMixers.get(i).handleRecentsRequest(wct);
+ if (setTransitionForMixer != null) {
mixer = mMixers.get(i);
break;
}
}
final IBinder transition = mTransitions.startTransition(TRANSIT_TO_FRONT, wct,
- mixedHandler == null ? this : mixedHandler);
+ mixer == null ? this : mixer);
for (int i = 0; i < mStateListeners.size(); i++) {
mStateListeners.get(i).onTransitionStarted(transition);
}
if (mixer != null) {
- mixer.setRecentsTransition(transition);
+ setTransitionForMixer.accept(transition);
}
if (transition != null) {
controller.setTransition(transition);
@@ -589,6 +590,13 @@
cancel("transit_sleep");
return;
}
+ if (mKeyguardLocked) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
+ "[%d] RecentsController.merge: keyguard is locked", mInstanceId);
+ // We will not accept new changes if we are swiping over the keyguard.
+ cancel(true /* toHome */, false /* withScreenshots */, "keyguard_locked");
+ return;
+ }
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
"[%d] RecentsController.merge", mInstanceId);
// Keep all tasks in one list because order matters.
@@ -1105,22 +1113,17 @@
* An interface for a mixed handler to receive information about recents requests (since these
* come into this handler directly vs from WMCore request).
*/
- public interface RecentsMixedHandler {
+ public interface RecentsMixedHandler extends Transitions.TransitionHandler {
/**
* Called when a recents request comes in. The handler can add operations to outWCT. If
- * the handler wants to "accept" the transition, it should return itself; otherwise, it
- * should return `null`.
+ * the handler wants to "accept" the transition, it should return a Consumer accepting the
+ * IBinder for the transition. If not, it should return `null`.
*
* If a mixed-handler accepts this recents, it will be the de-facto handler for this
* transition and is required to call the associated {@link #startAnimation},
* {@link #mergeAnimation}, and {@link #onTransitionConsumed} methods.
*/
- Transitions.TransitionHandler handleRecentsRequest(WindowContainerTransaction outWCT);
-
- /**
- * Reports the transition token associated with the accepted recents request. If there was
- * a problem starting the request, this will be called with `null`.
- */
- void setRecentsTransition(@Nullable IBinder transition);
+ @Nullable
+ Consumer<IBinder> handleRecentsRequest(WindowContainerTransaction outWCT);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
index 918a5a4..ce7fef2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
@@ -23,6 +23,7 @@
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_PIP;
import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING;
import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
@@ -37,11 +38,13 @@
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.os.IBinder;
+import android.util.ArrayMap;
import android.util.Pair;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
+import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import com.android.internal.protolog.common.ProtoLog;
@@ -61,7 +64,9 @@
import com.android.wm.shell.util.TransitionUtil;
import java.util.ArrayList;
+import java.util.Map;
import java.util.Optional;
+import java.util.function.Consumer;
/**
* A handler for dealing with transitions involving multiple other handlers. For example: an
@@ -79,7 +84,7 @@
private UnfoldTransitionHandler mUnfoldHandler;
private ActivityEmbeddingController mActivityEmbeddingController;
- private static class MixedTransition {
+ private class MixedTransition {
static final int TYPE_ENTER_PIP_FROM_SPLIT = 1;
/** Both the display and split-state (enter/exit) is changing */
@@ -94,14 +99,17 @@
/** Keyguard exit/occlude/unocclude transition. */
static final int TYPE_KEYGUARD = 5;
+ /** Recents transition on top of the lock screen. */
+ static final int TYPE_RECENTS_DURING_KEYGUARD = 6;
+
/** Recents Transition while in desktop mode. */
- static final int TYPE_RECENTS_DURING_DESKTOP = 6;
+ static final int TYPE_RECENTS_DURING_DESKTOP = 7;
/** Fold/Unfold transition. */
- static final int TYPE_UNFOLD = 7;
+ static final int TYPE_UNFOLD = 8;
/** Enter pip from one of the Activity Embedding windows. */
- static final int TYPE_ENTER_PIP_FROM_ACTIVITY_EMBEDDING = 8;
+ static final int TYPE_ENTER_PIP_FROM_ACTIVITY_EMBEDDING = 9;
/** The default animation for this mixed transition. */
static final int ANIM_TYPE_DEFAULT = 0;
@@ -117,7 +125,10 @@
final IBinder mTransition;
Transitions.TransitionHandler mLeftoversHandler = null;
+ TransitionInfo mInfo = null;
WindowContainerTransaction mFinishWCT = null;
+ SurfaceControl.Transaction mFinishT = null;
+ Transitions.TransitionFinishCallback mFinishCB = null;
/**
* Whether the transition has request for remote transition while mLeftoversHandler
@@ -138,6 +149,37 @@
mTransition = transition;
}
+ boolean startSubAnimation(Transitions.TransitionHandler handler, TransitionInfo info,
+ SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT) {
+ if (mInfo != null) {
+ ProtoLog.d(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
+ "startSubAnimation #%d.%d", mInfo.getDebugId(), info.getDebugId());
+ }
+ mInFlightSubAnimations++;
+ if (!handler.startAnimation(
+ mTransition, info, startT, finishT, wct -> onSubAnimationFinished(info, wct))) {
+ mInFlightSubAnimations--;
+ return false;
+ }
+ return true;
+ }
+
+ void onSubAnimationFinished(TransitionInfo info, WindowContainerTransaction wct) {
+ mInFlightSubAnimations--;
+ if (mInfo != null) {
+ ProtoLog.d(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
+ "onSubAnimationFinished #%d.%d remaining=%d",
+ mInfo.getDebugId(), info.getDebugId(), mInFlightSubAnimations);
+ }
+
+ joinFinishArgs(wct);
+
+ if (mInFlightSubAnimations == 0) {
+ mActiveTransitions.remove(MixedTransition.this);
+ mFinishCB.onTransitionFinished(mFinishWCT);
+ }
+ }
+
void joinFinishArgs(WindowContainerTransaction wct) {
if (wct != null) {
if (mFinishWCT == null) {
@@ -271,39 +313,46 @@
}
@Override
- public Transitions.TransitionHandler handleRecentsRequest(WindowContainerTransaction outWCT) {
+ public Consumer<IBinder> handleRecentsRequest(WindowContainerTransaction outWCT) {
if (mRecentsHandler != null) {
if (mSplitHandler.isSplitScreenVisible()) {
- return this;
+ return this::setRecentsTransitionDuringSplit;
+ } else if (mKeyguardHandler.isKeyguardShowing()) {
+ return this::setRecentsTransitionDuringKeyguard;
} else if (mDesktopTasksController != null
// Check on the default display. Recents/gesture nav is only available there
&& mDesktopTasksController.getVisibleTaskCount(DEFAULT_DISPLAY) > 0) {
- return this;
+ return this::setRecentsTransitionDuringDesktop;
}
}
return null;
}
- @Override
- public void setRecentsTransition(IBinder transition) {
- if (mSplitHandler.isSplitScreenVisible()) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
- + "Split-Screen is foreground, so treat it as Mixed.");
- final MixedTransition mixed = new MixedTransition(
- MixedTransition.TYPE_RECENTS_DURING_SPLIT, transition);
- mixed.mLeftoversHandler = mRecentsHandler;
- mActiveTransitions.add(mixed);
- } else if (DesktopModeStatus.isEnabled()) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
- + "desktop mode is active, so treat it as Mixed.");
- final MixedTransition mixed = new MixedTransition(
- MixedTransition.TYPE_RECENTS_DURING_DESKTOP, transition);
- mixed.mLeftoversHandler = mRecentsHandler;
- mActiveTransitions.add(mixed);
- } else {
- throw new IllegalStateException("Accepted a recents transition but don't know how to"
- + " handle it");
- }
+ private void setRecentsTransitionDuringSplit(IBinder transition) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
+ + "Split-Screen is foreground, so treat it as Mixed.");
+ final MixedTransition mixed = new MixedTransition(
+ MixedTransition.TYPE_RECENTS_DURING_SPLIT, transition);
+ mixed.mLeftoversHandler = mRecentsHandler;
+ mActiveTransitions.add(mixed);
+ }
+
+ private void setRecentsTransitionDuringKeyguard(IBinder transition) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
+ + "keyguard is visible, so treat it as Mixed.");
+ final MixedTransition mixed = new MixedTransition(
+ MixedTransition.TYPE_RECENTS_DURING_KEYGUARD, transition);
+ mixed.mLeftoversHandler = mRecentsHandler;
+ mActiveTransitions.add(mixed);
+ }
+
+ private void setRecentsTransitionDuringDesktop(IBinder transition) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
+ + "desktop mode is active, so treat it as Mixed.");
+ final MixedTransition mixed = new MixedTransition(
+ MixedTransition.TYPE_RECENTS_DURING_DESKTOP, transition);
+ mixed.mLeftoversHandler = mRecentsHandler;
+ mActiveTransitions.add(mixed);
}
private TransitionInfo subCopy(@NonNull TransitionInfo info,
@@ -410,6 +459,9 @@
} else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
return animateKeyguard(mixed, info, startTransaction, finishTransaction,
finishCallback);
+ } else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_KEYGUARD) {
+ return animateRecentsDuringKeyguard(mixed, info, startTransaction, finishTransaction,
+ finishCallback);
} else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_DESKTOP) {
return animateRecentsDuringDesktop(mixed, info, startTransaction, finishTransaction,
finishCallback);
@@ -764,24 +816,28 @@
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull Transitions.TransitionFinishCallback finishCallback) {
- final Transitions.TransitionFinishCallback finishCB = (wct) -> {
- mixed.mInFlightSubAnimations--;
- if (mixed.mInFlightSubAnimations == 0) {
- mActiveTransitions.remove(mixed);
- finishCallback.onTransitionFinished(wct);
- }
- };
- mixed.mInFlightSubAnimations++;
+ if (mixed.mFinishT == null) {
+ mixed.mFinishT = finishTransaction;
+ mixed.mFinishCB = finishCallback;
+ }
// Sync pip state.
if (mPipHandler != null) {
mPipHandler.syncPipSurfaceState(info, startTransaction, finishTransaction);
}
- if (!mKeyguardHandler.startAnimation(
- mixed.mTransition, info, startTransaction, finishTransaction, finishCB)) {
- mixed.mInFlightSubAnimations--;
- return false;
+ return mixed.startSubAnimation(mKeyguardHandler, info, startTransaction, finishTransaction);
+ }
+
+ private boolean animateRecentsDuringKeyguard(@NonNull final MixedTransition mixed,
+ @NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction startTransaction,
+ @NonNull SurfaceControl.Transaction finishTransaction,
+ @NonNull Transitions.TransitionFinishCallback finishCallback) {
+ if (mixed.mInfo == null) {
+ mixed.mInfo = info;
+ mixed.mFinishT = finishTransaction;
+ mixed.mFinishCB = finishCallback;
}
- return true;
+ return mixed.startSubAnimation(mRecentsHandler, info, startTransaction, finishTransaction);
}
private boolean animateRecentsDuringDesktop(@NonNull final MixedTransition mixed,
@@ -905,6 +961,15 @@
finishCallback);
} else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
mKeyguardHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback);
+ } else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_KEYGUARD) {
+ if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_UNOCCLUDING) != 0) {
+ handoverTransitionLeashes(mixed, info, t, mixed.mFinishT);
+ if (animateKeyguard(mixed, info, t, mixed.mFinishT, mixed.mFinishCB)) {
+ finishCallback.onTransitionFinished(null);
+ }
+ }
+ mixed.mLeftoversHandler.mergeAnimation(transition, info, t, mergeTarget,
+ finishCallback);
} else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_DESKTOP) {
mixed.mLeftoversHandler.mergeAnimation(transition, info, t, mergeTarget,
finishCallback);
@@ -947,4 +1012,38 @@
mPlayer.getRemoteTransitionHandler().onTransitionConsumed(transition, aborted, finishT);
}
}
+
+ /**
+ * Update an incoming {@link TransitionInfo} with the leashes from an ongoing
+ * {@link MixedTransition} so that it can take over some parts of the animation without
+ * reparenting to new transition roots.
+ */
+ private static void handoverTransitionLeashes(@NonNull MixedTransition mixed,
+ @NonNull TransitionInfo info,
+ @NonNull SurfaceControl.Transaction startT,
+ @NonNull SurfaceControl.Transaction finishT) {
+
+ // Show the roots in case they contain new changes not present in the original transition.
+ for (int j = info.getRootCount() - 1; j >= 0; --j) {
+ startT.show(info.getRoot(j).getLeash());
+ }
+
+ // Find all of the leashes from the original transition.
+ Map<WindowContainerToken, TransitionInfo.Change> originalChanges = new ArrayMap<>();
+ for (TransitionInfo.Change oldChange : mixed.mInfo.getChanges()) {
+ if (oldChange.getContainer() != null) {
+ originalChanges.put(oldChange.getContainer(), oldChange);
+ }
+ }
+
+ // Merge the animation leashes by re-using the original ones if we see the same container
+ // in the new transition and the old.
+ for (TransitionInfo.Change newChange : info.getChanges()) {
+ if (originalChanges.containsKey(newChange.getContainer())) {
+ final TransitionInfo.Change oldChange = originalChanges.get(newChange.getContainer());
+ startT.reparent(newChange.getLeash(), null);
+ newChange.setLeash(oldChange.getLeash());
+ }
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
index 030f601..4355ed2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
@@ -83,7 +83,6 @@
mMainExecutor.execute(() -> {
finishCallback.onTransitionFinished(wct);
});
- Log.d("b/302551868", "OneShotRemoteHandler#start remote anim null");
mRemote = null;
}
};
@@ -107,7 +106,6 @@
mRemote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
}
finishCallback.onTransitionFinished(null /* wct */);
- Log.d("b/302551868", "OneShotRemoteHandler#exception remote anim null");
mRemote = null;
}
return true;
@@ -127,7 +125,6 @@
// so just assume the worst-case and clear the local transaction.
t.clear();
mMainExecutor.execute(() -> finishCallback.onTransitionFinished(wct));
- Log.d("b/302551868", "OneShotRemoteHandler#merge remote anim null");
mRemote = null;
}
};
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
index 6cf5450..a67fd37 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
@@ -132,8 +132,9 @@
new ShellBackAnimationRegistry(
new CrossActivityAnimation(mContext, mAnimationBackground),
new CrossTaskBackAnimation(mContext, mAnimationBackground),
+ /* dialogCloseAnimation= */ null,
new CustomizeActivityAnimation(mContext, mAnimationBackground),
- null);
+ /* defaultBackToHomeAnimation= */ null);
mController =
new BackAnimationController(
mShellInit,
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index ef4dce5..caffdfc 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -17,18 +17,18 @@
#ifndef ANDROID_GRAPHICS_PAINT_H_
#define ANDROID_GRAPHICS_PAINT_H_
+#include "Typeface.h"
+
+#include <cutils/compiler.h>
+
#include <SkFont.h>
#include <SkPaint.h>
#include <SkSamplingOptions.h>
-#include <cutils/compiler.h>
-#include <minikin/FamilyVariant.h>
-#include <minikin/FontFamily.h>
-#include <minikin/FontFeature.h>
-#include <minikin/Hyphenator.h>
-
#include <string>
-#include "Typeface.h"
+#include <minikin/FontFamily.h>
+#include <minikin/FamilyVariant.h>
+#include <minikin/Hyphenator.h>
namespace android {
@@ -82,15 +82,11 @@
float getWordSpacing() const { return mWordSpacing; }
- void setFontFeatureSettings(std::string_view fontFeatures) {
- mFontFeatureSettings = minikin::FontFeature::parse(fontFeatures);
+ void setFontFeatureSettings(const std::string& fontFeatureSettings) {
+ mFontFeatureSettings = fontFeatureSettings;
}
- void resetFontFeatures() { mFontFeatureSettings.clear(); }
-
- const std::vector<minikin::FontFeature>& getFontFeatureSettings() const {
- return mFontFeatureSettings;
- }
+ std::string getFontFeatureSettings() const { return mFontFeatureSettings; }
void setMinikinLocaleListId(uint32_t minikinLocaleListId) {
mMinikinLocaleListId = minikinLocaleListId;
@@ -174,7 +170,7 @@
float mLetterSpacing = 0;
float mWordSpacing = 0;
- std::vector<minikin::FontFeature> mFontFeatureSettings;
+ std::string mFontFeatureSettings;
uint32_t mMinikinLocaleListId;
std::optional<minikin::FamilyVariant> mFamilyVariant;
uint32_t mHyphenEdit = 0;
diff --git a/libs/hwui/jni/Paint.cpp b/libs/hwui/jni/Paint.cpp
index d84b73d..8c71d6f 100644
--- a/libs/hwui/jni/Paint.cpp
+++ b/libs/hwui/jni/Paint.cpp
@@ -33,7 +33,6 @@
#include <cassert>
#include <cstring>
#include <memory>
-#include <string_view>
#include <vector>
#include "ColorFilter.h"
@@ -691,11 +690,10 @@
jstring settings) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
if (!settings) {
- paint->resetFontFeatures();
+ paint->setFontFeatureSettings(std::string());
} else {
ScopedUtfChars settingsChars(env, settings);
- paint->setFontFeatureSettings(
- std::string_view(settingsChars.c_str(), settingsChars.size()));
+ paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size()));
}
}
diff --git a/location/api/lint-baseline.txt b/location/api/lint-baseline.txt
new file mode 100644
index 0000000..5e3ef01
--- /dev/null
+++ b/location/api/lint-baseline.txt
@@ -0,0 +1,27 @@
+// Baseline format: 1.0
+RequiresPermission: android.location.LocationManager#addGpsStatusListener(android.location.GpsStatus.Listener):
+ Method 'addGpsStatusListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(java.util.concurrent.Executor, android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addProximityAlert(double, double, float, long, android.app.PendingIntent):
+ Method 'addProximityAlert' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementRequest, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback, android.os.Handler):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback, android.os.Handler):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(java.util.concurrent.Executor, android.location.GnssNavigationMessage.Callback):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback, android.os.Handler):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
diff --git a/location/api/module-lib-lint-baseline.txt b/location/api/module-lib-lint-baseline.txt
index 7cd6a86..3b1be7db 100644
--- a/location/api/module-lib-lint-baseline.txt
+++ b/location/api/module-lib-lint-baseline.txt
@@ -1,4 +1,36 @@
// Baseline format: 1.0
+RequiresPermission: android.location.LocationManager#addGpsStatusListener(android.location.GpsStatus.Listener):
+ Method 'addGpsStatusListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(java.util.concurrent.Executor, android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addProximityAlert(double, double, float, long, android.app.PendingIntent):
+ Method 'addProximityAlert' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#injectGnssMeasurementCorrections(android.location.GnssMeasurementCorrections):
+ Method 'injectGnssMeasurementCorrections' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementRequest, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback, android.os.Handler):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssRequest, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback, android.os.Handler):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(java.util.concurrent.Executor, android.location.GnssNavigationMessage.Callback):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback, android.os.Handler):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+
+
SamShouldBeLast: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
SAM-compatible parameters (such as parameter 1, "listener", in android.location.LocationManager.addNmeaListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper):
diff --git a/location/api/system-lint-baseline.txt b/location/api/system-lint-baseline.txt
index 043a082..066a40a 100644
--- a/location/api/system-lint-baseline.txt
+++ b/location/api/system-lint-baseline.txt
@@ -1,4 +1,36 @@
// Baseline format: 1.0
+RequiresPermission: android.location.LocationManager#addGpsStatusListener(android.location.GpsStatus.Listener):
+ Method 'addGpsStatusListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addNmeaListener(java.util.concurrent.Executor, android.location.OnNmeaMessageListener):
+ Method 'addNmeaListener' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#addProximityAlert(double, double, float, long, android.app.PendingIntent):
+ Method 'addProximityAlert' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#injectGnssMeasurementCorrections(android.location.GnssMeasurementCorrections):
+ Method 'injectGnssMeasurementCorrections' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementRequest, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback, android.os.Handler):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(android.location.GnssRequest, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssMeasurementsCallback(java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
+ Method 'registerGnssMeasurementsCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback, android.os.Handler):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssNavigationMessageCallback(java.util.concurrent.Executor, android.location.GnssNavigationMessage.Callback):
+ Method 'registerGnssNavigationMessageCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(android.location.GnssStatus.Callback, android.os.Handler):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+RequiresPermission: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback):
+ Method 'registerGnssStatusCallback' documentation mentions permissions already declared by @RequiresPermission
+
+
SamShouldBeLast: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
SAM-compatible parameters (such as parameter 1, "listener", in android.location.LocationManager.addNmeaListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper):
diff --git a/media/tests/projection/Android.bp b/media/tests/projection/Android.bp
index 48cd8b6..c9a8864 100644
--- a/media/tests/projection/Android.bp
+++ b/media/tests/projection/Android.bp
@@ -26,6 +26,7 @@
"androidx.test.runner",
"androidx.test.rules",
"androidx.test.ext.junit",
+ "frameworks-base-testutils",
"mockito-target-extended-minus-junit4",
"platform-test-annotations",
"testng",
diff --git a/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java b/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
index 4952e01..774de5f 100644
--- a/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
+++ b/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
@@ -16,7 +16,11 @@
package android.media.projection;
+import static android.Manifest.permission.MANAGE_MEDIA_PROJECTION;
+
+import android.annotation.EnforcePermission;
import android.os.IBinder;
+import android.os.PermissionEnforcer;
import android.os.RemoteException;
/**
@@ -28,6 +32,10 @@
IBinder mLaunchCookie = null;
IMediaProjectionCallback mIMediaProjectionCallback = null;
+ FakeIMediaProjection(PermissionEnforcer enforcer) {
+ super(enforcer);
+ }
+
@Override
public void start(IMediaProjectionCallback callback) throws RemoteException {
mIMediaProjectionCallback = callback;
@@ -56,7 +64,9 @@
}
@Override
+ @EnforcePermission(MANAGE_MEDIA_PROJECTION)
public int applyVirtualDisplayFlags(int flags) throws RemoteException {
+ applyVirtualDisplayFlags_enforcePermission();
return 0;
}
@@ -69,22 +79,30 @@
}
@Override
+ @EnforcePermission(MANAGE_MEDIA_PROJECTION)
public IBinder getLaunchCookie() throws RemoteException {
+ getLaunchCookie_enforcePermission();
return mLaunchCookie;
}
@Override
+ @EnforcePermission(MANAGE_MEDIA_PROJECTION)
public void setLaunchCookie(IBinder launchCookie) throws RemoteException {
+ setLaunchCookie_enforcePermission();
mLaunchCookie = launchCookie;
}
@Override
+ @EnforcePermission(MANAGE_MEDIA_PROJECTION)
public boolean isValid() throws RemoteException {
+ isValid_enforcePermission();
return true;
}
@Override
+ @EnforcePermission(MANAGE_MEDIA_PROJECTION)
public void notifyVirtualDisplayCreated(int displayId) throws RemoteException {
+ notifyVirtualDisplayCreated_enforcePermission();
}
}
diff --git a/media/tests/projection/src/android/media/projection/MediaProjectionTest.java b/media/tests/projection/src/android/media/projection/MediaProjectionTest.java
index 2a5674e..2e0396f 100644
--- a/media/tests/projection/src/android/media/projection/MediaProjectionTest.java
+++ b/media/tests/projection/src/android/media/projection/MediaProjectionTest.java
@@ -16,7 +16,7 @@
package android.media.projection;
-
+import static android.Manifest.permission.MANAGE_MEDIA_PROJECTION;
import static android.media.projection.MediaProjection.MEDIA_PROJECTION_REQUIRES_CALLBACK;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -42,6 +42,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.test.FakePermissionEnforcer;
import android.platform.test.annotations.Presubmit;
import android.testing.TestableContext;
import android.view.Display;
@@ -80,7 +81,7 @@
private final Handler mHandler = new Handler(Looper.getMainLooper());
// Fake the connection to the system server.
- private final FakeIMediaProjection mFakeIMediaProjection = new FakeIMediaProjection();
+ private FakeIMediaProjection mFakeIMediaProjection;
// Callback registered by an app.
private MediaProjection mMediaProjection;
@@ -112,7 +113,10 @@
.strictness(Strictness.LENIENT)
.startMocking();
+ FakePermissionEnforcer permissionEnforcer = new FakePermissionEnforcer();
+ permissionEnforcer.grant(MANAGE_MEDIA_PROJECTION);
// Support the MediaProjection instance.
+ mFakeIMediaProjection = new FakeIMediaProjection(permissionEnforcer);
mFakeIMediaProjection.setLaunchCookie(mock(IBinder.class));
mMediaProjection = new MediaProjection(mTestableContext, mFakeIMediaProjection,
mDisplayManager);
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index 4f50ef5..889d7c8 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -45,7 +45,7 @@
<string name="permission_expand" msgid="893185038020887411">"展開<xliff:g id="PERMISSION_TYPE">%1$s</xliff:g>"</string>
<string name="permission_collapse" msgid="3320833884220844084">"收合<xliff:g id="PERMISSION_TYPE">%1$s</xliff:g>"</string>
<string name="permission_sync_confirmation_title" msgid="4409622174437248702">"要讓「<xliff:g id="COMPANION_DEVICE_NAME">%1$s</xliff:g>」<strong></strong>的應用程式沿用在「<xliff:g id="PRIMARY_DEVICE_NAME">%2$s</xliff:g>」<strong></strong>上的權限嗎?"</string>
- <string name="permission_sync_summary" msgid="765497944331294275">"這可能包括 <strong><xliff:g id="COMPANION_DEVICE_NAME_0">%1$s</xliff:g></strong> 的<strong>麥克風</strong>、<strong>相機</strong>和<strong>位置資訊存取權</strong>以及機密權限。<br/><br/>你隨時可透過 <strong><xliff:g id="COMPANION_DEVICE_NAME_1">%1$s</xliff:g></strong> 的「設定」變更這些權限。"</string>
+ <string name="permission_sync_summary" msgid="765497944331294275">"這可能包括 <strong><xliff:g id="COMPANION_DEVICE_NAME_0">%1$s</xliff:g></strong> 的<strong>麥克風</strong>、<strong>相機</strong>和<strong>位置資訊存取權</strong>以及私密資訊權限。<br/><br/>你隨時可透過 <strong><xliff:g id="COMPANION_DEVICE_NAME_1">%1$s</xliff:g></strong> 的「設定」變更這些權限。"</string>
<string name="vendor_header_button_description" msgid="7994879208461111473">"更多資訊"</string>
<string name="permission_phone" msgid="2661081078692784919">"電話"</string>
<string name="permission_sms" msgid="6337141296535774786">"簡訊"</string>
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 81cbd5a..281696d 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -50,6 +50,7 @@
import com.android.credentialmanager.GetFlowUtils
import com.android.credentialmanager.getflow.CredentialEntryInfo
import com.android.credentialmanager.getflow.ProviderDisplayInfo
+import com.android.credentialmanager.getflow.ProviderInfo
import com.android.credentialmanager.getflow.toProviderDisplayInfo
import org.json.JSONObject
import java.util.concurrent.Executors
@@ -155,6 +156,31 @@
}
val entryIconMap: Map<String, Icon> =
getEntryToIconMap(getCredResponse.candidateProviderDataList)
+ val autofillIdToProvidersMap: Map<AutofillId, List<ProviderInfo>> =
+ mapAutofillIdToProviders(providerList)
+ val fillResponseBuilder = FillResponse.Builder()
+ var validFillResponse = false
+ autofillIdToProvidersMap.forEach { (autofillId, providers) ->
+ validFillResponse = processProvidersForAutofillId(
+ filLRequest, autofillId, providers, entryIconMap, fillResponseBuilder)
+ .or(validFillResponse)
+ }
+ if (!validFillResponse) {
+ return null
+ }
+ return fillResponseBuilder.build()
+ }
+
+ private fun processProvidersForAutofillId(
+ filLRequest: FillRequest,
+ autofillId: AutofillId,
+ providerList: List<ProviderInfo>,
+ entryIconMap: Map<String, Icon>,
+ fillResponseBuilder: FillResponse.Builder
+ ): Boolean {
+ if (providerList.isEmpty()) {
+ return false
+ }
var totalEntryCount = 0
providerList.forEach { provider ->
totalEntryCount += provider.credentialEntryList.size
@@ -169,77 +195,145 @@
maxItemCount = maxItemCount.coerceAtMost(inlineMaxSuggestedCount)
}
var i = 0
- val fillResponseBuilder = FillResponse.Builder()
- var emptyFillResponse = true
+ var datasetAdded = false
providerDisplayInfo.sortedUserNameToCredentialEntryList.forEach usernameLoop@ {
val primaryEntry = it.sortedCredentialEntryList.first()
- // In regular CredMan bottomsheet, only one primary entry per username is displayed.
- // But since the credential requests from different fields are allocated into a single
- // request for autofill, there will be duplicate primary entries, especially for
- // username/pw autofill fields. These primary entries will be the same entries except
- // their autofillIds will point to different autofill fields. Process all primary
- // fields.
- // TODO(b/307435163): Merge credential options
- it.sortedCredentialEntryList.forEach entryLoop@ { credentialEntry ->
- if (!isSameCredentialEntry(primaryEntry, credentialEntry)) {
- // Encountering different credential entry means all the duplicate primary
- // entries have been processed.
- return@usernameLoop
- }
- val autofillId: AutofillId? = credentialEntry
- .fillInIntent
- ?.getParcelableExtra(
- CredentialProviderService.EXTRA_AUTOFILL_ID,
- AutofillId::class.java)
- val pendingIntent = credentialEntry.pendingIntent
- if (autofillId == null || pendingIntent == null) {
- Log.e(TAG, "AutofillId or pendingIntent was missing from the entry.")
- return@entryLoop
- }
- var inlinePresentation: InlinePresentation? = null
- // Create inline presentation
- if (inlinePresentationSpecs != null && i < maxItemCount) {
- val spec: InlinePresentationSpec
- if (i < inlinePresentationSpecsCount) {
- spec = inlinePresentationSpecs[i]
- } else {
- spec = inlinePresentationSpecs[inlinePresentationSpecsCount - 1]
- }
- val sliceBuilder = InlineSuggestionUi
- .newContentBuilder(pendingIntent)
- .setTitle(credentialEntry.userName)
- val icon: Icon =
- entryIconMap[credentialEntry.entryKey + credentialEntry.entrySubkey]
- ?: getDefaultIcon()
- sliceBuilder.setStartIcon(icon)
- inlinePresentation = InlinePresentation(
- sliceBuilder.build().slice, spec, /* pinned= */ false)
- }
- i++
+ val pendingIntent = primaryEntry.pendingIntent
+ if (pendingIntent == null || primaryEntry.fillInIntent == null) {
+ // FillInIntent will not be null because autofillId was retrieved from it.
+ Log.e(TAG, "PendingIntent was missing from the entry.")
+ return@usernameLoop
+ }
+ if (inlinePresentationSpecs == null || i >= maxItemCount) {
+ Log.e(TAG, "Skipping because reached the max item count.")
+ return@usernameLoop
+ }
+ // Create inline presentation
+ val spec: InlinePresentationSpec
+ if (i < inlinePresentationSpecsCount) {
+ spec = inlinePresentationSpecs[i]
+ } else {
+ spec = inlinePresentationSpecs[inlinePresentationSpecsCount - 1]
+ }
+ val sliceBuilder = InlineSuggestionUi
+ .newContentBuilder(pendingIntent)
+ .setTitle(primaryEntry.userName)
+ val icon: Icon
+ if (primaryEntry.icon == null) {
+ // The empty entry icon has non-null icon reference but null drawable reference.
+ // If the drawable reference is null, then use the default icon.
+ icon = getDefaultIcon()
+ } else {
+ icon = entryIconMap[primaryEntry.entryKey + primaryEntry.entrySubkey]
+ ?: getDefaultIcon()
+ }
+ sliceBuilder.setStartIcon(icon)
+ val inlinePresentation = InlinePresentation(
+ sliceBuilder.build().slice, spec, /* pinned= */ false)
+ i++
- val dataSetBuilder = Dataset.Builder()
- val presentationBuilder = Presentations.Builder()
- if (inlinePresentation != null) {
- presentationBuilder.setInlinePresentation(inlinePresentation)
- }
- fillResponseBuilder.addDataset(
- dataSetBuilder
- .setField(
- autofillId,
- Field.Builder().setPresentations(
- presentationBuilder.build())
- .build())
- .setAuthentication(pendingIntent.intentSender)
- .setAuthenticationExtras(credentialEntry.fillInIntent.extras)
- .build())
- emptyFillResponse = false
+ val dataSetBuilder = Dataset.Builder()
+ val presentationBuilder = Presentations.Builder()
+ .setInlinePresentation(inlinePresentation)
+
+ fillResponseBuilder.addDataset(
+ dataSetBuilder
+ .setField(
+ autofillId,
+ Field.Builder().setPresentations(
+ presentationBuilder.build())
+ .build())
+ .setAuthentication(pendingIntent.intentSender)
+ .setAuthenticationExtras(primaryEntry.fillInIntent.extras)
+ .build())
+ datasetAdded = true
+ }
+ return datasetAdded
+ }
+
+ /**
+ * Maps Autofill Id to provider list. For example, passing in a provider info
+ *
+ * ProviderInfo {
+ * id1,
+ * displayName1
+ * [entry1(autofillId1), entry2(autofillId2), entry3(autofillId3)],
+ * ...
+ * }
+ *
+ * will result in
+ *
+ * { autofillId1: ProviderInfo {
+ * id1,
+ * displayName1,
+ * [entry1(autofillId1)],
+ * ...
+ * }, autofillId2: ProviderInfo {
+ * id1,
+ * displayName1,
+ * [entry2(autofillId2)],
+ * ...
+ * }, autofillId3: ProviderInfo {
+ * id1,
+ * displayName1,
+ * [entry3(autofillId3)],
+ * ...
+ * }
+ * }
+ */
+ private fun mapAutofillIdToProviders(
+ providerList: List<ProviderInfo>
+ ): Map<AutofillId, List<ProviderInfo>> {
+ val autofillIdToProviders: MutableMap<AutofillId, MutableList<ProviderInfo>> =
+ mutableMapOf()
+ providerList.forEach { provider ->
+ val autofillIdToCredentialEntries:
+ MutableMap<AutofillId, MutableList<CredentialEntryInfo>> =
+ mapAutofillIdToCredentialEntries(provider.credentialEntryList)
+ autofillIdToCredentialEntries.forEach { (autofillId, entries) ->
+ autofillIdToProviders.getOrPut(autofillId) { mutableListOf() }
+ .add(copyProviderInfo(provider, entries))
}
}
- if (emptyFillResponse) {
- return null
+ return autofillIdToProviders
+ }
+
+ private fun mapAutofillIdToCredentialEntries(
+ credentialEntryList: List<CredentialEntryInfo>
+ ): MutableMap<AutofillId, MutableList<CredentialEntryInfo>> {
+ val autofillIdToCredentialEntries:
+ MutableMap<AutofillId, MutableList<CredentialEntryInfo>> = mutableMapOf()
+ credentialEntryList.forEach entryLoop@ { credentialEntry ->
+ val autofillId: AutofillId? = credentialEntry
+ .fillInIntent
+ ?.getParcelableExtra(
+ CredentialProviderService.EXTRA_AUTOFILL_ID,
+ AutofillId::class.java)
+ if (autofillId == null) {
+ Log.e(TAG, "AutofillId is missing from credential entry. Credential" +
+ " Integration might be disabled.")
+ return@entryLoop
+ }
+ autofillIdToCredentialEntries.getOrPut(autofillId) { mutableListOf() }
+ .add(credentialEntry)
}
- return fillResponseBuilder.build()
+ return autofillIdToCredentialEntries
+ }
+
+ private fun copyProviderInfo(
+ providerInfo: ProviderInfo,
+ credentialList: List<CredentialEntryInfo>
+ ): ProviderInfo {
+ return ProviderInfo(
+ providerInfo.id,
+ providerInfo.icon,
+ providerInfo.displayName,
+ credentialList,
+ providerInfo.authenticationEntryList,
+ providerInfo.remoteEntry,
+ providerInfo.actionEntryList
+ )
}
override fun onSaveRequest(request: SaveRequest, callback: SaveCallback) {
@@ -353,15 +447,4 @@
}
return result
}
-
- private fun isSameCredentialEntry(
- info1: CredentialEntryInfo,
- info2: CredentialEntryInfo
- ): Boolean {
- return info1.providerId == info2.providerId &&
- info1.lastUsedTimeMillis == info2.lastUsedTimeMillis &&
- info1.credentialType == info2.credentialType &&
- info1.displayName == info2.displayName &&
- info1.userName == info2.userName
- }
}
\ No newline at end of file
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
index a1ab35b..eac06e3 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
@@ -50,7 +50,7 @@
@Composable
private fun Page() {
- SearchScaffold(title = TITLE) { bottomPadding, searchQuery ->
- PlaceholderTitle("Search query: ${searchQuery.value}")
+ SearchScaffold(title = TITLE) { _, searchQuery ->
+ PlaceholderTitle("Search query: ${searchQuery()}")
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt
index ba88546..b97fb9c 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt
@@ -29,12 +29,6 @@
}
/**
- * Remember the [State] initialized with the [this].
- */
-@Composable
-fun <T> T.toState(): State<T> = remember { stateOf(this) }
-
-/**
* Return a new [State] initialized with the passed in [value].
*/
fun <T> stateOf(value: T) = object : State<T> {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt
index 494e69b..7842948 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt
@@ -18,11 +18,10 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.State
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.filterNotNull
-/** A StateFlow holder which value could be set or sync from [State]. */
+/** A StateFlow holder which value could be set or sync from callback. */
class StateFlowBridge<T> {
private val stateFlow = MutableStateFlow<T?>(null)
val flow = stateFlow.filterNotNull()
@@ -34,9 +33,10 @@
}
@Composable
- fun Sync(state: State<T>) {
- LaunchedEffect(state.value) {
- stateFlow.value = state.value
+ fun Sync(callback: () -> T) {
+ val value = callback()
+ LaunchedEffect(value) {
+ stateFlow.value = value
}
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt
index 696e877..c87178d 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt
@@ -37,8 +37,6 @@
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -72,7 +70,7 @@
fun SearchScaffold(
title: String,
actions: @Composable RowScope.() -> Unit = {},
- content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit,
+ content: @Composable (bottomPadding: Dp, searchQuery: () -> String) -> Unit,
) {
ActivityTitle(title)
var isSearchMode by rememberSaveable { mutableStateOf(false) }
@@ -100,12 +98,9 @@
.focusable()
.fillMaxSize()
) {
- content(
- paddingValues.calculateBottomPadding(),
- remember {
- derivedStateOf { if (isSearchMode) viewModel.searchQuery.text else "" }
- },
- )
+ content(paddingValues.calculateBottomPadding()) {
+ if (isSearchMode) viewModel.searchQuery.text else ""
+ }
}
}
}
diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt
index f0e57b9..9b7ef08 100644
--- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt
+++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt
@@ -18,7 +18,6 @@
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -56,7 +55,7 @@
val stateFlowBridge = StateFlowBridge<String>()
composeTestRule.setContent {
- stateFlowBridge.Sync(stateOf("A"))
+ stateFlowBridge.Sync { "A" }
}
val first = stateFlowBridge.flow.firstWithTimeoutOrNull()
diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt
index c3e1d54..826a0d4 100644
--- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt
+++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt
@@ -19,7 +19,6 @@
import android.content.Context
import androidx.appcompat.R
import androidx.compose.runtime.SideEffect
-import androidx.compose.runtime.State
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
@@ -60,7 +59,7 @@
fun initialState_searchQueryIsEmpty() {
val searchQuery = setContent()
- assertThat(searchQuery.value).isEqualTo("")
+ assertThat(searchQuery()).isEqualTo("")
}
@Test
@@ -72,7 +71,7 @@
composeTestRule.onNodeWithText(TITLE).assertDoesNotExist()
onSearchHint().assertIsDisplayed()
onClearButton().assertDoesNotExist()
- assertThat(searchQuery.value).isEqualTo("")
+ assertThat(searchQuery()).isEqualTo("")
}
@Test
@@ -87,7 +86,7 @@
composeTestRule.onNodeWithText(TITLE).assertIsDisplayed()
onSearchHint().assertDoesNotExist()
onClearButton().assertDoesNotExist()
- assertThat(searchQuery.value).isEqualTo("")
+ assertThat(searchQuery()).isEqualTo("")
}
@Test
@@ -98,7 +97,7 @@
onSearchHint().performTextInput(QUERY)
onClearButton().assertIsDisplayed()
- assertThat(searchQuery.value).isEqualTo(QUERY)
+ assertThat(searchQuery()).isEqualTo(QUERY)
}
@Test
@@ -110,11 +109,11 @@
onClearButton().performClick()
onClearButton().assertDoesNotExist()
- assertThat(searchQuery.value).isEqualTo("")
+ assertThat(searchQuery()).isEqualTo("")
}
- private fun setContent(): State<String> {
- lateinit var actualSearchQuery: State<String>
+ private fun setContent(): () -> String {
+ lateinit var actualSearchQuery: () -> String
composeTestRule.setContent {
SearchScaffold(title = TITLE) { _, searchQuery ->
SideEffect {
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt
index 7c45b64..68da143 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt
@@ -65,8 +65,8 @@
)
data class AppListState(
- val showSystem: State<Boolean>,
- val searchQuery: State<String>,
+ val showSystem: () -> Boolean,
+ val searchQuery: () -> String,
)
data class AppListInput<T : AppRecord>(
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt
index 07e4235..c69b5df 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt
@@ -17,8 +17,10 @@
package com.android.settingslib.spaprivileged.template.app
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import com.android.settingslib.spa.widget.scaffold.MoreOptionsAction
import com.android.settingslib.spa.widget.scaffold.MoreOptionsScope
@@ -47,13 +49,13 @@
header: @Composable () -> Unit = {},
appList: @Composable AppListInput<T>.() -> Unit = { AppList() },
) {
- val showSystem = rememberSaveable { mutableStateOf(false) }
+ var showSystem by rememberSaveable { mutableStateOf(false) }
SearchScaffold(
title = title,
actions = {
if (!noMoreOptions) {
MoreOptionsAction {
- ShowSystemAction(showSystem.value) { showSystem.value = it }
+ ShowSystemAction(showSystem) { showSystem = it }
moreOptions()
}
}
@@ -68,7 +70,7 @@
),
listModel = listModel,
state = AppListState(
- showSystem = showSystem,
+ showSystem = { showSystem },
searchQuery = searchQuery,
),
header = header,
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
index 82fbee9..4d90076 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
@@ -55,8 +55,8 @@
val inputState by setContent()
val state = inputState!!.state
- assertThat(state.showSystem.value).isFalse()
- assertThat(state.searchQuery.value).isEqualTo("")
+ assertThat(state.showSystem()).isFalse()
+ assertThat(state.searchQuery()).isEqualTo("")
}
@Test
@@ -67,7 +67,7 @@
composeTestRule.onNodeWithText(context.getString(R.string.menu_show_system)).performClick()
val state = inputState!!.state
- assertThat(state.showSystem.value).isTrue()
+ assertThat(state.showSystem()).isTrue()
}
@Test
@@ -94,7 +94,7 @@
val inputState by setContent(noMoreOptions = true)
val state = inputState!!.state
- assertThat(state.showSystem.value).isFalse()
+ assertThat(state.showSystem()).isFalse()
}
private fun setContent(
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
index 124ced6..c6409e7 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
@@ -30,7 +30,6 @@
import androidx.compose.ui.unit.dp
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.ui.SpinnerOption
import com.android.settingslib.spaprivileged.R
import com.android.settingslib.spaprivileged.model.app.AppEntry
@@ -140,7 +139,7 @@
matchAnyUserForAdmin = false,
),
listModel = TestAppListModel(enableGrouping = enableGrouping),
- state = AppListState(showSystem = stateOf(false), searchQuery = stateOf("")),
+ state = AppListState(showSystem = { false }, searchQuery = { "" }),
header = header,
bottomPadding = 0.dp,
)
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 4ac7467..115d126 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktief, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktief, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterykrag, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterykrag"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterykrag, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterykrag"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktief"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktief, net links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktief, net regs"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktief, links en regs"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Aanvaar dat programme moderne formate steun"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Wys kodewisselingkennisgewings"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktiveer kodewisselingkas"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Lopende dienste"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Sien en beheer dienste wat tans aktief is"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Hierdie foon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Hierdie tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokluidspreker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Eksterne toestel"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Gekoppelde toestel"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Maak toestel wakker om hier te speel"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Toestel is nie goedgekeur om te speel nie"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Kan nie hierdie media hier speel nie"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en terugvoer"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index cc1d29d..97de8d9 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ንቁ፣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ገቢር፣ ግ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ግ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ግራ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ቀኝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ንቁ"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"ተቀምጧል"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ገቢር፣ ግራ ብቻ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ገቢር፣ ቀኝ ብቻ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ገቢር፣ ግራ እና ቀኝ"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"መተግበሪያዎች ዘመናዊ ቅርጸቶችን እንደሚደግፉ አድርገው ይቁጠሩ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ትራንስኮዲንግ ማሳወቂያዎችን አሳይ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"የትራንስኮዲንግ መሸጎጫን አሰናክል"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"አሂድ አገልግሎቶች"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"የWebView ትግበራ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ይህ ስልክ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ይህ ጡባዊ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምፅ ማውጫ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"የውጭ መሣሪያ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"የተገናኘ መሣሪያ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"እዚህ ጋር ለመጫወት መሣሪያን ያንቁ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"መሣሪያ ለማጫወት አልጸደቀም"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ይህን ሚዲያ እዚህ ጋር ማጫወት አይቻልም"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
<string name="help_label" msgid="3528360748637781274">"እገዛ እና ግብረመልስ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 541a330..b2cd5fe 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"نشط، ومستوى البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"مفعّلة، مستوى البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، المعدّل: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"مستوى البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، المعدّل: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"نشط"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"السمّاعة الطبية اليسرى فقط مفعَّلة"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"السمّاعة الطبية اليمنى فقط مفعَّلة"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"السمّاعتان اليسرى واليمنى مفعَّلتان"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"افتراض أن التطبيق يتوافق مع التنسيقات الحديثة"</string>
<string name="transcode_notification" msgid="5560515979793436168">"إظهار إشعارات تحويل الترميز"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"إيقاف ذاكرة التخزين المؤقت لميزة \"تحويل الترميز\""</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"الخدمات قيد التشغيل"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"تطبيق WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"للتو"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"هذا الهاتف"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"هذا الجهاز اللوحي"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"مكبّر صوت بقاعدة إرساء"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"جهاز خارجي"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"جهاز متّصل"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"نشِّط الجهاز للتشغيل هنا"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"غير مسموح له بتشغيل وسائط"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"هذه الوسائط غير متوافقة"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
<string name="help_label" msgid="3528360748637781274">"المساعدة والملاحظات"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index cdad1fa..4e9326e 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"সক্ৰিয়, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"সক্ৰিয়, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"সক্ৰিয়"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"কেৱল বাঁওফালৰটো সক্ৰিয় হৈছে"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"কেৱল সোঁফালৰটো সক্ৰিয় হৈছে"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাওঁ আৰু সোঁ দুয়োফালৰ সক্ৰিয় হৈছে"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"এপে আধুনিক ফৰ্মেট সমৰ্থন কৰে বুলি ধৰি লওক"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ট্ৰান্সক\'ডিঙৰ জাননী দেখুৱাওক"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ট্ৰান্সক\'ডিঙৰ কেশ্ব অক্ষম কৰক"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"চলিত সেৱা"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"ৱেবভিউ প্ৰয়োগ"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"এই মাত্ৰ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"এই ফ’নটো"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"এই টেবলেটটো"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ড’ক স্পীকাৰ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"বাহ্যিক ডিভাইচ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"সংযোগ হৈ থকা ডিভাইচ"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ইয়াত প্লে\' কৰিবলৈ ডিভাইচটো সক্ৰিয় কৰক"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"প্লে\' কৰিবলৈ ডিভাইচটো অনুমোদিত নহয়"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ইয়াত এই মিডিয়াটো প্লে\' কৰিব নোৱাৰি"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
<string name="help_label" msgid="3528360748637781274">"সহায় আৰু মতামত"</string>
@@ -576,7 +608,7 @@
<string name="user_add_profile_item_title" msgid="3111051717414643029">"সীমিত প্ৰ\'ফাইল"</string>
<string name="user_add_user_title" msgid="5457079143694924885">"নতুন ব্যৱহাৰকাৰী যোগ কৰিবনে?"</string>
<string name="user_add_user_message_long" msgid="1527434966294733380">"আপুনি অতিৰিক্ত ব্যৱহাৰকাৰীক যোগ কৰি এই ডিভাইচটো অন্য় ব্য়ক্তিৰ সৈতে শ্বেয়াৰ কৰিব পাৰে। প্ৰতিজন ব্যৱহাৰকাৰীৰ বাবে নিজাকৈ ঠাই আছে যাক তেওঁলোকে এপ্, ৱালপেপাৰ আৰু অন্য়ান্য় বস্তুৰ বাবে নিজৰ উপযোগিতা অনুযায়ী ব্যৱহাৰ কৰিব পাৰে। ব্যৱহাৰকাৰীসকলে সকলোকে প্ৰভাৱান্বিত কৰা ৱাই-ফাইৰ নিচিনা ডিভাইচৰ ছেটিং সাল-সলনি কৰিবও পাৰে।\n\nআপুনি যেতিয়া কোনো নতুন ব্যৱহাৰকাৰীক যোগ কৰে সেই ব্য়ক্তিজনে নিজেই নিজৰ বাবে ঠাই ছেট আপ কৰিব লাগিব।\n\nসকলো ব্যৱহাৰকাৰীয়ে অন্য় ব্যৱহাৰকাৰীৰ বাবে এপ্সমূহ আপডে’ট কৰিব পাৰে। সাধ্য় সুবিধাসমূহৰ ছেটিং আৰু সেৱাসমূহ নতুন ব্যৱহাৰকাৰীলৈ স্থানান্তৰ নহ\'বও পাৰে।"</string>
- <string name="user_add_user_message_short" msgid="3295959985795716166">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ ঠাই ছেট আপ কৰাৰ প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে অন্য সকলো ব্যৱহাৰকাৰীৰ বাবে এপ্ আপডে\'ট কৰিব পাৰে।"</string>
+ <string name="user_add_user_message_short" msgid="3295959985795716166">"আপুনি যেতিয়া এগৰাকী নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ ঠাই ছেট আপ কৰাৰ প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে অন্য সকলো ব্যৱহাৰকাৰীৰ বাবে এপ্ আপডে\'ট কৰিব পাৰে।"</string>
<string name="user_grant_admin_title" msgid="5157031020083343984">"এই ব্যৱহাৰকাৰীগৰাকীক এগৰাকী প্ৰশাসক বনাবনে?"</string>
<string name="user_grant_admin_message" msgid="1673791931033486709">"প্ৰশাসকৰ ওচৰত কিছুমান বিশেষাধিকাৰ আছে, যিবোৰ অন্য ব্যৱহাৰকাৰীৰ নাই। এগৰাকী প্ৰশাসকে সকলো ব্যৱহাৰকাৰীক পৰিচালনা কৰিব, এই ডিভাইচটো আপডে’ট অথবা ৰিছেট কৰিব, ছেটিং সংশোধন কৰিব, ইনষ্টল কৰি থোৱা আটাইবোৰ এপ্ চাব আৰু অন্য লোকৰ বাবে প্ৰশাসকৰ বিশেষাধিকাৰ প্ৰদান কৰিব অথবা প্ৰত্যাহাৰ কৰিব পাৰে।"</string>
<string name="user_grant_admin_button" msgid="5441486731331725756">"প্ৰশাসক বনাওক"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index d0f18f1..c16d058 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, yalnız sol"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, yalnız sağ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, sol və sağ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Tətbiqlərin müasir formatları dəstəklədiyini qəbul edin"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Kod dəyişmə bildirişlərini göstərin"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Keşin kodlaşdırılmasını deaktiv edin"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"İşləyən xidmətlər"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"İşlək xidmətlərə baxış və onların idarəedilməsi"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView servisi"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Bu planşet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok dinamiki"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Xarici cihaz"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Qoşulmuş cihaz"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Burada oxutmaqçün cihazı oyat"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Cihaz oxutmaq üçün təsdiqlənməyib"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Bu medianı burada oxutmaq olmur"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım və rəy"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 21534ee..e326c64 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Leva <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desna <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Sačuvano"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo s leve strane"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, s desne strane"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, s leve i desne strane"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Podrazumevaj da aplikacije podržavaju moderne formate"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Prikazuj obaveštenja o transkodiranju"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogući keš transkodiranja"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Primena WebView-a"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik bazne stanice"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Spoljni uređaj"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Probudite uređaj da biste pustili ovde"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Uređaj nije odobren za reprodukciju"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Ne možete da pustite ovaj medijski fajl ovde"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 6ad88d4..2458eac 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Уключана, зарад <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Актыўна, Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Уключана"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Уключана, толькі для левага вуха"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Уключана, толькі для правага вуха"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Уключана, для левага і правага вуха"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Лічыца, што праграмы падтрымліваюць сучасныя фарматы"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Паказваць апавяшчэнні пра перакадзіраванне"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Адключыць кэш перакадзіравання"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Запушчаныя службы"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Прагляд запушчаных службаў i кіраванне iмi"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Рэалізацыя WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Гэты тэлефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Гэты планшэт"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Дынамік док-станцыі"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Знешняя прылада"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Падключаная прылада"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Для прайгравання на гэтай прыладзе абудзіце яе"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Для прайгравання на прыладзе патрабуецца ўхваленне"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Тут не ўдаецца прайграць мультымедыя"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
<string name="help_label" msgid="3528360748637781274">"Даведка і водгукі"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 486fc9b..74641d1 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активно. Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно. Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерия. Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерия"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерия. Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерия"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активно"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно – само лявото"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно – само дясното"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно – лявото и дясното"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Предполагане, че приложенията поддържат съвременни формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показване на известията за прекодиране"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Деактивиране на кеша за прекодиране"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Изпълнявани услуги"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Внедряване на WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Този телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Този таблет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Високоговорител докинг станция"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Външно устройство"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Свързано устройство"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Активирайте устройството, за да възпроизведете съдържанието тук"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Устройството не е одобрено да възпроизвежда съдържание"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Мултимедийното съдържание не може да се възпроизведе тук"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
<string name="help_label" msgid="3528360748637781274">"Помощ и отзиви"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 1d1d82e..c102722 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"চালু আছে, চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"চালু, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"চালু আছে"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"শুধুমাত্র বাঁদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"শুধুমাত্র ডানদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাঁ ও ডানদিকের হিয়ারিং এড, অ্যাক্টিভ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"অ্যাপ মর্ডার্ন ফর্ম্যাটে কাজ করবে বলে ধরে নিন"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ট্রান্সকোডিং বিজ্ঞপ্তি দেখুন"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ক্যাশে ট্রান্সকোডিং বন্ধ করুন"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"এখন চলছে যে পরিষেবাগুলি"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"ওয়েবভিউ প্রয়োগ"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"এই ফোন"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"এই ট্যাবলেট"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ডক স্পিকার"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"এক্সটার্নাল ডিভাইস"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"কানেক্ট থাকা ডিভাইস"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"এখানে চালানোর জন্য ডিভাইসকে জাগান"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"চালানোর জন্য ডিভাইসের অনুমতি নেই"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"এখানে এই মিডিয়া চালানো যাচ্ছে না"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
<string name="help_label" msgid="3528360748637781274">"সহায়তা ও মতামত"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index f489b12..c4ef89b 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lijevo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desno <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Spremljeno"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevi"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desni"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevi i desni"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavještenja o transkodiranju"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogućite keš memoriju za transkodiranje"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Postavljanje WebViewa"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik priključne stanice"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Vanjski uređaj"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Aktivirajte uređaj da reproducirate ovdje"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Uređaj nije odobren za reprodukciju"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Nije moguće ovdje reproducirati medij"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index e98b7c4..5d1b46d 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actiu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actiu, E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateria"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateria"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Esquerre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Dret: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actiu"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Desat"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actiu, només l\'esquerre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actiu, només el dret"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actiu, esquerre i dret"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Assumeix que les aplicacions són compatibles amb formats moderns"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostra les notificacions de transcodificació"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desactiva la memòria cau per a la transcodificació"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serveis en execució"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualitza i controla els serveis en execució"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementació de WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Aquest telèfon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Aquesta tauleta"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base d\'altaveu"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositiu extern"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositiu connectat"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activa el dispositiu per reproduir aquí"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"El dispositiu no està aprovat per reproduir contingut"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"No es pot reproduir aquest contingut multimèdia aquí"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda i suggeriments"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 27024a2..91aef96 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivní, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivní, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vlevo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Vpravo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivní"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Uloženo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivní, pouze levé"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivní, pouze pravé"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivní, levé a pravé"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Předpokládat, že aplikace podporují moderní formáty"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Zobrazit oznámení o překódování"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktivovat mezipaměť pro překódování"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Spuštěné služby"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementace WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tento telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tento tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok s reproduktorem"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externí zařízení"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Připojené zařízení"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Zařízení je třeba probudit"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Není schváleno k přehrávání"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Tato média zde přehrát nelze"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
<string name="help_label" msgid="3528360748637781274">"Nápověda a zpětná vazba"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 6da7456..1cbe27c 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivt, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Venstre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. Højre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, kun venstre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, kun højre"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og højre"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Gå ud fra, at apps understøtter moderne formater"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Vis notifikationer for omkodning"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktiver omkodningscache"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Kørende tjenester"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Vis og administrer kørende tjenester"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Denne telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Denne tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockhøjttaler"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ekstern enhed"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Forbundet enhed"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Væk enheden for at afspille her"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Enheden er ikke godkendt"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Mediet kan ikke afspilles her"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjælp og feedback"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 7c65e94..caeed8c 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, Akkustand L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Akkustand L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, nur links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, nur rechts"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, links und rechts"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Voraussetzen, dass Apps moderne Formate unterstützen"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Benachrichtigungen zur Transcodierung anzeigen"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Cache für Transcodierung deaktivieren"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive Dienste"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Momentan ausgeführte Dienste anzeigen und steuern"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-Implementierung"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Gerade eben"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Dieses Smartphone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Dieses Tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock-Lautsprecher"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externes Gerät"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Verbundenes Gerät"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Gerät aktivieren, um hier etwas wiedergeben zu lassen"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Gerät nicht für die Wiedergabe zugelassen"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Diese Medien können hier nicht wiedergegeben werden"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus & und wieder ein."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
<string name="help_label" msgid="3528360748637781274">"Hilfe und Feedback"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index cc4bb1e..a70e9b8 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ενεργό, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ενεργό, Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Αριστερό <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Δεξί <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ενεργό"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Αποθηκεύτηκε"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ενεργό, μόνο το αριστερό"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ενεργό, μόνο το δεξί"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ενεργό, αριστερό και δεξί"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Να θεωρείται ότι οι εφαρμογές χρησιμοποιούν σύγχρονες μορφές"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Εμφάνιση ειδοποιήσεων διακωδικοποίησης"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Απενεργοποίηση κρυφής μνήμης για διακωδικοποίηση"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Υπηρεσίες που εκτελούνται"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Υλοποίηση WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Αυτό το tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Ηχείο βάσης σύνδεσης"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Εξωτερική συσκευή"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Συνδεδεμένη συσκευή"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Αφύπνιση συσκευής για αναπαραγωγή εδώ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Η συσκευή δεν έχει εγκριθεί για αναπαραγωγή"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Δεν είναι δυνατή η αναπαραγωγή αυτού του πολυμέσου εδώ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
<string name="help_label" msgid="3528360748637781274">"Βοήθεια και σχόλια"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 98c7b73..04fa675 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wake up device to play here"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Device not approved to play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Can\'t play this media here"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 16dfb5b..364820d 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
@@ -432,6 +436,9 @@
<string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
+ <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
+ <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
+ <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
<string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -542,6 +549,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External Device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -553,6 +562,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wake up device to play here"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Device not approved to play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Cant play this media here"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 98c7b73..04fa675 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wake up device to play here"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Device not approved to play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Can\'t play this media here"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 98c7b73..04fa675 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wake up device to play here"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Device not approved to play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Can\'t play this media here"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 9a91eda..7215550 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
@@ -432,6 +436,9 @@
<string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
+ <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
+ <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
+ <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
<string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -542,6 +549,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External Device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -553,6 +562,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wake up device to play here"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Device not approved to play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Cant play this media here"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help & feedback"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 080f8d9..5ceffab 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activado (batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activo, I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activado"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Guardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo; solo oído izquierdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo; solo oído derecho"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo; oídos izquierdo y derecho"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Suponer que las apps admiten formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Inhabilitar caché de transcodificación"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"En ejecución"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar servicios actuales en ejecución"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Esta tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Conector de la bocina"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activa el dispositivo para reproducir aquí"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"El dispositivo no está aprobado para reproducir"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"No se puede reproducir el contenido multimedia aquí"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index f9dfa3e..a6e8a50 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activo L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activo"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo, solo oído izquierdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo, solo oído derecho"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo, oídos izquierdo y derecho"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Considerar que las aplicaciones admiten formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Inhabilitar almacenamiento en caché para transcodificaciones"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Servicios en ejecución"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Consulta y controla los servicios en ejecución"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Esta tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altavoz base"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activa el dispositivo para reproducir contenido aquí"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Dispositivo no aprobado para reproducir contenido"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"No se puede reproducir el contenido multimedia aquí"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 30e7790..ca2e9fe 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiivne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiivne, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivne"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivne, ainult vasak"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivne, ainult parem"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivne, vasak ja parem"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Oleta, et rakendused toetavad kaasaegseid vorminguid"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Kuva transkodeerimise märguanded"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Transkodeerimise vahemälu keelamine"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Käitatud teenused"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Praegu käitatud teenuste vaatamine ja juhtimine"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView\' rakendamine"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"See telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"See tahvelarvuti"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doki kõlar"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Väline seade"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ühendatud seade"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Äratage seade siin esitamiseks"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Seade ei ole esitamiseks heaks kiidetud"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Seda meediat ei saa siin esitada"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
<string name="help_label" msgid="3528360748637781274">"Abi ja tagasiside"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index fca1d1d..7abd4b0 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktibo. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktibo. Ezk. gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Esk- gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ezk. gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Esk- gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Ezkerrekoa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Eskuinekoa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktibo"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Gordeta"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, ezkerrekoa soilik"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, eskuinekoa soilik"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, ezkerreko eta eskuineko audifonoak"</string>
@@ -115,9 +119,9 @@
<string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"Kalitate handiko audioa: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"Kalitate handiko audioa"</string>
<string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"Audifonoak"</string>
- <string name="bluetooth_profile_le_audio" msgid="1725521360076451751">"Kontsumo txikiko Bluetooth bidezko audioa"</string>
+ <string name="bluetooth_profile_le_audio" msgid="1725521360076451751">"Kontsumo txikiko audioa"</string>
<string name="bluetooth_hearing_aid_profile_summary_connected" msgid="5757754050938807276">"Audifonoetara konektatuta"</string>
- <string name="bluetooth_le_audio_profile_summary_connected" msgid="6916226974453480650">"LE audio-ra konektatuta"</string>
+ <string name="bluetooth_le_audio_profile_summary_connected" msgid="6916226974453480650">"Kontsumo txikiko audiora konektatuta"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Euskarriaren audiora konektatuta"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Telefonoaren audiora konektatuta"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"Fitxategi-transferentziako zerbitzarira konektatuta"</string>
@@ -432,6 +436,9 @@
<string name="transcode_default" msgid="3784803084573509491">"Arduratu aplikazioek formatu modernoak onartzeaz"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Erakutsi transkodetze-jakinarazpenak"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desgaitu transkodetze-cachea"</string>
+ <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-ren ezarpenak"</string>
+ <string name="force_l3_fallback_title" msgid="4987972688770202547">"Behartu L3 ordezko aukera"</string>
+ <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Hautatu L3 ordezko aukera behartu nahi duzun"</string>
<string name="runningservices_settings_title" msgid="6460099290493086515">"Abian diren zerbitzuak"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ikusi eta kontrolatu une honetan abian diren zerbitzuak"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView inplementazioa"</string>
@@ -542,6 +549,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Telefono hau"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tableta hau"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Oinarri bozgorailuduna"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Kanpoko gailua"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Konektatutako gailua"</string>
@@ -553,6 +562,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Aktibatu gailua hemen erreproduzitzeko"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Gailua ez dago erreproduzitzeko onartuta"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Ezin da erreproduzitu multimedia-eduki hau hemen"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
<string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index f1c7d20..97d048f 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"فعال، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"فعال، چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"فعال"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، فقط چپ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، فقط راست"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، چپ و راست"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"فرض شود برنامهها از قالبهای مدرن پشتیبانی میکنند"</string>
<string name="transcode_notification" msgid="5560515979793436168">"نمایش اعلانهای تراتبدیل"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"غیرفعال کردن حافظه پنهان تراتبدیل"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"سرویسهای در حال اجرا"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"اجرای وبنما"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"هماکنون"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"این تلفن"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"این رایانه لوحی"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"بلندگوی پایه اتصال"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"دستگاه خارجی"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"دستگاه متصل"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"برای پخش در اینجا، دستگاه را بیدار کنید"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"دستگاه برای پخش تأیید نشده است"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"نمیتوان این رسانه را اینجا پخش کرد"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
<string name="help_label" msgid="3528360748637781274">"راهنما و بازخورد"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 73c63f7..0adfc3a 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiivinen, akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiivinen, V: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, O: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, O: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivinen"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivinen, vain vasen"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivinen, vain oikea"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivinen, vasen ja oikea"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Oleta, että sovellukset tukevat nykyaikaisia formaatteja"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Näytä transkoodausilmoituksia"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Poista välimuistin transkoodaus käytöstä"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-käyttöönotto"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tämä puhelin"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tämä tabletti"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Telinekaiutin"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ulkoinen laite"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Yhdistetty laite"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Aktivoi laite, jotta voit toistaa sillä"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Laitetta ei ole hyväksytty toistoa varten"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Mediaa ei voi toistaa tällä"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
<string name="help_label" msgid="3528360748637781274">"Ohje ja palaute"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index cd1db07..de62739 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actif, pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actif, G : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; D : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"G : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; D : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actif"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actif, gauche seulement"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, droite seulement"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, gauche et droite"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Présumer que les applications prennent en charge les formats modernes"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Désactiver le cache de transcodage"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Cette tablette"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Haut-parleur du socle"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Appareil externe"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Appareil connecté"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activez l\'appareil pour faire jouer le contenu ici"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"L\'appareil n\'est pas autorisé à faire jouer le contenu"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Impossible de faire jouer ce contenu multimédia ici"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index e7b778c8..fea9bdd 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actif, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actif, G : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de la batterie, D : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de la batterie"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"G : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de la batterie, D : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de la batterie"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actif"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actif, gauche uniquement"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actif, droit uniquement"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actifs, gauche et droit"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Supposer que les applications sont compatibles avec les formats modernes"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Désactiver la cache de transcodage"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Cette tablette"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Haut-parleur station d\'accueil"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Appareil externe"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Appareil connecté"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activez l\'appareil pour y lire du contenu"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Appareil non autorisé à lire du contenu"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Impossible de lire ce contenu multimédia ici"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 64821e0..62bdf09 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Dispositivo activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activado. E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activo"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo (só o esquerdo)"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo (só o dereito)"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activos (o esquerdo e o dereito)"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Considerar que as aplicacións admiten formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificacións de transcodificación"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desactivar memoria caché para a transcodificación"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Servizos en uso"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Comproba e controla os servizos actualmente en uso"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Esta tableta"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altofalante da base"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activa o dispositivo para reproducir o contido aquí"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"O dispositivo non está autorizado para reproducir contido"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Non se pode reproducir este produto multimedia aquí"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Axuda e comentarios"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 512c8ff..6b422fa 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"સક્રિય, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"સક્રિય, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ડાબી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"જમણી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"સાચવેલું"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"સક્રિય, માત્ર ડાબું"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"સક્રિય, માત્ર જમણું"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"સક્રિય, ડાબું અને જમણું બન્ને"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ધારો કે ઍપ આધુનિક ફૉર્મેટ પર કામ કરે છે"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ફૉર્મેટ બદલવાની પ્રક્રિયાના નોટિફિકેશન બતાવો"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ફૉર્મેટ બદલવાની પ્રક્રિયાની કૅશ મેમરી બંધ કરો"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ચાલુ સેવાઓ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView અમલીકરણ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"હમણાં જ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"આ ફોન"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"આ ટૅબ્લેટ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ડૉક સ્પીકર"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"બહારનું ડિવાઇસ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"કનેક્ટ કરેલું ડિવાઇસ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"અહીં ચલાવવા માટે ડિવાઇસને સક્રિય કરો"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ડિવાઇસ દ્વારા ચલાવવાની મંજૂરી આપવામાં આવી નથી"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"અહીં આ મીડિયા ચલાવી શકતા નથી"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
<string name="help_label" msgid="3528360748637781274">"સહાય અને પ્રતિસાદ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index a2fd3ec..482c9e9 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"चालू, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"चालू, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"बाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"दाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"चालू"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"सेव किया गया"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"बाईं और दाईं तरफ़ वाला चालू है"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"मानकर चलें कि ऐप्लिकेशन, नए फ़ॉर्मैट के साथ काम करेंगे"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रांसकोडिंग की सूचनाएं दिखाएं"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"कैश को ट्रांसकोड करने की सुविधा बंद करें"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"चालू सेवाएं"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"इस समय चल रही सेवाओं को देखें और कंट्रोल करें"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"वेबव्यू लागू करें"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"अभी-अभी"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"यह फ़ोन"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"यह टैबलेट"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डॉक स्पीकर"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाहरी डिवाइस"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट किया गया डिवाइस"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"मीडिया को यहां चलाने के लिए, डिवाइस को अनलॉक करें"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"डिवाइस को मीडिया चलाने की अनुमति नहीं दी गई है"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"इस मीडिया को यहां नहीं चलाया जा सकता"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string>
<string name="help_label" msgid="3528360748637781274">"सहायता और सुझाव"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index a16be41..b433748 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lijevo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desno <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Spremljeno"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevo i desno"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavijesti o konvertiranju"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogući predmemoriju za konvertiranje"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Pregledajte i kontrolirajte trenutačno pokrenute usluge"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacija WebViewa"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo sad"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik priključne stanice"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Vanjski uređaj"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Aktivirajte i reproducirajte ovdje"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Nije odobreno za reprodukciju"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Nemoguća je reprodukcija medija"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index ba7ab8a..7c93b2f 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktív, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-os töltöttség"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktív, B: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-os töltöttség, J: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-os töltöttség"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"B: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-os töltöttség, J: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-os töltöttség"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Bal: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Jobb: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktív"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Mentve"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktív, csak bal"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktív, csak jobb"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktív, bal és jobb"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Annak feltételezése, hogy az alkalmazások támogatják a modern formátumokat"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Átkódolási értesítések megjelenítése"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Átkódolási gyorsítótár kikapcsolása"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Futó szolgáltatások"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-megvalósítás"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ez a telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ez a táblagép"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokkhangszóró"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Külső eszköz"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Csatlakoztatott eszköz"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Lejátszáshoz ébressze fel az eszközt"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Az eszköz nem játszhat le"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"A tartalom nem játszható le itt"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
<string name="help_label" msgid="3528360748637781274">"Súgó és visszajelzés"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 243950f..1a189b1 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ակտիվ է։ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ակտիվ է, Ա` Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ձ՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ա՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ձ՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ակտիվ է"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ակտիվ, միայն ձախ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ակտիվ, միայն աջ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ակտիվ, ձախ և աջ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Ենթադրել, որ հավելվածներն աջակցում են ժամանակակից ձևաչափեր"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Ցույց տալ տրանսկոդավորման մասին ծանուցումները"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Անջատել տրանսկոդավորման քեշը"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Աշխատող ծառայություններ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ծառայություն"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Այս հեռախոսը"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Այս պլանշետը"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Դոկ-կայանով բարձրախոս"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Արտաքին սարք"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Միացված սարք"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Արթնացրեք սարքը՝ այստեղ նվագարկելու համար"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Նվագարկելու համար հաստատեք սարքը"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Չհաջողվեց նվագարկել մեդիա ֆայլն այստեղ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
<string name="help_label" msgid="3528360748637781274">"Օգնություն և հետադարձ կապ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 5405334..cd8ab5a42 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktif, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktif, Kr: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, Kn: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Kr: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, Kn: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktif"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, hanya kiri"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, hanya kanan"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Asumsikan aplikasi mendukung format modern"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Tampilkan notifikasi transcoding"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Nonaktifkan cache transcoding"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Layanan yang sedang berjalan"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kontrol layanan yang sedang berjalan"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Penerapan WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ponsel ini"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tablet ini"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Speaker dok"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Perangkat Eksternal"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Perangkat yang terhubung"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Mengaktifkan perangkat untuk memutar di sini"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Perangkat tidak disetujui untuk memutar"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Tidak dapat memutar media ini di sini"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat & aktifkan kembali"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan & masukan"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 1b0a735..5621526 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Tengt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Virkt, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Virkt"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Virkt, aðeins vinstra"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Virkt, aðeins hægra"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Virkt, vinstra og hægra"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Gera ráð fyrir að forrit styðji nútímasnið"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Sýna umkóðunartilkynningar"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Slökkva á skyndiminni umkóðunar"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Þjónustur í gangi"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Skoða og stjórna þjónustum í gangi"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Innleiðing WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Þessi sími"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Þessi spjaldtölva"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Hátalaradokka"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ytra tæki"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Tengt tæki"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Vektu tæki til að spila hér"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Tæki er ekki samþykkt til spilunar"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Ekki er hægt að spila þetta efni hér"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
<string name="help_label" msgid="3528360748637781274">"Hjálp og ábendingar"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 44b6db6..9079750 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Attivo - Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Attivo, S: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"S: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Attivo"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Attiva, solo sinistra"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Attiva, solo destra"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Attivo, destra e sinistra"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Presupponi che le app supportino i formati moderni"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostra notifiche relative alla transcodifica"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Disattiva memorizzazione nella cache per la transcodifica"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Servizi in esecuzione"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizza e controlla i servizi attualmente in esecuzione"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementazione di WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Questo smartphone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Questo tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base con altoparlante"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo esterno"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo connesso"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Riattiva il dispositivo per riprodurre qui"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Dispositivo non approvato per la riproduzione"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Impossibile riprodurre questo contenuto multimediale qui"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
<string name="help_label" msgid="3528360748637781274">"Guida e feedback"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index d8fd33e..296ee5a 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"פעיל, טעינת הסוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"פעיל, שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"טעינת הסוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"פעיל"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"פועל: שמאל בלבד"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"פועל: ימין בלבד"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"פועל: ימין ושמאל"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"הנחת העבודה היא שאפליקציות תומכות בפורמטים מודרניים"</string>
<string name="transcode_notification" msgid="5560515979793436168">"הצגת התראות לגבי המרת קידוד"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"השבתת השמירה של המרת הקידוד במטמון"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"שירותים פועלים"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"הצגת השירותים הפועלים כעת ושליטה בהם"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"יישום WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"הטלפון הזה"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"הטאבלט הזה"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"הרמקול של אביזר העגינה"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"מכשיר חיצוני"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"המכשיר המחובר"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"צריך להעיר את המכשיר"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"המכשיר לא אושר"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"אי אפשר להפעיל מדיה"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
<string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index a4cf078..547da2c 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"有効、バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"有効、L: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、R: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、R: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"有効"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"保存済み"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"有効、左のみ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"有効、右のみ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"有効、左と右"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"アプリによる最新形式のサポートを想定"</string>
<string name="transcode_notification" msgid="5560515979793436168">"コード変換に関する通知の表示"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"コード変換のキャッシュを無効にする"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"実行中のサービス"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"現在実行中のサービスを表示して制御する"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView の実装"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"このデバイス"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"このタブレット"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ホルダー スピーカー"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部デバイス"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"接続済みのデバイス"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"デバイスの起動が必要です"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"再生が許可されていません"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"このメディアは再生できません"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
<string name="help_label" msgid="3528360748637781274">"ヘルプとフィードバック"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 0385d64..3fb9274 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"აქტიურია, ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-ს შეადგენს"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"აქტიური, მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ბატარეა, მარჯვენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ბატარეა"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ბატარეა"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ბატარეა, მარჯვენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ბატარეა"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"მარცხენა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"მარჯვენა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"აქტიური"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"შენახული"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"აქტიური, მხოლოდ მარცხნივ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"აქტიური, მხოლოდ მარჯვნივ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"აქტიური, მარცხნივ და მარჯვნივ"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"დაშვება, რომ აპებს აქვთ თანამედროვე ფორმატების მხარდაჭერა"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ტრანსკოდირების შეტყობინებების ჩვენება"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ტრანსკოდირების ქეშის გათიშვა"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"მიმდინარე სერვისები"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView რეალიზაცია"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ახლახან"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ეს ტელეფონი"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ეს ტაბლეტი"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"დინამიკის სამაგრი"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"გარე მოწყობილობა"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"დაკავშირებული მოწყობილობა"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"დასაკრავად გამოაღვიძეთ ტელეფონი"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"მოწყობილობა არ არის ავტორიზებული დასაკრავად"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ამ მედიის აქ დაკვრა შეუძლებელია"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
<string name="help_label" msgid="3528360748637781274">"დახმარება და გამოხმაურება"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index a9a5519..4753d81 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Қосулы, батарея қуаты: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Қосулы, С: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, О: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батарея қуаты: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"С: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, О: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Қосулы"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Тек сол жағы қосулы"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Тек оң жағы қосулы"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Екеуі де қосулы"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Қолданбалар қазіргі заманғы форматтарды қолдайды делік"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Қайта кодтау хабарландыруларын көрсету"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Қайта кодтау кэшін өшіру"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Қосылып тұрған қызметтер"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Қазір істеп тұрған қызметтерді көру және басқару"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView қызметі"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Осы телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Осы планшет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Қондыру динамигі"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Сыртқы құрылғы"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Жалғанған құрылғы"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Осы жерде ойнату үшін құрылғыны ұйқы режимінен шығарыңыз."</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Ойнату үшін авторизация керек."</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Бұл мультимедиа файлын осы жерде ойнату мүмкін емес."</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
<string name="help_label" msgid="3528360748637781274">"Анықтама және пікір"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 6cb6bc0f..2033319 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"សកម្ម ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"សកម្ម, L៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ឆ្វេង <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ស្ដាំ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"សកម្ម"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"បានរក្សាទុក"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"សកម្ម ខាងឆ្វេងតែប៉ុណ្ណោះ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"សកម្មខាងស្ដាំតែប៉ុណ្ណោះ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"សកម្មខាងឆ្វេង និងស្ដាំ"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"សន្មតថាកម្មវិធីអាចប្រើទម្រង់ទំនើបបាន"</string>
<string name="transcode_notification" msgid="5560515979793436168">"បង្ហាញការជូនដំណឹងអំពីការបំប្លែងកូដ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"បិទឃ្លាំងបម្រុងសម្រាប់ការបំប្លែងកូដ"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"សេវាកម្មកំពុងដំណើរការ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"ការអនុវត្ត WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"អម្បាញ់មិញ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ទូរសព្ទនេះ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ថេប្លេតនេះ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ឧបករណ៍បំពងសំឡេងដែលមានជើងភ្ជាប់"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ឧបករណ៍ខាងក្រៅ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"ឧបករណ៍ដែលបានភ្ជាប់"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ដាស់ឧបករណ៍ឱ្យចាក់នៅទីនេះ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ឧបករណ៍មិនព្រមឱ្យចាក់ទេ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"មិនអាចចាក់មេឌៀនេះនៅទីនេះបានទេ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មានបញ្ហាក្នុងការភ្ជាប់។ បិទ រួចបើកឧបករណ៍វិញ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍សំឡេងប្រើខ្សែ"</string>
<string name="help_label" msgid="3528360748637781274">"ជំនួយ និងមតិកែលម្អ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index fa695e8..71b3e6e 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ಸಕ್ರಿಯ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ಸಕ್ರಿಯ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಇದೆ"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ಎಡ ಭಾಗದ ಬ್ಯಾಟರಿ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ಬಲ ಭಾಗದ ಬ್ಯಾಟರಿ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ಸಕ್ರಿಯ"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"ಸೇವ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ಎಡಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ಬಲಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ಎಡ ಮತ್ತು ಬಲಕಿವಿಯ ಸಾಧನಗಳು ಸಕ್ರಿಯವಾಗಿವೆ"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ಆ್ಯಪ್ಗಳು ಆಧುನಿಕ ಫಾರ್ಮ್ಯಾಟ್ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ ಎಂದು ಊಹಿಸಿ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಕ್ಯಾಷ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ಈ ಫೋನ್"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ಈ ಟ್ಯಾಬ್ಲೆಟ್"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ಡಾಕ್ ಸ್ಪೀಕರ್"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ಬಾಹ್ಯ ಸಾಧನ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"ಕನೆಕ್ಟ್ ಮಾಡಿರುವ ಸಾಧನ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ಇಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು ಸಾಧನವನ್ನು ಎಚ್ಚರಿಸಿ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ಪ್ಲೇ ಮಾಡಲು ಸಾಧನವನ್ನು ಅನುಮೋದಿಸಲಾಗಿಲ್ಲ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ಈ ಮಾಧ್ಯಮವನ್ನು ಇಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
<string name="help_label" msgid="3528360748637781274">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 6299b66..ae1822b 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"활성, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"활성, 왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"활성"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"활성, 왼쪽만"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"활성, 오른쪽만"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"활성, 왼쪽 및 오른쪽"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"앱이 최신 형식을 지원하는 것으로 가정"</string>
<string name="transcode_notification" msgid="5560515979793436168">"트랜스코딩 알림 표시"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"트랜스코딩 캐시 사용 중지"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"실행 중인 서비스"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"현재 실행 중인 서비스 보기 및 제어"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 구현"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"이 휴대전화"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"태블릿"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"도크 스피커"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"외부 기기"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"연결된 기기"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"기기 절전 모드 해제 후 여기에서 재생"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"기기에서 재생을 승인하지 않음"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"여기에서 이 미디어를 재생할 수 없음"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
<string name="help_label" msgid="3528360748637781274">"고객센터"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index bd0ad9b..956b272 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Иштеп жатат, батарея: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активдүү, сол: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, оң: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батареянын деңгээли: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Сол: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, оң: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Жигердүү"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Иштеп жатат, сол кулак гана"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Жигердүү, оң кулакчын гана"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Жигердүү, сол жана оң кулакчын"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Колдонмолордо заманбап форматтар колдоого алынат"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Транскоддоо билдирмелерин көрсөтүү"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Транскоддоо кешин өчүрүү"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Иштеп жаткан кызматтар"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Учурда иштеп жаткан кызматтарды көрүп, көзөмөлдөп турасыз"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView кызматы"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ушул телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ушул планшет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Док бекети үчүн динамик"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Тышкы түзмөк"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Туташкан түзмөк"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Угуу үчүн түзмөктү уйкудан чыгарыңыз"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Ойнотуу үчүн уруксат алышыңыз керек"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Медиа файлды ойното албайсыз"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
<string name="help_label" msgid="3528360748637781274">"Жардам/Пикир билдирүү"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 2be0376..c716e5f 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ເປີດໃຊ້ຢູ່, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ເປີດໃຊ້, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ແບັດເຕີຣີ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ແບັດເຕີຣີ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ແບັດເຕີຣີ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ແບັດເຕີຣີ"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ອອນລາຍ"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ນຳໃຊ້ຢູ່, ຊ້າຍເທົ່ານັ້ນ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ນຳໃຊ້ຢູ່, ຂວາເທົ່ານັ້ນ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ນຳໃຊ້ຢູ່, ຊ້າຍ ແລະ ຂວາ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ສົມມຸດວ່າແອັບຮອງຮັບຮູບແບບສະໄໝໃໝ່"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ສະແດງການແຈ້ງເຕືອນການປ່ຽນຮູບແບບລະຫັດ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ປິດການນຳໃຊ້ແຄສການປ່ຽນຮູບແບບລະຫັດ"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ເບິ່ງ ແລະ ຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ແທັບເລັດນີ້"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ແທ່ນວາງລຳໂພງ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ອຸປະກອນພາຍນອກ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ປຸກອຸປະກອນເພື່ອຫຼິ້ນຢູ່ບ່ອນນີ້"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ອຸປະກອນບໍ່ອະນຸມັດໃຫ້ຫຼິ້ນ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ຫຼິ້ນມີເດຍນີ້ຢູ່ບ່ອນນີ້ບໍ່ໄດ້"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
<string name="help_label" msgid="3528360748637781274">"ຊ່ວຍເຫຼືອ ແລະ ຕິຊົມ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index dd03307..e7ad359 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktyvus, akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktyvi, KAIRĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, DEŠINĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"KAIRĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, DEŠINĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktyvus"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktyvus, tik kairysis"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktyvus, tik dešinysis"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktyvus, kairysis ir dešinysis"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Manoma, kad programos palaiko modernius formatus"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Rodyti perkodavimo pranešimus"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Išjungti talpyklos perkodavimą"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Vykdomos paslaugos"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"„WebView“ diegimas"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Šis telefonas"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Šis planšetinis kompiuteris"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doko garsiakalbis"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Išorinis įrenginys"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Prijungtas įrenginys"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Pažadinkite įrenginį, kad galėtumėte čia leisti"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Įrenginys nepatvirtintas, kad būtų galima leisti"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Čia negalima leisti šio medijos failo"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
<string name="help_label" msgid="3528360748637781274">"Pagalba ir atsiliepimai"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 1a12a9a..4c21e1e 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktīvs, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktīvs, L: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktīvs"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ierīce aktīva, tikai kreisā auss"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ierīce aktīva, tikai labā auss"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ierīces aktīvas, kreisā un labā auss"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Pieņemt, ka lietotnēs tiek atbalstīti moderni formāti"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Rādīt paziņojumus par pārkodēšanu"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Atspējot saglabāšanu kešatmiņā pārkodēšanai"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Aktīvie pakalpojumi"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ieviešana"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Šis tālrunis"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Šis planšetdators"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doka skaļrunis"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ārēja ierīce"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pievienotā ierīce"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Lai atskaņotu šeit, aktivizējiet ierīci."</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Ierīce nav apstiprināta atskaņošanai."</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Šo multivides saturu nevar atskaņot šeit."</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
<string name="help_label" msgid="3528360748637781274">"Palīdzība un atsauksmes"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index f1ab5ef..fd40304 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активен, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активен, Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батерија: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Одлево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Оддесно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активен"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Зачувано"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само лево"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, само десно"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, лево и десно"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Претпостави дека апликациите поддржуваат модерни формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Прикажувај известувања за транскодирање"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Оневозможи го кешот на транскодирањето"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Активни услуги"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Погледнете и контролирајте услуги што се моментално активни"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Примена на WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Пред малку"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Овој телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Овој таблет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Док со звучник"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Надворешен уред"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Поврзан уред"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Разбудете го уредот за да пуштате тука"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Уредот не е одобрен за репродукција"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Овие аудиовизуелни содржини не може да се пуштат тука"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
<string name="help_label" msgid="3528360748637781274">"Помош и повратни информации"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 91d8d3c..066469c 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"സജീവം, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"സജീവം, ഇടത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ബാറ്ററി ചാർജ് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ആണ്"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ഇടത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ഇടത് വശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"വലത് വശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"സജീവം"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"സംരക്ഷിച്ചു"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"സജീവമാണ്, ഇടത്തേത് മാത്രം"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"സജീവമാണ്, വലത്തേത് മാത്രം"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"സജീവമാണ്, ഇടത്തേതും വലത്തേതും"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ആപ്പുകൾ ആധുനിക ഫോർമാറ്റുകളെ പിന്തുണയ്ക്കുമെന്ന് കരുതുക"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ട്രാൻസ്കോഡ് ചെയ്യൽ അറിയിപ്പുകൾ കാണിക്കുക"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ട്രാൻസ്കോഡ് ചെയ്യൽ കാഷെ പ്രവർത്തനരഹിതമാക്കുക"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView നടപ്പാക്കൽ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ഇപ്പോൾ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ഈ ഫോൺ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ഈ ടാബ്ലെറ്റ്"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ഡോക്ക് സ്പീക്കർ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ബാഹ്യ ഉപകരണം"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"കണക്റ്റ് ചെയ്ത ഉപകരണം"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"പ്ലേ ചെയ്യാൻ ഉപകരണം സജീവമാക്കുക"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ഉപകരണത്തിന് പ്ലേ ചെയ്യാനുള്ള അനുമതിയില്ല"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ഈ മീഡിയ ഇവിടെ പ്ലേ ചെയ്യാൻ കഴിയില്ല"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്റ്റ് ചെയ്യുന്നതിൽ പ്രശ്നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
<string name="help_label" msgid="3528360748637781274">"സഹായവും ഫീഡ്ബാക്കും"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index be3e2370..dba6d8d 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Идэвхтэй, батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Идэвхтэй, Зүүн: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Баруун: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Зүүн: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Баруун: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Идэвхтэй"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Идэвхтэй, зөвхөн зүүн тал"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Идэвхтэй, зөвхөн баруун тал"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Идэвхтэй, зүүн болон баруун тал"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Аппыг орчин үеийн форматыг дэмждэг гэж үздэг"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Хөрвүүлгийн мэдэгдэл харуулах"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Хөрвүүлгийн завсрын санах ойг идэвхгүй болгох"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Ажиллаж байгаа үйлчилгээнүүд"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView хэрэгжилт"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Энэ утас"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Энэ таблет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Суурилуулагчийн чанга яригч"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Гадаад төхөөрөмж"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Холбогдсон төхөөрөмж"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Энд тоглуулахын тулд төхөөрөмжийг сэрээнэ үү"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Төхөөрөмжийг тоглуулахыг зөвшөөрөөгүй"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Энэ медиаг энд тоглуулах боломжгүй"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
<string name="help_label" msgid="3528360748637781274">"Тусламж, санал хүсэлт"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 80207db..f6ddef2 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"अॅक्टिव्ह, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"अॅक्टिव्ह, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"अॅक्टिव्ह"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"फक्त डावे अॅक्टिव्ह आहे"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"फक्त उजवे अॅक्टिव्ह आहे"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"डावे आणि उजवे अॅक्टिव्ह आहे"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"असे गृहीत धरा की, ॲप्स आधुनिक फॉरमॅटना सपोर्ट करतात"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिंग सूचना दाखवा"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिंग कॅशे बंद करा"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"सुरू सेवा"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"सध्या सुरू असलेल्या सेवा पहा आणि नियंत्रित करा"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"वेबदृश्य अंमलबजावणी"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"आत्ताच"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"हा फोन"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"हा टॅबलेट"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डॉक स्पीकर"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाह्य डिव्हाइस"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट केलेले डिव्हाइस"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"येथे प्ले करण्यासाठी डिव्हाइस सुरू करा"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"डिव्हाइसला प्ले करण्यासाठी मंजुरी नाही"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"हा मीडिया येथे प्ले करू शकत नाही"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करण्यात समस्या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
<string name="help_label" msgid="3528360748637781274">"मदत आणि फीडबॅक"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7d2ebd1..d1aba52 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktif, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktif, Ki: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ka: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ki: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ka: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktif"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, kiri sahaja"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, kanan sahaja"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Mengambil alih sokongan apl format moden"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Tunjukkan pemberitahuan transpengekodan"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Lumpuhkan cache transpengekodan"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Perkhidmatan dijalankan"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Pelaksanaan WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Sebentar tadi"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Telefon ini"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tablet ini"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Pembesar suara dok"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Peranti Luar"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Peranti yang disambungkan"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Bangkitkan peranti untuk main di sini"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Peranti tidak diluluskan untuk main"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Tidak dapat memainkan media ini di sini"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan & hidupkan kembali peranti"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan & maklum balas"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 484c084..8fa6a73 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ဖွင့်ထားသည်၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"သုံးနေသည်၊ L− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>၊ R− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>၊ R− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ဖွင့်ထားသည်"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ဖွင့်ထားသည်၊ ဘယ်သီးသန့်"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ဖွင့်ထားသည်၊ ညာသီးသန့်"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ဖွင့်ထားသည်၊ ဘယ်နှင့် ညာ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ဤအက်ပ်များက ဖော်မက်အသစ်များကို ပံ့ပိုးသည်"</string>
<string name="transcode_notification" msgid="5560515979793436168">"အမျိုးအစားပြောင်းခြင်း အကြောင်းကြားချက်များကို ပြရန်"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"အမျိူးအစားပြောင်းခြင်း ကက်ရှ်ကို ပိတ်ရန်"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"လက်ရှိ ဝန်ဆောင်မှုများကို ကြည့်ရှု ထိန်းသိမ်းသည်"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView အကောင်အထည်ဖော်မှု"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ဤဖုန်း"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ဤတက်ဘလက်"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"အထိုင် စပီကာ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ပြင်ပစက်"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"ချိတ်ဆက်ကိရိယာ"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ဒီမှာဖွင့်ရန် စက်ပစ္စည်းကိုနှိုးပါ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"စက်ပစ္စည်းက ဖွင့်ခွင့်မပြုပါ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ဤမီဒီယာကို ဒီမှာဖွင့်၍မရပါ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
<string name="help_label" msgid="3528360748637781274">"အကူအညီနှင့် အကြံပြုချက်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 816966c..84ba728 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bare venstre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bare høyre"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og høyre"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Anta at apper støtter moderne formater"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Vis omkodingsvarsler"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Slå av omkodingsbuffer"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive tjenester"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Se og kontroller tjenester som kjører"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Denne telefonen"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Dette nettbrettet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokkhøyttaler"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ekstern enhet"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Tilkoblet enhet"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Vekk enheten for å spille her"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Enheten er ikke godkjent til å spille av"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Kan ikke spille av dette her"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
<string name="help_label" msgid="3528360748637781274">"Hjelp og tilbakemelding"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 415e2aa..4e6d87f 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"सक्रिय, ब्याट्रीको स्तर: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"सक्रिय, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ब्याट्रीको स्तर: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"सक्रिय"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"बायाँ मात्र अन छ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सक्रिय, दायाँ मात्र"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"सक्रिय, बायाँ र दायाँ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"एपहरूमा आधुनिक फर्म्याट प्रयोग गर्न मिल्छ भनी मान्नुहोस्"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिङसम्बन्धी सूचना देखाइयोस्"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिङको क्यास अफ गर्नुहोस्"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"चलिरहेका सेवाहरू"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView कार्यान्वयन"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"अहिले भर्खरै"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"यो फोन"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"यो ट्याब्लेट"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डक स्पिकर"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाह्य डिभाइस"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट गरिएको डिभाइस"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"यो मिडिया यहाँ प्ले गर्न डिभाइस सक्रिय गर्नुहोस्"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"यो डिभाइसलाई मिडिया प्ले गर्ने अनुमति छैन"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"यो मिडिया यसमा प्ले गर्न मिल्दैन"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि अन गर्नुहोस्"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
<string name="help_label" msgid="3528360748637781274">"मद्दत र प्रतिक्रिया"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index bd5d7f7..f20cb97 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actief, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterij"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actief, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Links <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Rechts <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actief"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Opgeslagen"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actief, alleen links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actief, alleen rechts"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actief, links en rechts"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Aannemen dat apps moderne indelingen ondersteunen"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Transcoderingsmeldingen tonen"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Transcodering van cache uitzetten"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Actieve services"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Bekijk en beheer services die momenteel actief zijn"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementatie"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Deze telefoon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Deze tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockspeaker"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Extern apparaat"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Verbonden apparaat"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activeer het apparaat om hier af te spelen"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Apparaat niet goedgekeurd voor afspelen"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Kan deze media hier niet afspelen"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en feedback"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index d93a7a0..534d217 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ସକ୍ରିୟ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ସକ୍ରିୟ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବ୍ୟାଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ବେଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବ୍ୟାଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ବାମ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ଡାହାଣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ସକ୍ରିୟ"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"ସେଭ କରାଯାଇଛି"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ସକ୍ରିୟ, କେବଳ ବାମ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ସକ୍ରିୟ, କେବଳ ଡାହାଣ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ସକ୍ରିୟ, ବାମ ଏବଂ ଡାହାଣ"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ଧରିନିଅନ୍ତୁ ଆପଗୁଡ଼ିକ ଆଧୁନିକ ଫର୍ମାଟଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ଟ୍ରାନ୍ସକୋଡିଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ଟ୍ରାନ୍ସକୋଡିଂ କ୍ୟାଶକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"ୱେବ୍ଭ୍ୟୁ ପ୍ରୟୋଗ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ଏହି ଫୋନ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ଏହି ଟାବଲେଟ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ଡକ ସ୍ପିକର"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ଏକ୍ସଟର୍ନଲ ଡିଭାଇସ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"କନେକ୍ଟ କରାଯାଇଥିବା ଡିଭାଇସ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ଏଠାରେ ପ୍ଲେ କରିବା ପାଇଁ ଡିଭାଇସକୁ ସକ୍ରିୟ କରନ୍ତୁ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ପ୍ଲେ କରିବା ପାଇଁ ଡିଭାଇସକୁ ଅନୁମୋଦନ କରାଯାଇନାହିଁ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ଏଠାରେ ମିଡିଆ ପ୍ଲେ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
<string name="help_label" msgid="3528360748637781274">"ସାହାଯ୍ୟ ଓ ମତାମତ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index e9242c8..f0f656ef 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ਕਿਰਿਆਸ਼ੀਲ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ਕਿਰਿਆਸ਼ੀਲ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ਕਿਰਿਆਸ਼ੀਲ"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਖੱਬਾ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਸੱਜਾ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ਕਿਰਿਆਸ਼ੀਲ, ਖੱਬਾ ਅਤੇ ਸੱਜਾ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ਮੰਨ ਲਓ ਕਿ ਐਪਾਂ ਆਧੁਨਿਕ ਫਾਰਮੈਟਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀਆਂ ਹਨ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਕੈਸ਼ੇ ਬੰਦ ਕਰੋ"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲੀਕਰਨ"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ਇਹ ਟੈਬਲੈੱਟ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ਡੌਕ ਸਪੀਕਰ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ਬਾਹਰੀ ਡੀਵਾਈਸ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ਇੱਥੇ ਮੀਡੀਆ ਚਲਾਉਣ ਲਈ ਡੀਵਾਈਸ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ਡੀਵਾਈਸ ਨੂੰ ਮੀਡੀਆ ਚਲਾਉਣ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ਇਸ ਮੀਡੀਆ ਨੂੰ ਇੱਥੇ ਨਹੀਂ ਚਲਾਇਆ ਜਾ ਸਕਦਾ"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
<string name="help_label" msgid="3528360748637781274">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 02224fb..af9b73f 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktywne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterii"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktywna, L: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Urządzenie aktywne"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktywne, tylko lewa strona"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktywne, tylko prawa strona"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktywny, lewa i prawa strona"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Zakładaj, że aplikacje obsługują nowoczesne formaty"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Pokaż powiadomienia transkodowania"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Wyłącz pamięć podręczną transkodowania"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Uruchomione usługi"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Wyświetl obecnie uruchomione usługi i nimi zarządzaj"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacja WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Przed chwilą"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ten telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ten tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Głośnik ze stacją dokującą"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Urządzenie zewnętrzne"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Połączone urządzenie"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Wybudź, aby tu odtworzyć"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Urządzenie nie ma uprawnień do odtwarzania"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Nie można odtworzyć tego pliku multimedialnego"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoc i opinie"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 3ee80e5..78e8679 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este telefone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Alto-falante da base"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Ativar dispositivo para tocar aqui"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"O dispositivo não foi aprovado para reprodução"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Não é possível reproduzir essa mídia aqui"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 091d1a8..1be30d1 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Guardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Assumir que as apps suportam formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache de transcodificação"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços actualmente em execução"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este telemóvel"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altifalante estação carregam."</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo associado"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Ative o dispositivo para reproduzir aqui"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Dispositivo não aprovado para reprodução"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Não é possível reproduzir este conteúdo multimédia aqui"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e comentários"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 3ee80e5..78e8679 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este telefone"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Alto-falante da base"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Ativar dispositivo para tocar aqui"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"O dispositivo não foi aprovado para reprodução"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Não é possível reproduzir essa mídia aqui"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index f0b75ad..4c6fef6 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activ, baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activ"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activ, numai stânga"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activ, numai dreapta"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activ, stânga și dreapta"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Presupune că aplicațiile acceptă formatele moderne"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Vezi notificările privind transcodarea"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Dezactivează memoria cache pentru transcodare"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Servicii în curs de funcționare"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Vezi și controlează serviciile care funcționează în prezent"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementare WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Acest telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Această tabletă"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Difuzorul dispozitivului de andocare"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispozitiv extern"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispozitiv conectat"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activează dispozitivul pentru a reda aici"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Dispozitivul nu este aprobat pentru redare"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Conținutul media nu poate fi redat aici"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Oprește și repornește dispozitivul."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
<string name="help_label" msgid="3528360748637781274">"Ajutor și feedback"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 33697eb..ec64802 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активно. Заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно. Л: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; П: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Уровень заряда: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; П: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активно"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активен, только левое ухо"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активен, только правое ухо"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активен, оба уха"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Считать, что приложения поддерживают современные форматы кодирования"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показывать уведомления о перекодировании"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Отключить кеш перекодирования"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Работающие службы"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Просмотр работающих служб и управление ими"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Сервис WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Только что"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Этот смартфон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Этот планшет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Колонка с док-станцией"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Внешнее устройство"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Подключенное устройство"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Для воспроизведения выведите устройство из спящего режима."</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Для воспроизведения необходима авторизация."</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Невозможно воспроизвести медиафайл."</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
<string name="help_label" msgid="3528360748637781274">"Справка/отзыв"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index e198c5b..2aa69e5 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ක්රියාකාරී, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ක්රියාත්මක, ව: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ද: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ව: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ද: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ක්රියාකාරී"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"සක්රිය, වම පමණි"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"සක්රිය, දකුණ පමණි"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"සක්රිය, වම සහ දකුණ"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"යෙදුම් නවීන ආකෘති සඳහා සහාය දක්වයි යැයි උපකල්පනය කරමු"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ට්රාන්ස්කෝඩින් දැනුම්දීම් පෙන්වන්න"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ට්රාන්ස්කොඩින් හැඹිලිය අබල කරන්න"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"ධාවනය වන සේවා"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ක්රියාත්මක කිරීම"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"මේ දැන්"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"මෙම දුරකථනය"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"මෙම ටැබ්ලටය"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ඩොක් ස්පීකරය"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"බාහිර උපාංගය"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"සම්බන්ධ කළ උපාංගය"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"මෙහි වාදනය කිරීමට උපාංගය අවදි කරන්න"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"උපාංගය වාදනය කිරීමට අනුමත කර නැත"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"මෙම මාධ්ය මෙහි වාදනය කළ නොහැක"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්රියාවිරහිත කර & ආපසු ක්රියාත්මක කරන්න"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
<string name="help_label" msgid="3528360748637781274">"උදවු & ප්රතිපෝෂණ"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 95dd4ae..1f5ebff 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktívne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktívne, Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktívne"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktívne, iba ľavá strana"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktívne, iba pravá strana"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktívne, ľavá aj pravá strana"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Prepdokladať, že aplikácie podporujú moderné formáty"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Zobraziť upozornenia prekódovania"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktivácia vyrovnávacej pamäte prekódovania"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Spustené služby"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Zobrazovať a riadiť aktuálne spustené služby"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementácia WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tento telefón"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tento tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Reproduktor doku"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externé zariadenie"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pripojené zariadenie"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Ak chcete prehrávať obsah tu, prebuďte zariadenie"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Prehrávanie v tomto zariadení nie je schválené"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Médium sa tu nedá prehrať"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
<string name="help_label" msgid="3528360748637781274">"Pomocník a spätná väzba"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 0a046c4..4809cbb 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivno, baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivna"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo levo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, levo in desno"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Aplikacije naj bi podpirale sodobne oblike zapisov"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Prikaz obvestil o prekodiranju"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogoči predpomnilnik za prekodiranje"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Zagnane storitve"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Preglejte in nadzorujte storitve, ki so trenutno zagnane."</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Izvedba spletnega pogleda"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Pravkar"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ta telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ta tablični računalnik"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvočnik nosilca"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Zunanja naprava"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezana naprava"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Zbudite napravo za predvajanje tu"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Naprava ni odobrena za predvajanje."</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Te predstavnosti ni mogoče predvajati tukaj."</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoč in povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 4b977d5..627ad8f 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, L: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktive, vetëm majtas"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktive, vetëm djathtas"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktive, majtas dhe djathtas"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Supozo se aplikacionet i mbështetin formatet moderne"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Shfaq njoftimet e transkodimit"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Çaktivizo memorien specifike të transkodimit"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Shërbimet në ekzekutim"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Zbatimi i WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ky telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ky tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altoparlanti i stacionit"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Pajisja e jashtme"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pajisja e lidhur"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Riaktivizoje pajisjen për të luajtur këtu"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Pajisja nuk është miratuar për të luajtur"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Kjo media nuk mund të luhet këtu"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
<string name="help_label" msgid="3528360748637781274">"Ndihma dhe komentet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 1f7745f..4bac270 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активан, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно, Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батерија, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Лева <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Десна <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активан"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Сачувано"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само с леве стране"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, с десне стране"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, с леве и десне стране"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Подразумевај да апликације подржавају модерне формате"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Приказуј обавештења о транскодирању"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Онемогући кеш транскодирања"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Покренуте услуге"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Приказ и контрола тренутно покренутих услуга"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Примена WebView-а"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Управо"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Овај телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Овај таблет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Звучник базне станице"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Спољни уређај"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Повезани уређај"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Пробудите уређај да бисте пустили овде"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Уређај није одобрен за репродукцију"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Не можете да пустите овај медијски фајл овде"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
<string name="help_label" msgid="3528360748637781274">"Помоћ и повратне информације"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index aeda002..b202635 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bara vänster"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bara höger"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, vänster och höger"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Anta att appar har stöd för moderna format"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Visa aviseringar för omkodning"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Inaktivera cacheminne för omkodning"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Aktiva tjänster"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Visa och styr aktiva tjänster"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Den här telefonen"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Den här surfplattan"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockningsstationens högtalare"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Extern enhet"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ansluten enhet"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Väck enheten för att spela upp här"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Enheten är inte godkänd"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Det går inte att spela upp detta här"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjälp och feedback"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 704cf2a..c63b610 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Inatumika, betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Inatumika, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kushoto <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kulia <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Kimeunganishwa"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Imeokoa"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Inatumika, kushoto pekee"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Inatumika, kulia pekee"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Inatumika, kushoto na kulia"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Chukulia kuwa programu zinatumia miundo ya kisasa"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Onyesha arifa za kubadilisha muundo wa faili"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Zima kipengele cha akiba ya kubadilisha muundo wa faili"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Huduma zinazoendeshwa"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Onyesha na udhibiti huduma zinazoendeshwa kwa sasa"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Utekelezaji wa WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Simu hii"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Kompyuta kibao hii"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Spika ya kituo"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Kifaa cha Nje"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Kifaa kilichounganishwa"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Washa skrini ya kifaa ili ucheze maudhui hapa"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Kifaa hakijaidhinishwa ili kucheza maudhui"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Huwezi kucheza maudhui haya hapa"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
<string name="help_label" msgid="3528360748637781274">"Usaidizi na maoni"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 7ab577c..49351e8 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"செயலில் உள்ளது, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"செயலில் உள்ளது, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"செயலில் உள்ளது"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"இடது பக்கம் மட்டும் செயலில் உள்ளது"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"வலது பக்கம் மட்டும் செயலில் உள்ளது"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"வலது மற்றும் இடது பக்கம் செயலில் உள்ளது"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ஆப்ஸ் மாடர்ன் வடிவங்களை ஆதரிக்கும்படி அமை"</string>
<string name="transcode_notification" msgid="5560515979793436168">"குறிமாற்ற அறிவிப்புகளைக் காட்டு"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"குறிமாற்றத்திற்கான தற்காலிக சேமிப்பை முடக்குதல்"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"இயங்கும் சேவைகள்"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView செயல்படுத்தல்"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"இந்த மொபைல்"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"இந்த டேப்லெட்"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"டாக் ஸ்பீக்கர்"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"வெளிப்புறச் சாதனம்"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"இணைக்கப்பட்டுள்ள சாதனம்"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"இங்கே பிளே செய்ய உங்கள் சாதனத்தைச் சார்ஜ் செய்யுங்கள்"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"பிளே செய்வதற்குச் சாதனம் அனுமதிக்கப்படவில்லை"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"இந்த மீடியாவை இங்கே பிளே செய்ய முடியவில்லை"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
<string name="help_label" msgid="3528360748637781274">"உதவியும் கருத்தும்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 8e6e635..89e7bb7 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"యాక్టివ్గా ఉంది, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"యాక్టివ్, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ఎడమ వైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"కుడి వైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"యాక్టివ్గా ఉంది"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"సేవ్ చేయబడింది"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"యాక్టివ్గా ఉంది, ఎడమవైపు మాత్రమే యాక్టివ్గా ఉంది"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"యాక్టివ్గా ఉంది, కుడివైపు యాక్టివ్గా ఉంది"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"యాక్టివ్గా ఉంది, ఎడమవైపు, కుడివైపు యాక్టివ్గా ఉంది"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"యాప్లు ఆధునిక ఫార్మాట్లకు సపోర్ట్ చేస్తాయని అనుకోండి"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ట్రాన్స్కోడింగ్ నోటిఫికేషన్లను చూపండి"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ట్రాన్స్కోడింగ్ కాష్ను డిజేబుల్ చేయండి"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"అమలులో ఉన్న సర్వీస్లు"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ప్రస్తుతం అమలులో ఉన్న సర్వీస్లను చూడండి, కంట్రోల్ చేయండి"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"వెబ్ వీక్షణ అమలు"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ఇప్పుడే"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ఈ ఫోన్"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ఈ టాబ్లెట్"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"డాక్ స్పీకర్"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"ఎక్స్టర్నల్ పరికరం"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"కనెక్ట్ చేసిన పరికరం"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ఇక్కడ ప్లే చేయడానికి పరికరాన్ని మేల్కొలపండి"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"ప్లే చేయడానికి పరికరానికి అనుమతి లేదు"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"ఈ మీడియాను ఇక్కడ ప్లే చేయడం సాధ్యపడదు."</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
<string name="help_label" msgid="3528360748637781274">"సహాయం & ఫీడ్బ్యాక్"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 5933acb..aecfc6f 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ใช้งานอยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ใช้งานอยู่ L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ฝั่งซ้าย <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ฝั่งขวา <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ใช้งานอยู่"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"บันทึกแล้ว"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ใช้งานอยู่ เฉพาะข้างซ้าย"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ใช้งานอยู่ เฉพาะข้างขวา"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ใช้งานอยู่ ข้างซ้ายและขวา"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"ถือว่าแอปรองรับรูปแบบสมัยใหม่"</string>
<string name="transcode_notification" msgid="5560515979793436168">"แสดงการแจ้งเตือนการแปลง"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ปิดใช้แคชสำหรับการแปลง"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"บริการที่ทำงานอยู่"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"ดูและควบคุมบริการที่ทำงานอยู่"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"การใช้งาน WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"เมื่อสักครู่"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"โทรศัพท์เครื่องนี้"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"แท็บเล็ตเครื่องนี้"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"แท่นวางลำโพง"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"อุปกรณ์ภายนอก"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"อุปกรณ์ที่เชื่อมต่อ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"ปลุกระบบอุปกรณ์เพื่อเล่นที่นี่"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"อุปกรณ์ไม่อนุมัติให้เล่น"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"เล่นสื่อนี้ที่นี่ไม่ได้"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
<string name="help_label" msgid="3528360748637781274">"ความช่วยเหลือและความคิดเห็น"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index a268dc6..c579dea 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktibo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktibo, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kaliwa <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktibo"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"Na-save"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, kaliwa lang"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, kanan lang"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, kaliwa at kanan"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Ipagpalagay na sinusuportahan ng mga app ang mga modernong format"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Ipakita ang mga notification sa pag-transcode"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"I-disable ang cache ng pag-transcode"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Mga tumatakbong serbisyo"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Pagpapatupad sa WebView"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Ngayon lang"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ang teleponong ito"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ang tablet na ito"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Speaker ng dock"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"External na Device"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Nakakonektang device"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"I-wake ang device para i-play dito"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Hindi naaprubahan ang device para sa pag-play"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Hindi ma-play ang media na ito rito"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Tulong at feedback"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 9d4502f..64cb61b 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Etkin, pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Etkin, Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Etkin"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Yalnızca sol tarafta etkin"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Yalnızca sağ tarafta etkin"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Sol ve sağ tarafta etkin"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Uygulamaların modern biçimleri desteklediğini varsay"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Kod dönüştürme bildirimlerini göster"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Kod dönüştürme önbelleğini devre dışı bırak"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Çalışan hizmetler"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Web Görünümü kullanımı"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Bu tablet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Yuva hoparlörü"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Harici Cihaz"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Bağlı cihaz"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Burada oynatmak için cihazı uyandırın"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Cihaz, oynatma işlemini onaylamadı"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Bu medya burada oynatılamıyor"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım ve geri bildirim"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 9d1fa4c..a52a5e72 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активовано, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активний. Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, П: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, П: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активовано"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активовано, лише лівий"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активовано, лише правий"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активовано, лівий і правий"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Вважати, що додатки підтримують сучасні формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показувати сповіщення про перекодування"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Вимкнути кеш перекодування"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Запущені сервіси"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Переглянути й налаштувати запущені сервіси"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Застосування WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Цей телефон"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Цей планшет"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Динамік док-станції"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Зовнішній пристрій"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Підключений пристрій"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Виведіть із режиму сну, щоб відтворювати"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Не схвалено для відтворення"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Цей медіаконтент не підтримується"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
<string name="help_label" msgid="3528360748637781274">"Довідка й відгуки"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 94f09a6..0d4dc6c4 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"فعال، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"فعال، بائيں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، دائیں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"بائيں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، دائیں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> چھوڑ دیا"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"دائیں <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"فعال"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"محفوظ ہے"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، صرف بائیں طرف"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، صرف دائیں طرف"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، صرف بائیں اور دائیں طرف"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"فرض کریں کہ ایپس جدید فارمیٹس کو سپورٹ کرتی ہیں"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ٹرانسکوڈنگ اطلاعات دکھائیں"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ٹرانسکوڈنگ کیش غیر فعال کریں"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"چل رہی سروسز"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView کا نفاذ"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ابھی ابھی"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"یہ فون"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"یہ ٹیبلیٹ"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ڈاک اسپیکر"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"بیرونی آلہ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"منسلک آلہ"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"یہاں چلانے کے لیے آلہ کو اٹھائیں"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"آلہ کو چلانے کے لیے اجازت نہیں دی گئی ہے"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"یہاں اس میڈیا کو چلایا نہیں جا سکتا"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
<string name="help_label" msgid="3528360748637781274">"مدد اور تاثرات"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 446c0fd..2be1fcd 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Faol, batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Faol, L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Faol"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Faol, faqat chap"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Faol, faqat oʻng"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Faol, chap va oʻng"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Ilovalarda zamonaviy kodlash formatlari ishlaydi deb hisoblash"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Transkripsiya bildirishnomalarini chiqarish"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Transkripsiya keshini faolsizlantirish"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Ishlab turgan ilovalar"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ta’minotchisi"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Shu telefon"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Shu planshet"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok-stansiyali karnay"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Tashqi qurilma"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ulangan qurilma"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Ijro etish uchun qurilmani uyqu rejimidan chiqaring."</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Qurilmada ijro ruxsati yoʻq"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Media fayl ijro etilmaydi"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
<string name="help_label" msgid="3528360748637781274">"Yordam/fikr-mulohaza"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 0285619..bc903d7 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Đang hoạt động, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Đang hoạt động, Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Đang hoạt động"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Đang hoạt động, chỉ tai bên trái"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Đang hoạt động, chỉ tai phải"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Đang hoạt động, cả tai phải và tai trái"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Giả định rằng các ứng dụng hỗ trợ định dạng hiện đại"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Hiện thông báo chuyển mã"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Vô hiệu hóa bộ nhớ đệm dùng để chuyển mã"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Các dịch vụ đang chạy"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Xem và kiểm soát các dịch vụ đang chạy"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Triển khai WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Điện thoại này"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Máy tính bảng này"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Loa có gắn đế"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Thiết bị bên ngoài"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Thiết bị đã kết nối"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Đánh thức thiết bị để phát tại đây"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Thiết bị chưa được phép phát"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Không thể phát nội dung nghe nhìn này tại đây"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
<string name="help_label" msgid="3528360748637781274">"Trợ giúp và phản hồi"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index db8fc1d..007c797 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -97,8 +97,12 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,电池电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"使用中,左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 电量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 电量"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 的电量"</string>
+ <string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>;右:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左耳机电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右耳机电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
+ <string name="bluetooth_saved_device" msgid="4895871321722311428">"已保存的设备"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,仅左耳助听器"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,仅右耳助听器"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳助听器"</string>
@@ -432,6 +436,12 @@
<string name="transcode_default" msgid="3784803084573509491">"假设应用支持现代格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"显示转码通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用转码缓存"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"正在运行的服务"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"查看和控制当前正在运行的服务"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 实现"</string>
@@ -542,6 +552,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"这部手机"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"这台平板电脑"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"基座音箱"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部设备"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"连接的设备"</string>
@@ -553,6 +565,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"若要在此设备上播放,请唤醒设备"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"设备未获准播放"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"无法在此设备上播放该媒体内容"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
<string name="help_label" msgid="3528360748637781274">"帮助和反馈"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 84cab33..f454a68 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"已啟用,左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新型格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"執行中的服務"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並控制目前正在執行中的服務"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 設置"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"此手機"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"此平板電腦"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"插座喇叭"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部裝置"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"已連接的裝置"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"必須喚醒裝置才能在此播放"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"裝置未獲核准播放"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"無法在此播放此媒體內容"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見反映"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index f1fbc03..1d04030 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"已啟用,左:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"正在運作的服務"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並管理目前正在執行的服務"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 實作"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"這支手機"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"這台平板電腦"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"座架喇叭"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部裝置"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"已連結的裝置"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"必須喚醒裝置才能在此播放"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"裝置未獲准播放"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"無法在此播放這個媒體內容"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見回饋"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index cb89d4e..c0c3b48 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -97,8 +97,16 @@
<string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Kuyasebenza, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Kuyasebenza, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ibhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
+ <!-- no translation found for tv_bluetooth_battery_level (8786353985605532846) -->
+ <skip />
<string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ibhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered_left (2952823007648782646) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (6525710737740083276) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Iyasebenza"</string>
+ <!-- no translation found for bluetooth_saved_device (4895871321722311428) -->
+ <skip />
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Iyasebenza, ngakwesokunxele kuphela"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Iyasebenza, ngakwesokudla kuphela"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Iyasebenza, ngakwesokunxele nakwesokudla"</string>
@@ -432,6 +440,12 @@
<string name="transcode_default" msgid="3784803084573509491">"Kuthathe njengokungathi izinhlelo zokusebenza zisekela amafomethi esimanje"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Bonisa izaziso zokudlulisela ikhodi"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Khubaza inqolobane yokudlulisela ikhodi"</string>
+ <!-- no translation found for widevine_settings_title (4023329801172572917) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_title (4987972688770202547) -->
+ <skip />
+ <!-- no translation found for force_l3_fallback_summary (3080790841069996016) -->
+ <skip />
<string name="runningservices_settings_title" msgid="6460099290493086515">"Amasevisi asebenzayo"</string>
<string name="runningservices_settings_summary" msgid="1046080643262665743">"Buka futhi ulawule amasevisi asebenzayo okwamanje"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Ukufakwa ke-WebView"</string>
@@ -542,6 +556,8 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Le foni"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Le thebulethi"</string>
+ <!-- no translation found for media_transfer_this_device_name (8899776297775466649) -->
+ <skip />
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Isipikha sentuba"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Idivayisi Yangaphandle"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Idivayisi exhunyiwe"</string>
@@ -553,6 +569,22 @@
<string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Vusa idivayisi ukuze udlale lapha"</string>
<string name="media_output_status_unauthorized" msgid="5880222828273853838">"Idivayisi ayigunyaziwe ukuthi idlale"</string>
<string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Awukwazi ukudlala le midiya lapha"</string>
+ <!-- no translation found for tv_media_transfer_connected (5145011475885290725) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_fallback_title (3674360098755328601) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_fallback_title (3098685494578519940) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_arc_subtitle (1040017851325069082) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_earc_subtitle (645191413103303077) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_default (38102257053315304) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (2229000864416329818) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (2433193551482972117) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
<string name="help_label" msgid="3528360748637781274">"Usizo nempendulo"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryUtils.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryUtils.java
index 88dcc0d..83c106b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryUtils.java
@@ -16,9 +16,16 @@
package com.android.settingslib.fuelgauge;
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.provider.Settings;
+import android.util.ArraySet;
+import android.view.accessibility.AccessibilityManager;
+
+import java.util.List;
public final class BatteryUtils {
@@ -30,4 +37,35 @@
return context.registerReceiver(
/*receiver=*/ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
+
+ /** Gets the current active accessibility related packages. */
+ public static ArraySet<String> getA11yPackageNames(Context context) {
+ context = context.getApplicationContext();
+ final ArraySet<String> packageNames = new ArraySet<>();
+ final String defaultTtsPackageName = Settings.Secure.getString(
+ context.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH);
+ if (defaultTtsPackageName != null) {
+ packageNames.add(defaultTtsPackageName);
+ }
+ // Checks the current active packages.
+ final AccessibilityManager accessibilityManager =
+ context.getSystemService(AccessibilityManager.class);
+ if (!accessibilityManager.isEnabled()) {
+ return packageNames;
+ }
+ final List<AccessibilityServiceInfo> serviceInfoList =
+ accessibilityManager.getEnabledAccessibilityServiceList(
+ AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
+ if (serviceInfoList == null || serviceInfoList.isEmpty()) {
+ return packageNames;
+ }
+ for (AccessibilityServiceInfo serviceInfo : serviceInfoList) {
+ final ComponentName serviceComponent = ComponentName.unflattenFromString(
+ serviceInfo.getId());
+ if (serviceComponent != null) {
+ packageNames.add(serviceComponent.getPackageName());
+ }
+ }
+ return packageNames;
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatteryUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatteryUtilsTest.java
new file mode 100644
index 0000000..c3e0c0b
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatteryUtilsTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 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.settingslib.fuelgauge;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadows.ShadowAccessibilityManager;
+
+import java.util.Arrays;
+
+@RunWith(RobolectricTestRunner.class)
+public class BatteryUtilsTest {
+ private static final String DEFAULT_TTS_PACKAGE = "com.abc.talkback";
+ private static final String ACCESSIBILITY_PACKAGE = "com.def.talkback";
+
+ private Context mContext;
+ private AccessibilityManager mAccessibilityManager;
+ private ShadowAccessibilityManager mShadowAccessibilityManager;
+
+ @Mock
+ private AccessibilityServiceInfo mAccessibilityServiceInfo1;
+ @Mock
+ private AccessibilityServiceInfo mAccessibilityServiceInfo2;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ doReturn(mContext).when(mContext).getApplicationContext();
+ mAccessibilityManager = spy(mContext.getSystemService(AccessibilityManager.class));
+ mShadowAccessibilityManager = shadowOf(mAccessibilityManager);
+ doReturn(mAccessibilityManager).when(mContext)
+ .getSystemService(AccessibilityManager.class);
+
+ setTtsPackageName(DEFAULT_TTS_PACKAGE);
+ doReturn(Arrays.asList(mAccessibilityServiceInfo1, mAccessibilityServiceInfo2))
+ .when(mAccessibilityManager)
+ .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
+ doReturn(ACCESSIBILITY_PACKAGE + "/.TalkbackService").when(mAccessibilityServiceInfo1)
+ .getId();
+ doReturn("dummy_package_name").when(mAccessibilityServiceInfo2).getId();
+ }
+
+ @Test
+ public void getBatteryIntent_registerReceiver() {
+ BatteryUtils.getBatteryIntent(mContext);
+ verify(mContext).registerReceiver(eq(null), any(IntentFilter.class));
+ }
+
+ @Test
+ public void getA11yPackageNames_returnDefaultTtsPackageName() {
+ mShadowAccessibilityManager.setEnabled(false);
+
+ assertThat(BatteryUtils.getA11yPackageNames(mContext))
+ .containsExactly(DEFAULT_TTS_PACKAGE);
+ }
+
+ @Test
+ public void getA11yPackageNames_returnExpectedPackageNames() {
+ mShadowAccessibilityManager.setEnabled(true);
+
+ assertThat(BatteryUtils.getA11yPackageNames(mContext))
+ .containsExactly(DEFAULT_TTS_PACKAGE, ACCESSIBILITY_PACKAGE);
+ }
+
+ private void setTtsPackageName(String defaultTtsPackageName) {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.TTS_DEFAULT_SYNTH, defaultTtsPackageName);
+ }
+}
diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING
index d306911..28539dd 100644
--- a/packages/SystemUI/TEST_MAPPING
+++ b/packages/SystemUI/TEST_MAPPING
@@ -32,20 +32,6 @@
]
},
{
- // TODO(b/251476085): Consider merging with SystemUIGoogleScreenshotTests (in U+)
- "name": "SystemUIGoogleBiometricsScreenshotTests",
- "options": [
- {
- "exclude-annotation": "org.junit.Ignore"
- },
- {
- "exclude-annotation": "androidx.test.filters.FlakyTest"
- }
- ],
- // The test doesn't run on AOSP Cuttlefish
- "keywords": ["internal"]
- },
- {
// Permission indicators
"name": "CtsPermissionUiTestCases",
"options": [
@@ -73,6 +59,7 @@
]
}
],
+
"auto-end-to-end-postsubmit": [
{
"name": "AndroidAutomotiveHomeTests",
@@ -91,6 +78,7 @@
]
}
],
+
"postsubmit": [
{
// Permission indicators
@@ -116,6 +104,7 @@
]
}
],
+
// v2/sysui/suite/test-mapping-sysui-screenshot-test
"sysui-screenshot-test": [
{
@@ -151,8 +140,27 @@
"exclude-annotation": "android.platform.test.annotations.Postsubmit"
}
]
+ },
+ {
+ // TODO(b/251476085): Consider merging with SystemUIGoogleScreenshotTests (in U+)
+ "name": "SystemUIGoogleBiometricsScreenshotTests",
+ "options": [
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.Postsubmit"
+ }
+ ]
}
],
+
// v2/sysui/suite/test-mapping-sysui-screenshot-test-staged
"sysui-screenshot-test-staged": [
{
@@ -188,6 +196,22 @@
"include-annotation": "android.platform.test.annotations.Postsubmit"
}
]
+ },
+ { "name": "SystemUIGoogleBiometricsScreenshotTests",
+ "options": [
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ },
+ {
+ "include-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Postsubmit"
+ }
+ ]
}
]
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt
index 041fc48..009f8bb 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt
@@ -36,7 +36,7 @@
fun SceneScope.animateSharedIntAsState(
value: Int,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
canOverflow: Boolean = true,
): State<Int> {
return animateSharedValueAsState(value, key, element, ::lerp, canOverflow)
@@ -65,7 +65,7 @@
fun SceneScope.animateSharedFloatAsState(
value: Float,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
canOverflow: Boolean = true,
): State<Float> {
return animateSharedValueAsState(value, key, element, ::lerp, canOverflow)
@@ -94,7 +94,7 @@
fun SceneScope.animateSharedDpAsState(
value: Dp,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
canOverflow: Boolean = true,
): State<Dp> {
return animateSharedValueAsState(value, key, element, ::lerp, canOverflow)
@@ -123,7 +123,7 @@
fun SceneScope.animateSharedColorAsState(
value: Color,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
): State<Color> {
return animateSharedValueAsState(value, key, element, ::lerp, canOverflow = false)
}
@@ -145,7 +145,7 @@
internal fun <T> animateSharedValueAsState(
layoutImpl: SceneTransitionLayoutImpl,
scene: Scene,
- element: Element,
+ element: Element?,
key: ValueKey,
value: T,
lerp: (T, T, Float) -> T,
@@ -153,9 +153,9 @@
): State<T> {
val sharedValue =
Snapshot.withoutReadObservation {
- element.sceneValues.getValue(scene.key).sharedValues.getOrPut(key) {
- Element.SharedValue(key, value)
- } as Element.SharedValue<T>
+ val sharedValues =
+ element?.sceneValues?.getValue(scene.key)?.sharedValues ?: scene.sharedValues
+ sharedValues.getOrPut(key) { Element.SharedValue(key, value) } as Element.SharedValue<T>
}
if (value != sharedValue.value) {
@@ -169,7 +169,7 @@
private fun <T> computeValue(
layoutImpl: SceneTransitionLayoutImpl,
- element: Element,
+ element: Element?,
sharedValue: Element.SharedValue<T>,
lerp: (T, T, Float) -> T,
canOverflow: Boolean,
@@ -184,8 +184,14 @@
}
fun sceneValue(scene: SceneKey): Element.SharedValue<T>? {
- val sceneValues = element.sceneValues[scene] ?: return null
- val value = sceneValues.sharedValues[sharedValue.key] ?: return null
+ val sharedValues =
+ if (element == null) {
+ layoutImpl.scene(scene).sharedValues
+ } else {
+ element.sceneValues[scene]?.sharedValues
+ }
+ ?: return null
+ val value = sharedValues[sharedValue.key] ?: return null
return value as Element.SharedValue<T>
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
index abc62c4..eb10afc 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
@@ -29,6 +29,7 @@
import androidx.compose.runtime.snapshots.SnapshotStateMap
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.isSpecified
@@ -110,13 +111,12 @@
}
/** The implementation of [SceneScope.element]. */
-@Composable
@OptIn(ExperimentalComposeUiApi::class)
internal fun Modifier.element(
layoutImpl: SceneTransitionLayoutImpl,
scene: Scene,
key: ElementKey,
-): Modifier {
+): Modifier = composed {
val sceneValues = remember(scene, key) { Element.TargetValues() }
val element =
// Get the element associated to [key] if it was already composed in another scene,
@@ -160,7 +160,7 @@
}
}
- return drawWithContent {
+ drawWithContent {
if (shouldDrawElement(layoutImpl, scene, element)) {
drawContent()
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
index 97d3fff..d0a5f5b 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
@@ -23,11 +23,11 @@
import androidx.compose.foundation.gestures.awaitVerticalTouchSlopOrCancellation
import androidx.compose.foundation.gestures.horizontalDrag
import androidx.compose.foundation.gestures.verticalDrag
-import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.PointerId
@@ -56,7 +56,6 @@
* change in the future.
*/
// TODO(b/291055080): Migrate to the Modifier.Node API.
-@Composable
internal fun Modifier.multiPointerDraggable(
orientation: Orientation,
enabled: Boolean,
@@ -64,7 +63,7 @@
onDragStarted: (startedPosition: Offset, pointersDown: Int) -> Unit,
onDragDelta: (Float) -> Unit,
onDragStopped: (velocity: Float) -> Unit,
-): Modifier {
+): Modifier = composed {
val onDragStarted by rememberUpdatedState(onDragStarted)
val onDragStopped by rememberUpdatedState(onDragStopped)
val onDragDelta by rememberUpdatedState(onDragDelta)
@@ -77,7 +76,7 @@
Velocity(maxF, maxF)
}
- return this.pointerInput(enabled, orientation, maxFlingVelocity) {
+ pointerInput(enabled, orientation, maxFlingVelocity) {
if (!enabled) {
return@pointerInput
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt
index 3fd6828..2e50a71 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt
@@ -23,6 +23,7 @@
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshots.SnapshotStateMap
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.platform.testTag
@@ -44,6 +45,9 @@
var zIndex by mutableFloatStateOf(zIndex)
var size by mutableStateOf(IntSize.Zero)
+ /** The shared values in this scene that are not tied to a specific element. */
+ val sharedValues = SnapshotStateMap<ValueKey, Element.SharedValue<*>>()
+
@Composable
fun Content(modifier: Modifier = Modifier) {
Box(modifier.zIndex(zIndex).onPlaced { size = it.size }.testTag(key.testTag)) {
@@ -60,7 +64,6 @@
private val layoutImpl: SceneTransitionLayoutImpl,
private val scene: Scene,
) : SceneScope {
- @Composable
override fun Modifier.element(key: ElementKey): Modifier {
return element(layoutImpl, scene, key)
}
@@ -69,16 +72,18 @@
override fun <T> animateSharedValueAsState(
value: T,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
lerp: (T, T, Float) -> T,
canOverflow: Boolean
): State<T> {
val element =
- layoutImpl.elements[element]
- ?: error(
- "Element $element is not composed. Make sure to call animateSharedXAsState " +
- "*after* Modifier.element(key)."
- )
+ element?.let { key ->
+ layoutImpl.elements[key]
+ ?: error(
+ "Element $key is not composed. Make sure to call animateSharedXAsState " +
+ "*after* Modifier.element(key)."
+ )
+ }
return animateSharedValueAsState(
layoutImpl,
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneGestureHandler.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneGestureHandler.kt
new file mode 100644
index 0000000..7563e27
--- /dev/null
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneGestureHandler.kt
@@ -0,0 +1,659 @@
+package com.android.compose.animation.scene
+
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.Spring
+import androidx.compose.animation.core.spring
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.unit.Velocity
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.round
+import com.android.compose.nestedscroll.PriorityNestedScrollConnection
+import kotlin.math.absoluteValue
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+
+@VisibleForTesting
+class SceneGestureHandler(
+ private val layoutImpl: SceneTransitionLayoutImpl,
+ internal val orientation: Orientation,
+ private val coroutineScope: CoroutineScope,
+) : GestureHandler {
+ override val draggable: DraggableHandler = SceneDraggableHandler(this)
+
+ override val nestedScroll: SceneNestedScrollHandler = SceneNestedScrollHandler(this)
+
+ private var transitionState
+ get() = layoutImpl.state.transitionState
+ set(value) {
+ layoutImpl.state.transitionState = value
+ }
+
+ /**
+ * The transition controlled by this gesture handler. It will be set as the [transitionState] in
+ * the [SceneTransitionLayoutImpl] whenever this handler is driving the current transition.
+ *
+ * Note: the initialScene here does not matter, it's only used for initializing the transition
+ * and will be replaced when a drag event starts.
+ */
+ private val swipeTransition = SwipeTransition(initialScene = currentScene)
+
+ internal val currentScene: Scene
+ get() = layoutImpl.scene(transitionState.currentScene)
+
+ @VisibleForTesting
+ val isDrivingTransition
+ get() = transitionState == swipeTransition
+
+ @VisibleForTesting
+ var isAnimatingOffset
+ get() = swipeTransition.isAnimatingOffset
+ private set(value) {
+ swipeTransition.isAnimatingOffset = value
+ }
+
+ internal val swipeTransitionToScene
+ get() = swipeTransition._toScene
+
+ /**
+ * The velocity threshold at which the intent of the user is to swipe up or down. It is the same
+ * as SwipeableV2Defaults.VelocityThreshold.
+ */
+ @VisibleForTesting val velocityThreshold = with(layoutImpl.density) { 125.dp.toPx() }
+
+ /**
+ * The positional threshold at which the intent of the user is to swipe to the next scene. It is
+ * the same as SwipeableV2Defaults.PositionalThreshold.
+ */
+ private val positionalThreshold = with(layoutImpl.density) { 56.dp.toPx() }
+
+ internal var gestureWithPriority: Any? = null
+
+ internal fun onDragStarted(pointersDown: Int, startedPosition: Offset?) {
+ if (isDrivingTransition) {
+ // This [transition] was already driving the animation: simply take over it.
+ // Stop animating and start from where the current offset.
+ swipeTransition.stopOffsetAnimation()
+ return
+ }
+
+ val transition = transitionState
+ if (transition is TransitionState.Transition) {
+ // TODO(b/290184746): Better handle interruptions here if state != idle.
+ Log.w(
+ TAG,
+ "start from TransitionState.Transition is not fully supported: from" +
+ " ${transition.fromScene} to ${transition.toScene} " +
+ "(progress ${transition.progress})"
+ )
+ }
+
+ val fromScene = currentScene
+
+ swipeTransition._currentScene = fromScene
+ swipeTransition._fromScene = fromScene
+
+ // We don't know where we are transitioning to yet given that the drag just started, so set
+ // it to fromScene, which will effectively be treated the same as Idle(fromScene).
+ swipeTransition._toScene = fromScene
+
+ swipeTransition.stopOffsetAnimation()
+ swipeTransition.dragOffset = 0f
+
+ // Use the layout size in the swipe orientation for swipe distance.
+ // TODO(b/290184746): Also handle custom distances for transitions. With smaller distances,
+ // we will also have to make sure that we correctly handle overscroll.
+ swipeTransition.absoluteDistance =
+ when (orientation) {
+ Orientation.Horizontal -> layoutImpl.size.width
+ Orientation.Vertical -> layoutImpl.size.height
+ }.toFloat()
+
+ val fromEdge =
+ startedPosition?.let { position ->
+ layoutImpl.edgeDetector.edge(
+ layoutImpl.size,
+ position.round(),
+ layoutImpl.density,
+ orientation,
+ )
+ }
+
+ swipeTransition.actionUpOrLeft =
+ Swipe(
+ direction =
+ when (orientation) {
+ Orientation.Horizontal -> SwipeDirection.Left
+ Orientation.Vertical -> SwipeDirection.Up
+ },
+ pointerCount = pointersDown,
+ fromEdge = fromEdge,
+ )
+
+ swipeTransition.actionDownOrRight =
+ Swipe(
+ direction =
+ when (orientation) {
+ Orientation.Horizontal -> SwipeDirection.Right
+ Orientation.Vertical -> SwipeDirection.Down
+ },
+ pointerCount = pointersDown,
+ fromEdge = fromEdge,
+ )
+
+ if (fromEdge == null) {
+ swipeTransition.actionUpOrLeftNoEdge = null
+ swipeTransition.actionDownOrRightNoEdge = null
+ } else {
+ swipeTransition.actionUpOrLeftNoEdge =
+ (swipeTransition.actionUpOrLeft as Swipe).copy(fromEdge = null)
+ swipeTransition.actionDownOrRightNoEdge =
+ (swipeTransition.actionDownOrRight as Swipe).copy(fromEdge = null)
+ }
+
+ if (swipeTransition.absoluteDistance > 0f) {
+ transitionState = swipeTransition
+ }
+ }
+
+ internal fun onDrag(delta: Float) {
+ if (delta == 0f) return
+
+ swipeTransition.dragOffset += delta
+
+ // First check transition.fromScene should be changed for the case where the user quickly
+ // swiped twice in a row to accelerate the transition and go from A => B then B => C really
+ // fast.
+ maybeHandleAcceleratedSwipe()
+
+ val offset = swipeTransition.dragOffset
+ val fromScene = swipeTransition._fromScene
+
+ // Compute the target scene depending on the current offset.
+ val target = fromScene.findTargetSceneAndDistance(offset)
+
+ if (swipeTransition._toScene.key != target.sceneKey) {
+ swipeTransition._toScene = layoutImpl.scenes.getValue(target.sceneKey)
+ }
+
+ if (swipeTransition._distance != target.distance) {
+ swipeTransition._distance = target.distance
+ }
+ }
+
+ /**
+ * Change fromScene in the case where the user quickly swiped multiple times in the same
+ * direction to accelerate the transition from A => B then B => C.
+ */
+ private fun maybeHandleAcceleratedSwipe() {
+ val toScene = swipeTransition._toScene
+ val fromScene = swipeTransition._fromScene
+
+ // If the swipe was not committed, don't do anything.
+ if (fromScene == toScene || swipeTransition._currentScene != toScene) {
+ return
+ }
+
+ // If the offset is past the distance then let's change fromScene so that the user can swipe
+ // to the next screen or go back to the previous one.
+ val offset = swipeTransition.dragOffset
+ val absoluteDistance = swipeTransition.absoluteDistance
+ if (offset <= -absoluteDistance && swipeTransition.upOrLeft(fromScene) == toScene.key) {
+ swipeTransition.dragOffset += absoluteDistance
+ swipeTransition._fromScene = toScene
+ } else if (
+ offset >= absoluteDistance && swipeTransition.downOrRight(fromScene) == toScene.key
+ ) {
+ swipeTransition.dragOffset -= absoluteDistance
+ swipeTransition._fromScene = toScene
+ }
+
+ // Important note: toScene and distance will be updated right after this function is called,
+ // using fromScene and dragOffset.
+ }
+
+ private class TargetScene(
+ val sceneKey: SceneKey,
+ val distance: Float,
+ )
+
+ private fun Scene.findTargetSceneAndDistance(directionOffset: Float): TargetScene {
+ val upOrLeft = swipeTransition.upOrLeft(this)
+ val downOrRight = swipeTransition.downOrRight(this)
+
+ // Compute the target scene depending on the current offset.
+ return when {
+ directionOffset < 0f && upOrLeft != null -> {
+ TargetScene(
+ sceneKey = upOrLeft,
+ distance = -swipeTransition.absoluteDistance,
+ )
+ }
+ directionOffset > 0f && downOrRight != null -> {
+ TargetScene(
+ sceneKey = downOrRight,
+ distance = swipeTransition.absoluteDistance,
+ )
+ }
+ else -> {
+ TargetScene(
+ sceneKey = key,
+ distance = 0f,
+ )
+ }
+ }
+ }
+
+ internal fun onDragStopped(velocity: Float, canChangeScene: Boolean) {
+ // The state was changed since the drag started; don't do anything.
+ if (!isDrivingTransition) {
+ return
+ }
+
+ fun animateTo(targetScene: Scene, targetOffset: Float) {
+ // If the effective current scene changed, it should be reflected right now in the
+ // current scene state, even before the settle animation is ongoing. That way all the
+ // swipeables and back handlers will be refreshed and the user can for instance quickly
+ // swipe vertically from A => B then horizontally from B => C, or swipe from A => B then
+ // immediately go back B => A.
+ if (targetScene != swipeTransition._currentScene) {
+ swipeTransition._currentScene = targetScene
+ layoutImpl.onChangeScene(targetScene.key)
+ }
+
+ animateOffset(
+ initialVelocity = velocity,
+ targetOffset = targetOffset,
+ targetScene = targetScene.key
+ )
+ }
+
+ val fromScene = swipeTransition._fromScene
+ if (canChangeScene) {
+ // If we are halfway between two scenes, we check what the target will be based on the
+ // velocity and offset of the transition, then we launch the animation.
+
+ val toScene = swipeTransition._toScene
+ if (fromScene == toScene) {
+ // We were not animating.
+ transitionState = TransitionState.Idle(fromScene.key)
+ return
+ }
+
+ // Compute the destination scene (and therefore offset) to settle in.
+ val offset = swipeTransition.dragOffset
+ val distance = swipeTransition.distance
+ if (
+ shouldCommitSwipe(
+ offset,
+ distance,
+ velocity,
+ wasCommitted = swipeTransition._currentScene == toScene,
+ )
+ ) {
+ // Animate to the next scene
+ animateTo(targetScene = toScene, targetOffset = distance)
+ } else {
+ // Animate to the initial scene
+ animateTo(targetScene = fromScene, targetOffset = 0f)
+ }
+ } else {
+ // We are doing an overscroll animation between scenes. In this case, we can also start
+ // from the idle position.
+
+ val startFromIdlePosition = swipeTransition.dragOffset == 0f
+
+ if (startFromIdlePosition) {
+ // If there is a next scene, we start the overscroll animation.
+ val target = fromScene.findTargetSceneAndDistance(velocity)
+ val isValidTarget = target.distance != 0f && target.sceneKey != fromScene.key
+ if (isValidTarget) {
+ swipeTransition._toScene = layoutImpl.scene(target.sceneKey)
+ swipeTransition._distance = target.distance
+
+ animateTo(targetScene = fromScene, targetOffset = 0f)
+ } else {
+ // We will not animate
+ transitionState = TransitionState.Idle(fromScene.key)
+ }
+ } else {
+ // We were between two scenes: animate to the initial scene.
+ animateTo(targetScene = fromScene, targetOffset = 0f)
+ }
+ }
+ }
+
+ /**
+ * Whether the swipe to the target scene should be committed or not. This is inspired by
+ * SwipeableV2.computeTarget().
+ */
+ private fun shouldCommitSwipe(
+ offset: Float,
+ distance: Float,
+ velocity: Float,
+ wasCommitted: Boolean,
+ ): Boolean {
+ fun isCloserToTarget(): Boolean {
+ return (offset - distance).absoluteValue < offset.absoluteValue
+ }
+
+ // Swiping up or left.
+ if (distance < 0f) {
+ return if (offset > 0f || velocity >= velocityThreshold) {
+ false
+ } else {
+ velocity <= -velocityThreshold ||
+ (offset <= -positionalThreshold && !wasCommitted) ||
+ isCloserToTarget()
+ }
+ }
+
+ // Swiping down or right.
+ return if (offset < 0f || velocity <= -velocityThreshold) {
+ false
+ } else {
+ velocity >= velocityThreshold ||
+ (offset >= positionalThreshold && !wasCommitted) ||
+ isCloserToTarget()
+ }
+ }
+
+ private fun animateOffset(
+ initialVelocity: Float,
+ targetOffset: Float,
+ targetScene: SceneKey,
+ ) {
+ swipeTransition.startOffsetAnimation {
+ coroutineScope.launch {
+ if (!isAnimatingOffset) {
+ swipeTransition.offsetAnimatable.snapTo(swipeTransition.dragOffset)
+ }
+ isAnimatingOffset = true
+
+ swipeTransition.offsetAnimatable.animateTo(
+ targetOffset,
+ // TODO(b/290184746): Make this spring spec configurable.
+ spring(
+ stiffness = Spring.StiffnessMediumLow,
+ visibilityThreshold = OffsetVisibilityThreshold
+ ),
+ initialVelocity = initialVelocity,
+ )
+
+ isAnimatingOffset = false
+
+ // Now that the animation is done, the state should be idle. Note that if the state
+ // was changed since this animation started, some external code changed it and we
+ // shouldn't do anything here. Note also that this job will be cancelled in the case
+ // where the user intercepts this swipe.
+ if (isDrivingTransition) {
+ transitionState = TransitionState.Idle(targetScene)
+ }
+ }
+ }
+ }
+
+ private class SwipeTransition(initialScene: Scene) : TransitionState.Transition {
+ var _currentScene by mutableStateOf(initialScene)
+ override val currentScene: SceneKey
+ get() = _currentScene.key
+
+ var _fromScene by mutableStateOf(initialScene)
+ override val fromScene: SceneKey
+ get() = _fromScene.key
+
+ var _toScene by mutableStateOf(initialScene)
+ override val toScene: SceneKey
+ get() = _toScene.key
+
+ override val progress: Float
+ get() {
+ val offset = if (isAnimatingOffset) offsetAnimatable.value else dragOffset
+ if (distance == 0f) {
+ // This can happen only if fromScene == toScene.
+ error(
+ "Transition.progress should be called only when Transition.fromScene != " +
+ "Transition.toScene"
+ )
+ }
+ return offset / distance
+ }
+
+ override val isInitiatedByUserInput = true
+
+ /** The current offset caused by the drag gesture. */
+ var dragOffset by mutableFloatStateOf(0f)
+
+ /**
+ * Whether the offset is animated (the user lifted their finger) or if it is driven by
+ * gesture.
+ */
+ var isAnimatingOffset by mutableStateOf(false)
+
+ // If we are not animating offset, it means the offset is being driven by the user's finger.
+ override val isUserInputOngoing: Boolean
+ get() = !isAnimatingOffset
+
+ /** The animatable used to animate the offset once the user lifted its finger. */
+ val offsetAnimatable = Animatable(0f, OffsetVisibilityThreshold)
+
+ /** Job to check that there is at most one offset animation in progress. */
+ private var offsetAnimationJob: Job? = null
+
+ /** Ends any previous [offsetAnimationJob] and runs the new [job]. */
+ fun startOffsetAnimation(job: () -> Job) {
+ stopOffsetAnimation()
+ offsetAnimationJob = job()
+ }
+
+ /** Stops any ongoing offset animation. */
+ fun stopOffsetAnimation() {
+ offsetAnimationJob?.cancel()
+
+ if (isAnimatingOffset) {
+ isAnimatingOffset = false
+ dragOffset = offsetAnimatable.value
+ }
+ }
+
+ /** The absolute distance between [fromScene] and [toScene]. */
+ var absoluteDistance = 0f
+
+ /**
+ * The signed distance between [fromScene] and [toScene]. It is negative if [fromScene] is
+ * above or to the left of [toScene].
+ */
+ var _distance by mutableFloatStateOf(0f)
+ val distance: Float
+ get() = _distance
+
+ /** The [UserAction]s associated to this swipe. */
+ var actionUpOrLeft: UserAction = Back
+ var actionDownOrRight: UserAction = Back
+ var actionUpOrLeftNoEdge: UserAction? = null
+ var actionDownOrRightNoEdge: UserAction? = null
+
+ fun upOrLeft(scene: Scene): SceneKey? {
+ return scene.userActions[actionUpOrLeft]
+ ?: actionUpOrLeftNoEdge?.let { scene.userActions[it] }
+ }
+
+ fun downOrRight(scene: Scene): SceneKey? {
+ return scene.userActions[actionDownOrRight]
+ ?: actionDownOrRightNoEdge?.let { scene.userActions[it] }
+ }
+ }
+
+ companion object {
+ private const val TAG = "SceneGestureHandler"
+ }
+}
+
+private class SceneDraggableHandler(
+ private val gestureHandler: SceneGestureHandler,
+) : DraggableHandler {
+ override fun onDragStarted(startedPosition: Offset, pointersDown: Int) {
+ gestureHandler.gestureWithPriority = this
+ gestureHandler.onDragStarted(pointersDown, startedPosition)
+ }
+
+ override fun onDelta(pixels: Float) {
+ if (gestureHandler.gestureWithPriority == this) {
+ gestureHandler.onDrag(delta = pixels)
+ }
+ }
+
+ override fun onDragStopped(velocity: Float) {
+ if (gestureHandler.gestureWithPriority == this) {
+ gestureHandler.gestureWithPriority = null
+ gestureHandler.onDragStopped(velocity = velocity, canChangeScene = true)
+ }
+ }
+}
+
+@VisibleForTesting
+class SceneNestedScrollHandler(
+ private val gestureHandler: SceneGestureHandler,
+) : NestedScrollHandler {
+ override val connection: PriorityNestedScrollConnection = nestedScrollConnection()
+
+ private fun Offset.toAmount() =
+ when (gestureHandler.orientation) {
+ Orientation.Horizontal -> x
+ Orientation.Vertical -> y
+ }
+
+ private fun Velocity.toAmount() =
+ when (gestureHandler.orientation) {
+ Orientation.Horizontal -> x
+ Orientation.Vertical -> y
+ }
+
+ private fun Float.toOffset() =
+ when (gestureHandler.orientation) {
+ Orientation.Horizontal -> Offset(x = this, y = 0f)
+ Orientation.Vertical -> Offset(x = 0f, y = this)
+ }
+
+ private fun nestedScrollConnection(): PriorityNestedScrollConnection {
+ // The next potential scene is calculated during the canStart
+ var nextScene: SceneKey? = null
+
+ // This is the scene on which we will have priority during the scroll gesture.
+ var priorityScene: SceneKey? = null
+
+ // If we performed a long gesture before entering priority mode, we would have to avoid
+ // moving on to the next scene.
+ var gestureStartedOnNestedChild = false
+
+ val actionUpOrLeft =
+ Swipe(
+ direction =
+ when (gestureHandler.orientation) {
+ Orientation.Horizontal -> SwipeDirection.Left
+ Orientation.Vertical -> SwipeDirection.Up
+ },
+ pointerCount = 1,
+ )
+
+ val actionDownOrRight =
+ Swipe(
+ direction =
+ when (gestureHandler.orientation) {
+ Orientation.Horizontal -> SwipeDirection.Right
+ Orientation.Vertical -> SwipeDirection.Down
+ },
+ pointerCount = 1,
+ )
+
+ fun findNextScene(amount: Float): SceneKey? {
+ val fromScene = gestureHandler.currentScene
+ return when {
+ amount < 0f -> fromScene.userActions[actionUpOrLeft]
+ amount > 0f -> fromScene.userActions[actionDownOrRight]
+ else -> null
+ }
+ }
+
+ return PriorityNestedScrollConnection(
+ canStartPreScroll = { offsetAvailable, offsetBeforeStart ->
+ gestureStartedOnNestedChild = offsetBeforeStart != Offset.Zero
+
+ val canInterceptPreScroll =
+ gestureHandler.isDrivingTransition &&
+ !gestureStartedOnNestedChild &&
+ offsetAvailable.toAmount() != 0f
+
+ if (!canInterceptPreScroll) return@PriorityNestedScrollConnection false
+
+ nextScene = gestureHandler.swipeTransitionToScene.key
+
+ true
+ },
+ canStartPostScroll = { offsetAvailable, offsetBeforeStart ->
+ val amount = offsetAvailable.toAmount()
+ if (amount == 0f) return@PriorityNestedScrollConnection false
+
+ gestureStartedOnNestedChild = offsetBeforeStart != Offset.Zero
+ nextScene = findNextScene(amount)
+ nextScene != null
+ },
+ canStartPostFling = { velocityAvailable ->
+ val amount = velocityAvailable.toAmount()
+ if (amount == 0f) return@PriorityNestedScrollConnection false
+
+ // We could start an overscroll animation
+ gestureStartedOnNestedChild = true
+ nextScene = findNextScene(amount)
+ nextScene != null
+ },
+ canContinueScroll = { priorityScene == gestureHandler.swipeTransitionToScene.key },
+ onStart = {
+ gestureHandler.gestureWithPriority = this
+ priorityScene = nextScene
+ gestureHandler.onDragStarted(pointersDown = 1, startedPosition = null)
+ },
+ onScroll = { offsetAvailable ->
+ if (gestureHandler.gestureWithPriority != this) {
+ return@PriorityNestedScrollConnection Offset.Zero
+ }
+
+ val amount = offsetAvailable.toAmount()
+
+ // TODO(b/297842071) We should handle the overscroll or slow drag if the gesture is
+ // initiated in a nested child.
+ gestureHandler.onDrag(amount)
+
+ amount.toOffset()
+ },
+ onStop = { velocityAvailable ->
+ if (gestureHandler.gestureWithPriority != this) {
+ return@PriorityNestedScrollConnection Velocity.Zero
+ }
+
+ priorityScene = null
+
+ gestureHandler.onDragStopped(
+ velocity = velocityAvailable.toAmount(),
+ canChangeScene = !gestureStartedOnNestedChild
+ )
+
+ // The onDragStopped animation consumes any remaining velocity.
+ velocityAvailable
+ },
+ )
+ }
+}
+
+/**
+ * The number of pixels below which there won't be a visible difference in the transition and from
+ * which the animation can stop.
+ */
+private const val OffsetVisibilityThreshold = 0.5f
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
index 1f38e70..35d1f90 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
@@ -117,7 +117,7 @@
* TODO(b/291566282): Migrate this to the new Modifier Node API and remove the @Composable
* constraint.
*/
- @Composable fun Modifier.element(key: ElementKey): Modifier
+ fun Modifier.element(key: ElementKey): Modifier
/**
* Create a *movable* element identified by [key].
@@ -142,7 +142,9 @@
*
* @param value the value of this shared value in the current scene.
* @param key the key of this shared value.
- * @param element the element associated with this value.
+ * @param element the element associated with this value. If `null`, this value will be
+ * associated at the scene level, which means that [key] should be used maximum once in the
+ * same scene.
* @param lerp the *linear* interpolation function that should be used to interpolate between
* two different values. Note that it has to be linear because the [fraction] passed to this
* interpolator is already interpolated.
@@ -157,7 +159,7 @@
fun <T> animateSharedValueAsState(
value: T,
key: ValueKey,
- element: ElementKey,
+ element: ElementKey?,
lerp: (start: T, stop: T, fraction: Float) -> T,
canOverflow: Boolean,
): State<T>
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
index fd62659..6618eb0 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
@@ -30,7 +30,6 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshots.SnapshotStateMap
-import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.layout.LookaheadScope
@@ -131,15 +130,19 @@
}
@Composable
- @OptIn(ExperimentalComposeUiApi::class)
internal fun Content(modifier: Modifier) {
+ val horizontalGestureHandler =
+ rememberSceneGestureHandler(layoutImpl = this, Orientation.Horizontal)
+ val verticalGestureHandler =
+ rememberSceneGestureHandler(layoutImpl = this, Orientation.Vertical)
+
Box(
modifier
// Handle horizontal and vertical swipes on this layout.
// Note: order here is important and will give a slight priority to the vertical
// swipes.
- .swipeToScene(layoutImpl = this, Orientation.Horizontal)
- .swipeToScene(layoutImpl = this, Orientation.Vertical)
+ .swipeToScene(horizontalGestureHandler)
+ .swipeToScene(verticalGestureHandler)
.onSizeChanged { size = it }
) {
LookaheadScope {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
index 877ac09..8980df8 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
@@ -16,47 +16,24 @@
package com.android.compose.animation.scene
-import android.util.Log
-import androidx.annotation.VisibleForTesting
-import androidx.compose.animation.core.Animatable
-import androidx.compose.animation.core.Spring
-import androidx.compose.animation.core.spring
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableFloatStateOf
-import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.nestedScroll
-import androidx.compose.ui.unit.Velocity
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.round
-import com.android.compose.nestedscroll.PriorityNestedScrollConnection
-import kotlin.math.absoluteValue
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
/**
* Configures the swipeable behavior of a [SceneTransitionLayout] depending on the current state.
*/
-@Composable
-internal fun Modifier.swipeToScene(
- layoutImpl: SceneTransitionLayoutImpl,
- orientation: Orientation,
-): Modifier {
- val gestureHandler = rememberSceneGestureHandler(layoutImpl, orientation)
-
+internal fun Modifier.swipeToScene(gestureHandler: SceneGestureHandler): Modifier {
/** Whether swipe should be enabled in the given [orientation]. */
fun Scene.shouldEnableSwipes(orientation: Orientation): Boolean =
userActions.keys.any { it is Swipe && it.direction.orientation == orientation }
val currentScene = gestureHandler.currentScene
+ val orientation = gestureHandler.orientation
val canSwipe = currentScene.shouldEnableSwipes(orientation)
val canOppositeSwipe =
currentScene.shouldEnableSwipes(
@@ -84,7 +61,7 @@
}
@Composable
-private fun rememberSceneGestureHandler(
+internal fun rememberSceneGestureHandler(
layoutImpl: SceneTransitionLayoutImpl,
orientation: Orientation,
): SceneGestureHandler {
@@ -101,641 +78,3 @@
return gestureHandler
}
-
-@VisibleForTesting
-class SceneGestureHandler(
- private val layoutImpl: SceneTransitionLayoutImpl,
- internal val orientation: Orientation,
- private val coroutineScope: CoroutineScope,
-) : GestureHandler {
- override val draggable: DraggableHandler = SceneDraggableHandler(this)
-
- override val nestedScroll: SceneNestedScrollHandler = SceneNestedScrollHandler(this)
-
- private var transitionState
- get() = layoutImpl.state.transitionState
- set(value) {
- layoutImpl.state.transitionState = value
- }
-
- /**
- * The transition controlled by this gesture handler. It will be set as the [transitionState] in
- * the [SceneTransitionLayoutImpl] whenever this handler is driving the current transition.
- *
- * Note: the initialScene here does not matter, it's only used for initializing the transition
- * and will be replaced when a drag event starts.
- */
- private val swipeTransition = SwipeTransition(initialScene = currentScene)
-
- internal val currentScene: Scene
- get() = layoutImpl.scene(transitionState.currentScene)
-
- @VisibleForTesting
- val isDrivingTransition
- get() = transitionState == swipeTransition
-
- @VisibleForTesting
- var isAnimatingOffset
- get() = swipeTransition.isAnimatingOffset
- private set(value) {
- swipeTransition.isAnimatingOffset = value
- }
-
- internal val swipeTransitionToScene
- get() = swipeTransition._toScene
-
- /**
- * The velocity threshold at which the intent of the user is to swipe up or down. It is the same
- * as SwipeableV2Defaults.VelocityThreshold.
- */
- @VisibleForTesting val velocityThreshold = with(layoutImpl.density) { 125.dp.toPx() }
-
- /**
- * The positional threshold at which the intent of the user is to swipe to the next scene. It is
- * the same as SwipeableV2Defaults.PositionalThreshold.
- */
- private val positionalThreshold = with(layoutImpl.density) { 56.dp.toPx() }
-
- internal var gestureWithPriority: Any? = null
-
- internal fun onDragStarted(pointersDown: Int, startedPosition: Offset?) {
- if (isDrivingTransition) {
- // This [transition] was already driving the animation: simply take over it.
- // Stop animating and start from where the current offset.
- swipeTransition.stopOffsetAnimation()
- return
- }
-
- val transition = transitionState
- if (transition is TransitionState.Transition) {
- // TODO(b/290184746): Better handle interruptions here if state != idle.
- Log.w(
- TAG,
- "start from TransitionState.Transition is not fully supported: from" +
- " ${transition.fromScene} to ${transition.toScene} " +
- "(progress ${transition.progress})"
- )
- }
-
- val fromScene = currentScene
-
- swipeTransition._currentScene = fromScene
- swipeTransition._fromScene = fromScene
-
- // We don't know where we are transitioning to yet given that the drag just started, so set
- // it to fromScene, which will effectively be treated the same as Idle(fromScene).
- swipeTransition._toScene = fromScene
-
- swipeTransition.stopOffsetAnimation()
- swipeTransition.dragOffset = 0f
-
- // Use the layout size in the swipe orientation for swipe distance.
- // TODO(b/290184746): Also handle custom distances for transitions. With smaller distances,
- // we will also have to make sure that we correctly handle overscroll.
- swipeTransition.absoluteDistance =
- when (orientation) {
- Orientation.Horizontal -> layoutImpl.size.width
- Orientation.Vertical -> layoutImpl.size.height
- }.toFloat()
-
- val fromEdge =
- startedPosition?.let { position ->
- layoutImpl.edgeDetector.edge(
- layoutImpl.size,
- position.round(),
- layoutImpl.density,
- orientation,
- )
- }
-
- swipeTransition.actionUpOrLeft =
- Swipe(
- direction =
- when (orientation) {
- Orientation.Horizontal -> SwipeDirection.Left
- Orientation.Vertical -> SwipeDirection.Up
- },
- pointerCount = pointersDown,
- fromEdge = fromEdge,
- )
-
- swipeTransition.actionDownOrRight =
- Swipe(
- direction =
- when (orientation) {
- Orientation.Horizontal -> SwipeDirection.Right
- Orientation.Vertical -> SwipeDirection.Down
- },
- pointerCount = pointersDown,
- fromEdge = fromEdge,
- )
-
- if (fromEdge == null) {
- swipeTransition.actionUpOrLeftNoEdge = null
- swipeTransition.actionDownOrRightNoEdge = null
- } else {
- swipeTransition.actionUpOrLeftNoEdge =
- (swipeTransition.actionUpOrLeft as Swipe).copy(fromEdge = null)
- swipeTransition.actionDownOrRightNoEdge =
- (swipeTransition.actionDownOrRight as Swipe).copy(fromEdge = null)
- }
-
- if (swipeTransition.absoluteDistance > 0f) {
- transitionState = swipeTransition
- }
- }
-
- internal fun onDrag(delta: Float) {
- if (delta == 0f) return
-
- swipeTransition.dragOffset += delta
-
- // First check transition.fromScene should be changed for the case where the user quickly
- // swiped twice in a row to accelerate the transition and go from A => B then B => C really
- // fast.
- maybeHandleAcceleratedSwipe()
-
- val offset = swipeTransition.dragOffset
- val fromScene = swipeTransition._fromScene
-
- // Compute the target scene depending on the current offset.
- val target = fromScene.findTargetSceneAndDistance(offset)
-
- if (swipeTransition._toScene.key != target.sceneKey) {
- swipeTransition._toScene = layoutImpl.scenes.getValue(target.sceneKey)
- }
-
- if (swipeTransition._distance != target.distance) {
- swipeTransition._distance = target.distance
- }
- }
-
- /**
- * Change fromScene in the case where the user quickly swiped multiple times in the same
- * direction to accelerate the transition from A => B then B => C.
- */
- private fun maybeHandleAcceleratedSwipe() {
- val toScene = swipeTransition._toScene
- val fromScene = swipeTransition._fromScene
-
- // If the swipe was not committed, don't do anything.
- if (fromScene == toScene || swipeTransition._currentScene != toScene) {
- return
- }
-
- // If the offset is past the distance then let's change fromScene so that the user can swipe
- // to the next screen or go back to the previous one.
- val offset = swipeTransition.dragOffset
- val absoluteDistance = swipeTransition.absoluteDistance
- if (offset <= -absoluteDistance && swipeTransition.upOrLeft(fromScene) == toScene.key) {
- swipeTransition.dragOffset += absoluteDistance
- swipeTransition._fromScene = toScene
- } else if (
- offset >= absoluteDistance && swipeTransition.downOrRight(fromScene) == toScene.key
- ) {
- swipeTransition.dragOffset -= absoluteDistance
- swipeTransition._fromScene = toScene
- }
-
- // Important note: toScene and distance will be updated right after this function is called,
- // using fromScene and dragOffset.
- }
-
- private class TargetScene(
- val sceneKey: SceneKey,
- val distance: Float,
- )
-
- private fun Scene.findTargetSceneAndDistance(directionOffset: Float): TargetScene {
- val upOrLeft = swipeTransition.upOrLeft(this)
- val downOrRight = swipeTransition.downOrRight(this)
-
- // Compute the target scene depending on the current offset.
- return when {
- directionOffset < 0f && upOrLeft != null -> {
- TargetScene(
- sceneKey = upOrLeft,
- distance = -swipeTransition.absoluteDistance,
- )
- }
- directionOffset > 0f && downOrRight != null -> {
- TargetScene(
- sceneKey = downOrRight,
- distance = swipeTransition.absoluteDistance,
- )
- }
- else -> {
- TargetScene(
- sceneKey = key,
- distance = 0f,
- )
- }
- }
- }
-
- internal fun onDragStopped(velocity: Float, canChangeScene: Boolean) {
- // The state was changed since the drag started; don't do anything.
- if (!isDrivingTransition) {
- return
- }
-
- fun animateTo(targetScene: Scene, targetOffset: Float) {
- // If the effective current scene changed, it should be reflected right now in the
- // current scene state, even before the settle animation is ongoing. That way all the
- // swipeables and back handlers will be refreshed and the user can for instance quickly
- // swipe vertically from A => B then horizontally from B => C, or swipe from A => B then
- // immediately go back B => A.
- if (targetScene != swipeTransition._currentScene) {
- swipeTransition._currentScene = targetScene
- layoutImpl.onChangeScene(targetScene.key)
- }
-
- animateOffset(
- initialVelocity = velocity,
- targetOffset = targetOffset,
- targetScene = targetScene.key
- )
- }
-
- val fromScene = swipeTransition._fromScene
- if (canChangeScene) {
- // If we are halfway between two scenes, we check what the target will be based on the
- // velocity and offset of the transition, then we launch the animation.
-
- val toScene = swipeTransition._toScene
- if (fromScene == toScene) {
- // We were not animating.
- transitionState = TransitionState.Idle(fromScene.key)
- return
- }
-
- // Compute the destination scene (and therefore offset) to settle in.
- val offset = swipeTransition.dragOffset
- val distance = swipeTransition.distance
- if (
- shouldCommitSwipe(
- offset,
- distance,
- velocity,
- wasCommitted = swipeTransition._currentScene == toScene,
- )
- ) {
- // Animate to the next scene
- animateTo(targetScene = toScene, targetOffset = distance)
- } else {
- // Animate to the initial scene
- animateTo(targetScene = fromScene, targetOffset = 0f)
- }
- } else {
- // We are doing an overscroll animation between scenes. In this case, we can also start
- // from the idle position.
-
- val startFromIdlePosition = swipeTransition.dragOffset == 0f
-
- if (startFromIdlePosition) {
- // If there is a next scene, we start the overscroll animation.
- val target = fromScene.findTargetSceneAndDistance(velocity)
- val isValidTarget = target.distance != 0f && target.sceneKey != fromScene.key
- if (isValidTarget) {
- swipeTransition._toScene = layoutImpl.scene(target.sceneKey)
- swipeTransition._distance = target.distance
-
- animateTo(targetScene = fromScene, targetOffset = 0f)
- } else {
- // We will not animate
- transitionState = TransitionState.Idle(fromScene.key)
- }
- } else {
- // We were between two scenes: animate to the initial scene.
- animateTo(targetScene = fromScene, targetOffset = 0f)
- }
- }
- }
-
- /**
- * Whether the swipe to the target scene should be committed or not. This is inspired by
- * SwipeableV2.computeTarget().
- */
- private fun shouldCommitSwipe(
- offset: Float,
- distance: Float,
- velocity: Float,
- wasCommitted: Boolean,
- ): Boolean {
- fun isCloserToTarget(): Boolean {
- return (offset - distance).absoluteValue < offset.absoluteValue
- }
-
- // Swiping up or left.
- if (distance < 0f) {
- return if (offset > 0f || velocity >= velocityThreshold) {
- false
- } else {
- velocity <= -velocityThreshold ||
- (offset <= -positionalThreshold && !wasCommitted) ||
- isCloserToTarget()
- }
- }
-
- // Swiping down or right.
- return if (offset < 0f || velocity <= -velocityThreshold) {
- false
- } else {
- velocity >= velocityThreshold ||
- (offset >= positionalThreshold && !wasCommitted) ||
- isCloserToTarget()
- }
- }
-
- private fun animateOffset(
- initialVelocity: Float,
- targetOffset: Float,
- targetScene: SceneKey,
- ) {
- swipeTransition.startOffsetAnimation {
- coroutineScope.launch {
- if (!isAnimatingOffset) {
- swipeTransition.offsetAnimatable.snapTo(swipeTransition.dragOffset)
- }
- isAnimatingOffset = true
-
- swipeTransition.offsetAnimatable.animateTo(
- targetOffset,
- // TODO(b/290184746): Make this spring spec configurable.
- spring(
- stiffness = Spring.StiffnessMediumLow,
- visibilityThreshold = OffsetVisibilityThreshold
- ),
- initialVelocity = initialVelocity,
- )
-
- isAnimatingOffset = false
-
- // Now that the animation is done, the state should be idle. Note that if the state
- // was changed since this animation started, some external code changed it and we
- // shouldn't do anything here. Note also that this job will be cancelled in the case
- // where the user intercepts this swipe.
- if (isDrivingTransition) {
- transitionState = TransitionState.Idle(targetScene)
- }
- }
- }
- }
-
- private class SwipeTransition(initialScene: Scene) : TransitionState.Transition {
- var _currentScene by mutableStateOf(initialScene)
- override val currentScene: SceneKey
- get() = _currentScene.key
-
- var _fromScene by mutableStateOf(initialScene)
- override val fromScene: SceneKey
- get() = _fromScene.key
-
- var _toScene by mutableStateOf(initialScene)
- override val toScene: SceneKey
- get() = _toScene.key
-
- override val progress: Float
- get() {
- val offset = if (isAnimatingOffset) offsetAnimatable.value else dragOffset
- if (distance == 0f) {
- // This can happen only if fromScene == toScene.
- error(
- "Transition.progress should be called only when Transition.fromScene != " +
- "Transition.toScene"
- )
- }
- return offset / distance
- }
-
- override val isInitiatedByUserInput = true
-
- /** The current offset caused by the drag gesture. */
- var dragOffset by mutableFloatStateOf(0f)
-
- /**
- * Whether the offset is animated (the user lifted their finger) or if it is driven by
- * gesture.
- */
- var isAnimatingOffset by mutableStateOf(false)
-
- // If we are not animating offset, it means the offset is being driven by the user's finger.
- override val isUserInputOngoing: Boolean
- get() = !isAnimatingOffset
-
- /** The animatable used to animate the offset once the user lifted its finger. */
- val offsetAnimatable = Animatable(0f, OffsetVisibilityThreshold)
-
- /** Job to check that there is at most one offset animation in progress. */
- private var offsetAnimationJob: Job? = null
-
- /** Ends any previous [offsetAnimationJob] and runs the new [job]. */
- fun startOffsetAnimation(job: () -> Job) {
- stopOffsetAnimation()
- offsetAnimationJob = job()
- }
-
- /** Stops any ongoing offset animation. */
- fun stopOffsetAnimation() {
- offsetAnimationJob?.cancel()
-
- if (isAnimatingOffset) {
- isAnimatingOffset = false
- dragOffset = offsetAnimatable.value
- }
- }
-
- /** The absolute distance between [fromScene] and [toScene]. */
- var absoluteDistance = 0f
-
- /**
- * The signed distance between [fromScene] and [toScene]. It is negative if [fromScene] is
- * above or to the left of [toScene].
- */
- var _distance by mutableFloatStateOf(0f)
- val distance: Float
- get() = _distance
-
- /** The [UserAction]s associated to this swipe. */
- var actionUpOrLeft: UserAction = Back
- var actionDownOrRight: UserAction = Back
- var actionUpOrLeftNoEdge: UserAction? = null
- var actionDownOrRightNoEdge: UserAction? = null
-
- fun upOrLeft(scene: Scene): SceneKey? {
- return scene.userActions[actionUpOrLeft]
- ?: actionUpOrLeftNoEdge?.let { scene.userActions[it] }
- }
-
- fun downOrRight(scene: Scene): SceneKey? {
- return scene.userActions[actionDownOrRight]
- ?: actionDownOrRightNoEdge?.let { scene.userActions[it] }
- }
- }
-
- companion object {
- private const val TAG = "SceneGestureHandler"
- }
-}
-
-private class SceneDraggableHandler(
- private val gestureHandler: SceneGestureHandler,
-) : DraggableHandler {
- override fun onDragStarted(startedPosition: Offset, pointersDown: Int) {
- gestureHandler.gestureWithPriority = this
- gestureHandler.onDragStarted(pointersDown, startedPosition)
- }
-
- override fun onDelta(pixels: Float) {
- if (gestureHandler.gestureWithPriority == this) {
- gestureHandler.onDrag(delta = pixels)
- }
- }
-
- override fun onDragStopped(velocity: Float) {
- if (gestureHandler.gestureWithPriority == this) {
- gestureHandler.gestureWithPriority = null
- gestureHandler.onDragStopped(velocity = velocity, canChangeScene = true)
- }
- }
-}
-
-@VisibleForTesting
-class SceneNestedScrollHandler(
- private val gestureHandler: SceneGestureHandler,
-) : NestedScrollHandler {
- override val connection: PriorityNestedScrollConnection = nestedScrollConnection()
-
- private fun Offset.toAmount() =
- when (gestureHandler.orientation) {
- Orientation.Horizontal -> x
- Orientation.Vertical -> y
- }
-
- private fun Velocity.toAmount() =
- when (gestureHandler.orientation) {
- Orientation.Horizontal -> x
- Orientation.Vertical -> y
- }
-
- private fun Float.toOffset() =
- when (gestureHandler.orientation) {
- Orientation.Horizontal -> Offset(x = this, y = 0f)
- Orientation.Vertical -> Offset(x = 0f, y = this)
- }
-
- private fun nestedScrollConnection(): PriorityNestedScrollConnection {
- // The next potential scene is calculated during the canStart
- var nextScene: SceneKey? = null
-
- // This is the scene on which we will have priority during the scroll gesture.
- var priorityScene: SceneKey? = null
-
- // If we performed a long gesture before entering priority mode, we would have to avoid
- // moving on to the next scene.
- var gestureStartedOnNestedChild = false
-
- val actionUpOrLeft =
- Swipe(
- direction =
- when (gestureHandler.orientation) {
- Orientation.Horizontal -> SwipeDirection.Left
- Orientation.Vertical -> SwipeDirection.Up
- },
- pointerCount = 1,
- )
-
- val actionDownOrRight =
- Swipe(
- direction =
- when (gestureHandler.orientation) {
- Orientation.Horizontal -> SwipeDirection.Right
- Orientation.Vertical -> SwipeDirection.Down
- },
- pointerCount = 1,
- )
-
- fun findNextScene(amount: Float): SceneKey? {
- val fromScene = gestureHandler.currentScene
- return when {
- amount < 0f -> fromScene.userActions[actionUpOrLeft]
- amount > 0f -> fromScene.userActions[actionDownOrRight]
- else -> null
- }
- }
-
- return PriorityNestedScrollConnection(
- canStartPreScroll = { offsetAvailable, offsetBeforeStart ->
- gestureStartedOnNestedChild = offsetBeforeStart != Offset.Zero
-
- val canInterceptPreScroll =
- gestureHandler.isDrivingTransition &&
- !gestureStartedOnNestedChild &&
- offsetAvailable.toAmount() != 0f
-
- if (!canInterceptPreScroll) return@PriorityNestedScrollConnection false
-
- nextScene = gestureHandler.swipeTransitionToScene.key
-
- true
- },
- canStartPostScroll = { offsetAvailable, offsetBeforeStart ->
- val amount = offsetAvailable.toAmount()
- if (amount == 0f) return@PriorityNestedScrollConnection false
-
- gestureStartedOnNestedChild = offsetBeforeStart != Offset.Zero
- nextScene = findNextScene(amount)
- nextScene != null
- },
- canStartPostFling = { velocityAvailable ->
- val amount = velocityAvailable.toAmount()
- if (amount == 0f) return@PriorityNestedScrollConnection false
-
- // We could start an overscroll animation
- gestureStartedOnNestedChild = true
- nextScene = findNextScene(amount)
- nextScene != null
- },
- canContinueScroll = { priorityScene == gestureHandler.swipeTransitionToScene.key },
- onStart = {
- gestureHandler.gestureWithPriority = this
- priorityScene = nextScene
- gestureHandler.onDragStarted(pointersDown = 1, startedPosition = null)
- },
- onScroll = { offsetAvailable ->
- if (gestureHandler.gestureWithPriority != this) {
- return@PriorityNestedScrollConnection Offset.Zero
- }
-
- val amount = offsetAvailable.toAmount()
-
- // TODO(b/297842071) We should handle the overscroll or slow drag if the gesture is
- // initiated in a nested child.
- gestureHandler.onDrag(amount)
-
- amount.toOffset()
- },
- onStop = { velocityAvailable ->
- if (gestureHandler.gestureWithPriority != this) {
- return@PriorityNestedScrollConnection Velocity.Zero
- }
-
- priorityScene = null
-
- gestureHandler.onDragStopped(
- velocity = velocityAvailable.toAmount(),
- canChangeScene = !gestureStartedOnNestedChild
- )
-
- // The onDragStopped animation consumes any remaining velocity.
- velocityAvailable
- },
- )
- }
-}
-
-/**
- * The number of pixels below which there won't be a visible difference in the transition and from
- * which the animation can stop.
- */
-private const val OffsetVisibilityThreshold = 0.5f
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt
index 7b7695e..5473186 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt
@@ -66,7 +66,8 @@
val int by animateSharedIntAsState(targetValues.int, TestValues.Value1, key)
val float by animateSharedFloatAsState(targetValues.float, TestValues.Value2, key)
val dp by animateSharedDpAsState(targetValues.dp, TestValues.Value3, key)
- val color by animateSharedColorAsState(targetValues.color, TestValues.Value4, key)
+ val color by
+ animateSharedColorAsState(targetValues.color, TestValues.Value4, element = null)
// Make sure we read the values during composition, so that we recompose and call
// onCurrentValueChanged() with the latest values.
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
index b076b2c..42ba643 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
@@ -33,6 +33,7 @@
import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.plugins.ClockFaceEvents
import com.android.systemui.plugins.ClockSettings
+import com.android.systemui.plugins.DefaultClockFaceLayout
import com.android.systemui.plugins.WeatherData
import java.io.PrintWriter
import java.util.Locale
@@ -114,6 +115,7 @@
protected var targetRegion: Rect? = null
override val config = ClockFaceConfig()
+ override val layout = DefaultClockFaceLayout(view)
override var messageBuffer: MessageBuffer?
get() = view.messageBuffer
@@ -184,6 +186,7 @@
view: AnimatableClockView,
seedColor: Int?,
) : DefaultClockFaceController(view, seedColor) {
+ override val layout = DefaultClockFaceLayout(view)
override val config =
ClockFaceConfig(hasCustomPositionUpdatedAnimation = hasStepClockAnimation)
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index c428952..1beb55b 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -38,6 +38,7 @@
// of the library which are used by the plugins but not by systemui itself.
static_libs: [
"androidx.annotation_annotation",
+ "androidx-constraintlayout_constraintlayout",
"PluginCoreLib",
"SystemUIAnimationLib",
"SystemUICommon",
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
index 485c27e..63ded2e 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
@@ -17,6 +17,7 @@
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.view.View
+import androidx.constraintlayout.widget.ConstraintSet
import com.android.internal.annotations.Keep
import com.android.systemui.log.core.MessageBuffer
import com.android.systemui.plugins.annotations.ProvidesInterface
@@ -85,6 +86,9 @@
/** View that renders the clock face */
val view: View
+ /** Layout specification for this clock */
+ val layout: ClockFaceLayout
+
/** Determines the way the hosting app should behave when rendering this clock face */
val config: ClockFaceConfig
@@ -98,6 +102,30 @@
var messageBuffer: MessageBuffer?
}
+/** Specifies layout information for the */
+interface ClockFaceLayout {
+ /** All clock views to add to the root constraint layout before applying constraints. */
+ val views: List<View>
+
+ /** Custom constraints to apply to Lockscreen ConstraintLayout. */
+ fun applyConstraints(constraints: ConstraintSet): ConstraintSet
+}
+
+/** A ClockFaceLayout that applies the default lockscreen layout to a single view */
+class DefaultClockFaceLayout(val view: View) : ClockFaceLayout {
+ // both small and large clock should have a container (RelativeLayout in
+ // SimpleClockFaceController)
+ override val views = listOf(view)
+ override fun applyConstraints(constraints: ConstraintSet): ConstraintSet {
+ if (views.size != 1) {
+ throw IllegalArgumentException(
+ "Should have only one container view when using DefaultClockFaceLayout"
+ )
+ }
+ return constraints
+ }
+}
+
/** Events that should call when various rendering parameters change */
interface ClockEvents {
/** Call whenever timezone changes */
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 36757f8..cb061ed 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Gesigslot is onbeskikbaar"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth gekoppel."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth-toestelikoon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klik om toestelbesonderhede op te stel."</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterypersentasie is onbekend."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Gekoppel aan <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Gekoppel aan <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Moenie Steur Nie"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen saamgebinde toestelle beskikbaar nie"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tik om ’n toestel te koppel of ontkoppel"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Bind nuwe toestel saam"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Sien alles"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Gebruik Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera en mikrofoon is geblokkeer"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoon is geblokkeer"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitmodus is aan"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikerteenwoordigheid is bespeur"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stel versteknotasapp in Instellings"</string>
<string name="install_app" msgid="5066668100199613936">"Installeer app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Sinkroniseer wedersyds na eksterne skerm?"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index ebdfd95..73f446c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"በመልክ መክፈት አይገኝም"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ብሉቱዝ ተያይዟል።"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"የብሉቱዝ መሣሪያ አዶ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"የመሣሪያ ዝርዝርን ለማዋቀር ጠቅ ያድርጉ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"የባትሪ መቶኛ አይታወቅም።"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ከ<xliff:g id="BLUETOOTH">%s</xliff:g> ጋር ተገናኝቷል።"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"ከ<xliff:g id="CAST">%s</xliff:g> ጋር ተገናኝቷል።"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"አትረብሽ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ብሉቱዝ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ምንም የተጣመሩ መሣሪያዎች አይገኝም"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"መሣሪያን ለማገናኘት ወይም ግንኙነቱን ለማቋረጥ መታ ያድርጉ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"አዲስ መሣሪያ ያጣምሩ"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ሁሉንም ይመልከቱ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ብሉቱዝን ይጠቀሙ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ካሜራ እና ማይክሮፎን ታግደዋል"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ማይክሮፎን ታግዷል"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"የቅድሚያ ሁነታ በርቷል"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"የተጠቃሚ ተገኝነት ታውቋል"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"በቅንብሮች ውስጥ ነባሪ የማስታወሻዎች መተግበሪያን ያቀናብሩ"</string>
<string name="install_app" msgid="5066668100199613936">"መተግበሪያን ጫን"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ወደ ውጫዊ ማሳያ ይንጸባረቅ?"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 84a3004..cc2f488 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ميزة \"فتح الجهاز بالتعرف على الوجه\" غير متاحة."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"تم توصيل البلوتوث."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"رمز الجهاز الذي يتضمّن بلوتوث"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"انقر هنا لضبط إعدادات الجهاز."</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"نسبة شحن البطارية غير معروفة."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"متصل بـ <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"تم الاتصال بـ <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"عدم الإزعاج"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"لا يتوفر أي أجهزة مقترنة"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"انقر لربط جهاز أو إلغاء ربطه."</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"إقران جهاز جديد"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"عرض الكل"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"استخدام البلوتوث"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"استخدام الكاميرا والميكروفون محظور."</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"استخدام الميكروفون محظور."</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"وضع الأولوية مفعّل."</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"تم رصد تواجد المستخدم."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"يمكنك ضبط تطبيق تدوين الملاحظات التلقائي في \"الإعدادات\"."</string>
<string name="install_app" msgid="5066668100199613936">"تثبيت التطبيق"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"هل تريد بث محتوى جهازك على الشاشة الخارجية؟"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index d04b33a..4e75995 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ফেচ আনলক সুবিধা উপলব্ধ নহয়"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ব্লুটুথ সংযোগ হ’ল।"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ব্লুটুথ ডিভাইচৰ চিহ্ন"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ডিভাইচৰ সবিশেষ কনফিগাৰ কৰিবলৈ ক্লিক কৰক"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ’ল।"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>ত সংযোগ হ’ল।"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"অসুবিধা নিদিব"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"এটা ডিভাইচৰ সংযোগ কৰিবলৈ অথবা ডিভাইচটোৰ সৈতে সংযোগ বিচ্ছিন্ন কৰিবলৈ টিপক"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"নতুন ডিভাইচ পেয়াৰ কৰক"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"আটাইবোৰ চাওক"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ব্লুটুথ ব্যৱহাৰ কৰক"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"কেমেৰা আৰু মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"অগ্ৰাধিকাৰ দিয়া ম’ড অন আছে"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যৱহাৰকাৰীৰ উপস্থিতি চিনাক্ত কৰা হৈছে"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ছেটিঙত টোকাৰ ডিফ’ল্ট এপ্ ছেট কৰক"</string>
<string name="install_app" msgid="5066668100199613936">"এপ্টো ইনষ্টল কৰক"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"বাহ্যিক ডিছপ্লে’লৈ মিৰ’ৰ কৰিবনে?"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 1ef94326..3e6765d 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Üz ilə kiliddən çıxarma əlçatan deyil"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth qoşulub."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth cihazı ikonası"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Cihaz təfərrüatlarını konfiqurasiya etmək üçün klikləyin"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareyanın faizi naməlumdur."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> üzərindən qoşuldu."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> cihazına qoşulub."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Narahat etməyin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Heç bir cütlənmiş cihaz əlçatan deyil"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toxunaraq cihaza qoşulun, yaxud əlaqəni ayırın"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yeni cihaz birləşdirin"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Hamısına baxın"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth aç"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera və mikrofon bloklanıb"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklanıb"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritet rejimi aktivdir"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"İstifadəçi mövcudluğu aşkarlandı"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlarda defolt qeydlər tətbiqi ayarlayın"</string>
<string name="install_app" msgid="5066668100199613936">"Tətbiqi quraşdırın"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Xarici displeyə əks etdirilsin?"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index de638b7..17e9f9b 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Otključavanje licem nije dostupno"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth je priključen."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona Bluetooth uređaja"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknite da biste konfigurisali detalje o uređaju"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procenat napunjenosti baterije nije poznat."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezani ste sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani smo sa uređajem <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nije dostupan nijedan upareni uređaj"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Upari novi uređaj"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Prikaži sve"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetni režim je uključen"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Prisustvo korisnika može da se otkrije"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Podesite podrazumevanu aplikaciju za beleške u Podešavanjima"</string>
<string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Želite li da preslikate na spoljnji ekran?"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 30c8053..252b2bd 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Распазнаванне твару не працуе"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-сувязь."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Значок прылады з Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Націсніце, каб задаць падрабязныя налады прылады"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Працэнт зараду акумулятара невядомы."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Падлучаны да <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Ёсць падключэнне да <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбаваць"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма даступных спалучаных прылад"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Націсніце, каб падключыць або адключыць прыладу"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Спалучыць новую прыладу"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Паглядзець усе"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Выкарыстоўваць Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера і мікрафон заблакіраваны"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрафон заблакіраваны"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Прыярытэтны рэжым уключаны"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Выяўлена прысутнасць карыстальніка"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайце ў Наладах стандартную праграму для нататак"</string>
<string name="install_app" msgid="5066668100199613936">"Усталяваць праграму"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Адлюстраваць на знешнім дысплеі?"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index f5a8214..4beb901 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"„Отключване с лице“ не е налице"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth е включен."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Икона за устройство с Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Кликнете, за да конфигурирате подробностите за устройството"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентът на батерията е неизвестен."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Има връзка с <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Установена е връзка с/ъс <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не безпокойте"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма налични сдвоени устройства"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Докоснете, за да свържете устройство или да прекъснете връзката му"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Сдвояване на ново устройство"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Преглед на всички"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Използване на Bluetooth"</string>
@@ -509,7 +507,7 @@
<string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Нивото на силата на звука на слушалките е било високо по-дълго, отколкото е препоръчително"</string>
<string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Нивото на силата на звука на слушалките е надвишило безопасния лимит за тази седмица"</string>
<string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Продължете да слушате"</string>
- <string name="csd_button_lower_volume" product="default" msgid="5347210412376264579">"Намаляване на силата на звука"</string>
+ <string name="csd_button_lower_volume" product="default" msgid="5347210412376264579">"Намаляване на звука"</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>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Достъпът до камерата и микрофона е блокиран"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Достъпът до микрофона е блокиран"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетният режим е включен"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Установено е присъствие на потребител"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартно приложение за бележки от настройките"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталиране на приложението"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Да се дублира ли на външния екран?"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 43cf9e3..cd15261 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"\'ফেস আনলক\' উপলভ্য নেই"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ব্লুটুথ ডিভাইসের আইকন"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ডিভাইসের বিবরণ কনফিগার করতে ক্লিক করুন"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>এ সংযুক্ত হয়ে আছে।"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> এর সাথে সংযুক্ত৷"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"বিরক্ত করবে না"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"চেনা কোনও ডিভাইস নেই"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"কোনও ডিভাইস কানেক্ট বা ডিসকানেক্ট করতে ট্যাপ করুন"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"নতুন ডিভাইস পেয়ার করুন"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"সব দেখুন"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ব্লুটুথ ব্যবহার করুন"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ক্যামেরা এবং মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"\'প্রায়োরিটি\' মোড চালু করা আছে"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যবহারকারীর উপস্থিতি শনাক্ত করা হয়েছে"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"\'সেটিংস\' থেকে ডিফল্ট নোট নেওয়ার অ্যাপ সেট করুন"</string>
<string name="install_app" msgid="5066668100199613936">"অ্যাপ ইনস্টল করুন"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"এক্সটার্নাল ডিসপ্লে আয়না?"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index c443542..a6d1f2b 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Otključavanje licem je nedostupno"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth je povezan."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona Bluetooth uređaja"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknite da konfigurirate detalje uređaja"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak napunjenosti baterije nije poznat"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezan na <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Povezan na <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne ometaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nema dostupnih uparenih uređaja"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete uređaj ili prekinete njegovu povezanost"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Upari novi uređaj"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Prikaži sve"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Način rada Prioriteti je uključen"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkriveno je prisustvo korisnika"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u Postavkama"</string>
<string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Preslikati na vanjski ekran?"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 5995503..143bd43 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Desbloqueig facial no està disponible"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connectat."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icona de dispositiu Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Fes clic per configurar els detalls del dispositiu"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Es desconeix el percentatge de bateria."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"S\'ha connectat a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Està connectat amb <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestis"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hi ha dispositius vinculats disponibles"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca per connectar o desconnectar un dispositiu"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Vincula un dispositiu nou"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Mostra-ho tot"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Utilitza\'l"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La càmera i el micròfon estan bloquejats"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micròfon està bloquejat"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"El mode Prioritat està activat"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"S\'ha detectat la presència d\'usuaris"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defineix l\'aplicació de notes predeterminada a Configuració"</string>
<string name="install_app" msgid="5066668100199613936">"Instal·la l\'aplicació"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vols replicar-ho a la pantalla externa?"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index ea85db9..9ffc4b2 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Odemknutí obličejem není k dispozici"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Rozhraní Bluetooth je připojeno."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona zařízení Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknutím nakonfigurujete podrobnosti o zařízení"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procento baterie není známé."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Připojeno k zařízení <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Jste připojeni k zařízení <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nerušit"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nejsou dostupná žádná spárovaná zařízení"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím připojíte nebo odpojíte zařízení"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Spárovat nové zařízení"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Zobrazit vše"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Použít Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofon jsou blokovány"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokován"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Je zjištěna přítomnost uživatele"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Výchozí aplikaci pro poznámky nastavíte v Nastavení"</string>
<string name="install_app" msgid="5066668100199613936">"Nainstalovat aplikaci"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Zrcadlit na externí displej?"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index ae54f3a..0eb5084 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ansigtsoplåsning er utilgængelig"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tilsluttet."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikon for Bluetooth-enhed"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klik for at konfigurere enhedsoplysninger"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriniveauet er ukendt."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tilsluttet <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Forbundet til <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Forstyr ikke"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Der er ingen tilgængelige parrede enheder"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tryk for at oprette eller afbryde forbindelse til en enhed"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Par ny enhed"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Se alt"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Brug Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Der er blokeret for kameraet og mikrofonen"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokeret"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetstilstand er aktiveret"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Brugertilstedeværelse er registreret"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Angiv standardapp til noter i Indstillinger"</string>
<string name="install_app" msgid="5066668100199613936">"Installer app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vil du spejle til ekstern skærm?"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 2fdb477..c9050f5 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Entsperrung per Gesichtserkennung nicht verfügbar"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Mit Bluetooth verbunden"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Symbol des Bluetooth-Geräts"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klicke, um das Gerätedetail zu konfigurieren"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akkustand unbekannt."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Mit <xliff:g id="BLUETOOTH">%s</xliff:g> verbunden"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Verbunden mit <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1182,8 +1181,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera und Mikrofon blockiert"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon blockiert"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritätsmodus an"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Anwesenheit des Nutzers wurde erkannt"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standard-Notizen-App in den Einstellungen einrichten"</string>
<string name="install_app" msgid="5066668100199613936">"App installieren"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Auf externen Bildschirm spiegeln?"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 194e04c..80eef9f 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ξεκλ. με πρόσωπο μη διαθ."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Το Bluetooth είναι συνδεδεμένο."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Εικονίδιο συσκευής Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Κάντε κλικ για να διαμορφώσετε τις λεπτομέρειες συσκευής"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Άγνωστο ποσοστό μπαταρίας."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Συνδέθηκε στο <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Συνδέθηκε σε <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Μην ενοχλείτε"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Δεν υπάρχουν διαθέσιμες συσκευές σε σύζευξη"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Πατήστε για σύνδεση ή αποσύνδεση μιας συσκευής"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Σύζευξη νέας συσκευής"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Εμφάνιση όλων"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Χρήση Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Η κάμερα και το μικρόφωνο έχουν αποκλειστεί"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Το μικρόφωνο έχει αποκλειστεί"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Η λειτουργία προτεραιότητας είναι ενεργοποιημένη"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Εντοπίστηκε παρουσία χρήστη"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ορίστε την προεπιλεγμένη εφαρμογή σημειώσεων στις Ρυθμίσεις"</string>
<string name="install_app" msgid="5066668100199613936">"Εγκατάσταση εφαρμογής"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Κατοπτρισμός σε εξωτερική οθόνη;"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 87ca42b..c6fe169 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Face Unlock unavailable"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth device icon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Click to configure device detail"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Pair new device"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"See all"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Use Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirror to external display?"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index c69533d..f9aa1cb 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Face Unlock unavailable"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth device icon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Click to configure device detail"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirror to external display?"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 87ca42b..c6fe169 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Face Unlock unavailable"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth device icon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Click to configure device detail"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Pair new device"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"See all"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Use Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirror to external display?"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 87ca42b..c6fe169 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Face Unlock unavailable"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth device icon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Click to configure device detail"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Pair new device"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"See all"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Use Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirror to external display?"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 264084f..23f7483 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Face Unlock unavailable"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth device icon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Click to configure device detail"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirror to external display?"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 66dd037..7c3960e 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Desbloqueo facial no disponible"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ícono de dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Haz clic para configurar los detalles del dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Se desconoce el porcentaje de la batería."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"No interrumpir"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos sincronizados disponibles"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Presiona para conectar o desconectar un dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Vincular dispositivo nuevo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todos"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La cámara y el micrófono están bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micrófono está bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"El modo de prioridad está activado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se detectó la presencia del usuario"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la app de notas predeterminada en Configuración"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"¿Quieres duplicar a la pantalla externa?"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index de40f3b..f65b2e5 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Desbloqueo facial no disponible"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icono de dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Haz clic para configurar la información del dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentaje de batería desconocido."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos vinculados disponibles"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca para conectar o desconectar un dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Empareja un nuevo dispositivo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todos"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Cámara y micrófono bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrófono bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo Prioridad activado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se ha detectado la presencia de usuarios"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la aplicación de notas predeterminada en Ajustes"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"¿Replicar en pantalla externa?"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 7606254..d648f87 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Näoga avamine pole saadaval"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth on ühendatud."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth-seadme ikoon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klõpsake seadme üksikasjade konfigureerimiseks"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Aku laetuse protsent on teadmata."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ühendatud: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Ühendatud ülekandega <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mitte segada"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ühtegi seotud seadet pole saadaval"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Puudutage seadme ühendamiseks või ühenduse katkestamiseks"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Uue seadme sidumine"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Kuva kõik"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Kasuta Bluetoothi"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kaamera ja mikrofon on blokeeritud"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon on blokeeritud"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteetne režiim on sisse lülitatud"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Tuvastati kasutaja kohalolu"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Määrake seadetes märkmete vaikerakendus."</string>
<string name="install_app" msgid="5066668100199613936">"Installi rakendus"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Kas peegeldada välisekraanile?"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 7845339..e3c32e9 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Aurpegi bidez desblokeatzeko eginbidea ez dago erabilgarri"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetootha konektatuta."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth bidezko gailuaren ikonoa"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Gailuaren xehetasuna konfiguratzeko, sakatu hau"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Bateriaren ehunekoa ezezaguna da."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> gailura konektatuta."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Hona konektatuta: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ez molestatzeko modua"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetootha"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ez dago parekatutako gailurik erabilgarri"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Sakatu hau gailu bat konektatu edo deskonektatzeko"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Parekatu beste gailu bat"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ikusi guztiak"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Erabili Bluetootha"</string>
@@ -506,7 +504,7 @@
<string name="sound_settings" msgid="8874581353127418308">"Audioa eta dardara"</string>
<string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ezarpenak"</string>
<string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Bolumena maila seguruago batera jaitsi da"</string>
- <string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Entzungailuen bolumena gomendatutako denboran baino gehiagoan eduki da ozen"</string>
+ <string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Entzungailuen bolumena gomendatutako denbora baino luzaroago egon da ozen"</string>
<string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Entzungailuen bolumenak aste honetarako muga segurua gainditu du"</string>
<string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Jarraitu entzuten"</string>
<string name="csd_button_lower_volume" product="default" msgid="5347210412376264579">"Jaitsi bolumena"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera eta mikrofonoa blokeatuta daude"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonoa blokeatuta dago"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Lehentasun modua aktibatuta dago"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Erabiltzailearen presentzia hauteman da"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ezarri oharren aplikazio lehenetsia ezarpenetan"</string>
<string name="install_app" msgid="5066668100199613936">"Instalatu aplikazioa"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Kanpoko pantailan islatu nahi duzu?"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 3fc784b..805feff 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"«قفلگشایی با چهره» دردسترس نیست"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"بلوتوث متصل است."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"نماد دستگاه بلوتوث"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"برای پیکربندی جزئیات دستگاه کلیک کنید"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"درصد شارژ باتری مشخص نیست."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"به <xliff:g id="BLUETOOTH">%s</xliff:g> متصل شد."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"به <xliff:g id="CAST">%s</xliff:g> متصل شد."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"مزاحم نشوید"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"هیچ دستگاه مرتبط شدهای موجود نیست"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"برای اتصال یا قطع اتصال دستگاه، ضربه بزنید"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"جفت کردن دستگاه جدید"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"دیدن همه"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"استفاده از بلوتوث"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"دوربین و میکروفون مسدود شدهاند"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"میکروفون مسدود شده است"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"حالت اولویت روشن است"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"حضور کاربر شناسایی میشود"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"برنامه پیشفرض یادداشت را در «تنظیمات» تنظیم کنید"</string>
<string name="install_app" msgid="5066668100199613936">"نصب برنامه"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"در نمایشگر خارجی پخش شود؟"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 73532d6..9a8ceca 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Kasvojentunnistusavaus ei ole saatavilla"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth yhdistetty."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth-laitekuvake"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Määritä laitteen asetukset klikkaamalla"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akun varaustaso ei tiedossa."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Yhteys: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Yhdistetty kohteeseen <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Älä häiritse"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Laitepareja ei ole käytettävissä"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Muodosta yhteys laitteeseen tai katkaise yhteys napauttamalla"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Muodosta uusi laitepari"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Näytä kaikki"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Käytä Bluetoothia"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ja mikrofoni estetty"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni estetty"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Tärkeät-tila on päällä"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Käyttäjän läsnäolo havaittu"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Aseta oletusmuistiinpanosovellus Asetuksista"</string>
<string name="install_app" msgid="5066668100199613936">"Asenna sovellus"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Peilataanko ulkoiselle näytölle?"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index ec9e65a..79f0c44 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Déverrouillage par reconnaissance faciale inaccessible."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connecté"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icône de l\'appareil Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Cliquez pour configurer les détails de l\'appareil"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la pile inconnu."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun des appareils associés n\'est disponible"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Touchez pour connecter ou déconnecter un appareil"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Associer un nouvel appareil"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Tout afficher"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Utiliser le Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Appareil photo et microphone bloqués"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone bloqué"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode Priorité activé"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence d\'un utilisateur est détectée"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir l\'application de prise de notes par défaut dans les Paramètres"</string>
<string name="install_app" msgid="5066668100199613936">"Installer l\'application"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Dupliquer l\'écran sur un moniteur externe?"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 8accd74..4988cf5 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Déverrouillage par reconnaissance faciale indisponible"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connecté"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icône de l\'appareil Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Cliquer pour configurer les détails de l\'appareil"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la batterie inconnu."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun appareil associé disponible."</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Appuyer pour connecter ou déconnecter un appareil"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Associer un nouvel appareil"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Tout afficher"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Utiliser le Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Caméra et micro bloqués"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micro bloqué"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode Prioritaire activé"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence de l\'utilisateur est détectée"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir une appli de notes par défaut dans les paramètres"</string>
<string name="install_app" msgid="5066668100199613936">"Installer l\'appli"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Mirroring sur écran externe ?"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 95bb93f..90f1535 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"O desbloqueo facial non está dispoñible"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icona do dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Facer clic para configurar os detalles do dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Descoñécese a porcentaxe da batería."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Dispositivo conectado: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non molestar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Non hai dispositivos vinculados dispoñibles"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca para conectar ou desconectar un dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Vincular dispositivo novo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"A cámara e o micrófono están bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"O micrófono está bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"O modo de prioridade está activado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Detectouse a presenza de usuarios"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Establece a aplicación de notas predeterminada en Configuración"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Queres proxectar contido nunha pantalla externa?"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index e650671..302dab1 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ફેસ અનલૉક સુવિધા ઉપલબ્ધ નથી"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"બ્લૂટૂથ કનેક્ટ થયું."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"બ્લૂટૂથ ડિવાઇસનું આઇકન"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ડિવાઇસની વિગત ગોઠવવા માટે ક્લિક કરો"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"બૅટરીની ટકાવારી અજાણ છે."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> થી કનેક્ટ થયાં."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> થી કનેક્ટ કરેલ."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ખલેલ પાડશો નહીં"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"બ્લૂટૂથ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"કોઈ જોડી કરેલ ઉપકરણો ઉપલબ્ધ નથી"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"કોઈ ડિવાઇસ કનેક્ટ કરવા કે ડિસ્કનેક્ટ કરવા માટે ટૅપ કરો"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"નવા ડિવાઇસ સાથે જોડાણ કરો"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"તમામ જુઓ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"બ્લૂટૂથનો ઉપયોગ કરો"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"કૅમેરા અને માઇક્રોફોન બ્લૉક કરેલા છે"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"માઇક્રોફોન બ્લૉક કરેલો છે"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"પ્રાધાન્યતા મોડ ચાલુ છે"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"વપરાશકર્તાની હાજરીની ભાળ મળી છે"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"સેટિંગમાં નોંધની ડિફૉલ્ટ ઍપ સેટ કરો"</string>
<string name="install_app" msgid="5066668100199613936">"ઍપ ઇન્સ્ટૉલ કરો"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"શું બાહ્ય ડિસ્પ્લે પર મિરર કરીએ?"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index cdb3658..5df950c 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"फ़ेस अनलॉक की सुविधा उपलब्ध नहीं है"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लूटूथ कनेक्ट किया गया."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ब्लूटूथ डिवाइस का आइकॉन"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"डिवाइस की जानकारी कॉन्फ़िगर करने के लिए क्लिक करें"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> से कनेक्ट किया गया."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> से कनेक्ट है."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"परेशान न करें"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोई भी युग्मित डिवाइस उपलब्ध नहीं"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"किसी डिवाइस को कनेक्ट या डिसकनेक्ट करने के लिए टैप करें"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"नया डिवाइस जोड़ें"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"सभी देखें"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ब्लूटूथ इस्तेमाल करें"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कैमरे और माइक्रोफ़ोन का ऐक्सेस नहीं है"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफ़ोन का ऐक्सेस नहीं है"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राथमिकता मोड चालू है"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"उपयोगकर्ता की मौजूदगी का पता लगाया गया"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग में जाकर, नोट लेने की सुविधा देने वाले ऐप्लिकेशन को डिफ़ॉल्ट के तौर पर सेट करें"</string>
<string name="install_app" msgid="5066668100199613936">"ऐप्लिकेशन इंस्टॉल करें"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"बाहरी डिसप्ले को अन्य डिवाइस पर दिखाना है?"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index b4ea7dc..de60e8e 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Otključavanje licem nije dostupno"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth povezan."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona Bluetooth uređaja"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknite da biste konfigurirali pojedinosti o uređaju"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak baterije nije poznat."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Spojen na <xliff:g id="BLUETOOTH">%s</xliff:g> ."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani ste sa sljedećim uređajem: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Upareni uređaji nisu dostupni"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu uređaja"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Upari novi uređaj"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pogledajte sve"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Uključi"</string>
@@ -508,7 +506,7 @@
<string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Glasnoća je stišana na sigurniju razinu"</string>
<string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Pojačana je glasnoća u slušalicama dulje nego što se preporučuje"</string>
<string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Glasnoća slušalica premašila je sigurno ograničenje za ovaj tjedan"</string>
- <string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Nastavite slušati"</string>
+ <string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Nastavi slušati"</string>
<string name="csd_button_lower_volume" product="default" msgid="5347210412376264579">"Stišaj"</string>
<string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je prikvačena"</string>
<string name="screen_pinning_description" msgid="8699395373875667743">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili."</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Blokirani su kamera i mikrofon"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Uključen je prioritetni način rada"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkrivena je prisutnost korisnika"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u postavkama"</string>
<string name="install_app" msgid="5066668100199613936">"Instalacija"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Želite li zrcaliti na vanjski zaslon?"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 21194c4..1380985 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Nem áll rendelkezésre az Arcalapú feloldás"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth csatlakoztatva."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth-eszköz ikon"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kattintson az eszköz beállításainak megadásához"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Az akkumulátor töltöttségi szintje ismeretlen."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Csatlakoztatva a következőhöz: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Csatlakozva a következőhöz: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera és mikrofon letiltva"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon letiltva"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritás mód bekapcsolva"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Felhasználói jelenlét észlelve"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Állítson be alapértelmezett jegyzetkészítő alkalmazást a Beállításokban"</string>
<string name="install_app" msgid="5066668100199613936">"Alkalmazás telepítése"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Tükrözi a kijelzőt a külső képernyőre?"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index eafd14f..c31a162 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Դեմքով ապակողպումն անհասանելի է"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-ը միացված է:"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth սարքի պատկերակ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Սեղմեք՝ սարքի մանրամասները կազմաձևելու համար"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Մարտկոցի լիցքի մակարդակն անհայտ է։"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Միացված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Միացված է <xliff:g id="CAST">%s</xliff:g>-ին:"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Չանհանգստացնել"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Զուգակցված սարքեր չկան"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Հպեք՝ սարք միացնելու կամ անջատելու համար"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Նոր սարքի զուգակցում"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Տեսնել բոլորը"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Միացնել Bluetooth-ը"</string>
@@ -1124,7 +1122,7 @@
<string name="clipboard_image_preview" msgid="2156475174343538128">"Պատկերի նախադիտում"</string>
<string name="clipboard_edit" msgid="4500155216174011640">"փոփոխել"</string>
<string name="add" msgid="81036585205287996">"Ավելացնել"</string>
- <string name="manage_users" msgid="1823875311934643849">"Օգտատերերի կառավարում"</string>
+ <string name="manage_users" msgid="1823875311934643849">"Կառավարել"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Այս ծանուցումը հնարավոր չէ քաշել տրոհված էկրանի մեկ հատվածից մյուսը"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi-ը հասանելի չէ"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Առաջնահերթության ռեժիմ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Տեսախցիկն ու խոսափողը արգելափակված են"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Խոսափողն արգելափակված է"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Առաջնահերթության ռեժիմը միացված է"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Հայտնաբերվել է օգտատեր"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Կարգավորեք նշումների կանխադրված հավելված Կարգավորումներում"</string>
<string name="install_app" msgid="5066668100199613936">"Տեղադրել հավելվածը"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Հայելապատճենե՞լ արտաքին էկրանին"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index c78b42b..56d0381 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Buka dengan Wajah tidak tersedia"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth terhubung."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikon perangkat Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klik untuk mengonfigurasi detail perangkat"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Persentase baterai tidak diketahui."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Terhubung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Terhubung ke <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Perangkat yang disandingkan tak tersedia"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk menghubungkan atau memutuskan koneksi perangkat"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Sambungkan perangkat baru"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Lihat semua"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Gunakan Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon diblokir"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon diblokir"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode prioritas diaktifkan"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna terdeteksi"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setel aplikasi catatan default di Setelan"</string>
<string name="install_app" msgid="5066668100199613936">"Instal aplikasi"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Cerminkan ke layar eksternal?"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 5c68e70..1e517b1 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Andlitskenni ekki í boði"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tengt."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Tákn Bluetooth-tækis"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Smelltu til að stilla tækjaupplýsingar"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Staða rafhlöðu óþekkt."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tengt við <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Tengt við <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ónáðið ekki"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Engin pöruð tæki til staðar"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ýttu til að tengja eða aftengja tæki"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Para nýtt tæki"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Sjá allt"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Nota Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Lokað fyrir myndavél og hljóðnema"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Lokað fyrir hljóðnema"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Kveikt er á forgangsstillingu"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viðvera notanda greindist"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stilltu sjálfgefið glósuforrit í stillingunum"</string>
<string name="install_app" msgid="5066668100199613936">"Setja upp forrit"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Spegla yfir á ytri skjá?"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index dfb0054..03faea6 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Sblocco con il Volto non disponibile"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth collegato."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icona del dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Fai clic per configurare i dettagli del dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentuale della batteria sconosciuta."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connesso a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Connesso a: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non disturbare"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nessun dispositivo accoppiato disponibile"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tocca per connettere o disconnettere un dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Accoppia nuovo dispositivo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Visualizza tutti"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usa Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Videocamera e microfono bloccati"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfono bloccato"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modalità priorità attivata"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viene rilevata la presenza dell\'utente"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Imposta l\'app per le note predefinita nelle Impostazioni"</string>
<string name="install_app" msgid="5066668100199613936">"Installa app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vuoi eseguire il mirroring al display esterno?"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 8eb9a55..f007658 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"顔認証を利用できません"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetoothに接続済み。"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth デバイスのアイコン"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"クリックしてデバイスの詳細を設定します"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"バッテリー残量は不明です。"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>に接続しました。"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>に接続されています。"</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"カメラとマイクはブロックされています"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"マイクはブロックされています"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先モードは ON です"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"会話を始められます"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"[設定] でデフォルトのメモアプリを設定してください"</string>
<string name="install_app" msgid="5066668100199613936">"アプリをインストール"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"外部ディスプレイにミラーリングしますか?"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 3e508b7..562962a 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"სახით განბლოკვა მიუწვდომელია."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth დაკავშირებულია."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth მოწყობილობის ხატულა"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"დააწკაპუნეთ მოწყობილობის დეტალების კონფიგურირებისთვის"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ბატარეის პროცენტული მაჩვენებელი უცნობია."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"დაკავშირებულია <xliff:g id="BLUETOOTH">%s</xliff:g>-თან."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"დაკავშირებულია მოწყობილობასთან: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"არ შემაწუხოთ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"დაწყვილებული მოწყობილობები მიუწვდომელია"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"შეეხეთ მოწყობილობის დასაკავშირებლად ან გასათიშად"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ახალი მოწყობილობის დაწყვილება"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ყველას ნახვა"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth-ის გამოყენება"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"კამერა და მიკროფონი დაბლოკილია"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"მიკროფონი დაბლოკილია"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"პრიორიტეტული რეჟიმი ჩართულია"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"აღმოჩენილია მომხმარებლის ყოფნა"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"დააყენეთ ნაგულისხმევი შენიშვნების აპი პარამეტრებში"</string>
<string name="install_app" msgid="5066668100199613936">"აპის ინსტალაცია"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"აირეკლოს გარე ეკრანზე?"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index a2231ce..7532a64 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Бет тану функциясы қолжетімсіз."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth қосылған."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth құрылғысы белгішесі"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Құрылғы деректерін конфигурациялау үшін басыңыз."</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея зарядының мөлшері белгісіз."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> қосылған."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> трансляциясына қосылды."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Мазаламау"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Жұптасқан құрылғылар жоқ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Құрылғыны жалғау не ажырату үшін түртіңіз."</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Жаңа құрылғыны жұптау"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Барлығын көру"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth-ты пайдалану"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера мен микрофон блокталған."</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон блокталған."</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"\"Маңызды\" режимі қосулы."</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Пайдаланушы анықталды."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден әдепкі жазба қолданбасын орнатыңыз."</string>
<string name="install_app" msgid="5066668100199613936">"Қолданбаны орнату"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Сыртқы экран арқылы да көрсету керек пе?"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 95c4360..c823635 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"មិនអាចប្រើការដោះសោតាមទម្រង់មុខបានទេ"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"បានតភ្ជាប់ប៊្លូធូស។"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"រូបឧបករណ៍ប៊្លូធូស"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ចុចដើម្បីកំណត់រចនាសម្ព័ន្ធព័ត៌មានលម្អិតអំពីឧបករណ៍"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"មិនដឹងអំពីភាគរយថ្មទេ។"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"បានភ្ជាប់ទៅ <xliff:g id="BLUETOOTH">%s</xliff:g> ។"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"បានភ្ជាប់ទៅ <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"កុំរំខាន"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ប៊្លូធូស"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"មិនមានឧបករណ៍ផ្គូផ្គងដែលអាចប្រើបាន"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ចុចដើម្បីភ្ជាប់ ឬផ្ដាច់ឧបករណ៍"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ផ្គូផ្គងឧបករណ៍ថ្មី"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"មើលទាំងអស់"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ប្រើប៊្លូធូស"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"បានទប់ស្កាត់កាមេរ៉ា និងមីក្រូហ្វូន"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"បានទប់ស្កាត់មីក្រូហ្វូន"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"មុខងារអាទិភាពត្រូវបានបើក"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"វត្តមានអ្នកប្រើប្រាស់ត្រូវបានចាប់ដឹង"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"កំណត់កម្មវិធីកំណត់ចំណាំលំនាំដើមនៅក្នុងការកំណត់"</string>
<string name="install_app" msgid="5066668100199613936">"ដំឡើងកម្មវិធី"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"បញ្ចាំងទៅឧបករណ៍បញ្ចាំងខាងក្រៅឬ?"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 743ee00..7447d5b 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ಬ್ಲೂಟೂತ್ ಸಾಧನ ಐಕಾನ್"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ಸಾಧನದ ವಿವರಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ಬ್ಲೂಟೂತ್"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ಯಾವುದೇ ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಅಥವಾ ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ಹೊಸ ಸಾಧನವನ್ನು ಪೇರ್ ಮಾಡಿ"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ಬ್ಲೂಟೂತ್ ಬಳಸಿ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ಆದ್ಯತೆಯ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ಬಳಕೆದಾರರ ಉಪಸ್ಥಿತಿಯನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
<string name="install_app" msgid="5066668100199613936">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ಬಾಹ್ಯ ಡಿಸ್ಪ್ಲೇಗೆ ಪ್ರತಿಬಿಂಬಿಸಬೇಕೆ?"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 2911173..8859660 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"얼굴 인식 잠금 해제를 사용할 수 없습니다."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"블루투스가 연결되었습니다."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"블루투스 기기 아이콘"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"기기 세부정보를 구성하려면 클릭하세요."</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"배터리 잔량을 알 수 없습니다."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>에 연결되었습니다."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>에 연결됨"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"방해 금지 모드"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"블루투스"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"페어링된 기기가 없습니다"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"기기를 연결 또는 연결 해제하려면 탭하세요"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"새 기기와 페어링"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"모두 보기"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"블루투스 사용"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"카메라 및 마이크 차단됨"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"마이크 차단됨"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"우선순위 모드 설정됨"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"사용자 정보가 감지되었습니다."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"설정에서 기본 메모 앱 설정"</string>
<string name="install_app" msgid="5066668100199613936">"앱 설치"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"외부 디스플레이로 미러링하시겠습니까?"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index a0004e7..ae4f431 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"\"Жүзүнөн таанып ачуу\" жеткиликсиз"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth байланышта"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth түзмөгүнүн сүрөтчөсү"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Түзмөктүн чоо-жайын конфигурациялоо үчүн чыкылдатыңыз"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея кубатынын деңгээли белгисиз."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> менен туташкан."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> менен туташты."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера менен микрофон бөгөттөлдү"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгөттөлдү"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Маанилүү сүйлөшүүлөр режими күйүк"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Колдонуучу аныкталды"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден демейки кыска жазуулар колдонмосун тууралаңыз"</string>
<string name="install_app" msgid="5066668100199613936">"Колдонмону орнотуу"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Тышкы экранга чыгарасызбы?"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 443bd70..a4c9417 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ໃຊ້ການປົດລັອກດ້ວຍໜ້າບໍ່ໄດ້"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ເຊື່ອມຕໍ່ Bluetooth ແລ້ວ."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ໄອຄອນອຸປະກອນ Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ຄລິກເພື່ອຕັ້ງຄ່າລາຍລະອຽດອຸປະກອນ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="BLUETOOTH">%s</xliff:g> ແລ້ວ."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="CAST">%s</xliff:g> ແລ້ວ."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ຫ້າມລົບກວນ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ບໍ່ມີອຸປະກອນທີ່ສາມາດຈັບຄູ່ໄດ້"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ແຕະເພື່ອເຊື່ອມຕໍ່ ຫຼື ຕັດການເຊື່ອມຕໍ່ອຸປະກອນ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ຈັບຄູ່ອຸປະກອນໃໝ່"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ເບິ່ງທັງໝົດ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ໃຊ້ Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ໂໝດຄວາມສຳຄັນເປີດຢູ່"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ກວດພົບຕົວຕົນຜູ້ໃຊ້"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ຕັ້ງຄ່າແອັບຈົດບັນທຶກເລີ່ມຕົ້ນໃນການຕັ້ງຄ່າ"</string>
<string name="install_app" msgid="5066668100199613936">"ຕິດຕັ້ງແອັບ"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ສາຍໃສ່ຈໍສະແດງຜົນພາຍນອກບໍ?"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index b6758b7e..772ff0e 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Atrakinimo pagal veidą funkcija nepasiekiama"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"„Bluetooth“ prijungtas."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"„Bluetooth“ įrenginio piktograma"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Spustelėkite, jei norite konfigūruoti išsamią įrenginio informaciją"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumuliatoriaus energija procentais nežinoma."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Prisijungta prie „<xliff:g id="BLUETOOTH">%s</xliff:g>“."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Prisijungta prie <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Netrukdymo režimas"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nėra pasiekiamų susietų įrenginių"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Palieskite, kad prijungtumėte ar atjungtumėte įrenginį"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Susieti naują įrenginį"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Žiūrėti viską"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"„Bluetooth“ naudojimas"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparatas ir mikrofonas užblokuoti"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonas užblokuotas"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteto režimas įjungtas"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Aptikta naudotojo veikla"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nustatykite numatytąją užrašų programą Nustatymuose"</string>
<string name="install_app" msgid="5066668100199613936">"Įdiegti programą"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Bendrinti ekrano vaizdą išoriniame ekrane?"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index a1de3cf..9987f48 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Autorizācija pēc sejas nav pieejama"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth savienojums ir izveidots."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth ierīces ikona"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Lai konfigurētu ierīces informāciju, noklikšķiniet"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumulatora uzlādes līmenis procentos nav zināms."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ir izveidots savienojum ar <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Savienots ar ierīci <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režīms “Netraucēt”"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nav pieejama neviena pārī savienota ierīce."</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Lai pievienotu vai atvienotu kādu ierīci, pieskarieties."</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Savienošana pārī ar jaunu ierīci"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Skatīt visas"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Izmantot Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameras un mikrofona lietošana ir bloķēta"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofons ir bloķēts"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritātes režīms ir ieslēgts"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Konstatēta lietotāja klātbūtne"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Iestatījumos iestatiet noklusējuma piezīmju lietotni."</string>
<string name="install_app" msgid="5066668100199613936">"Instalēt lietotni"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vai spoguļot ārējā displejā?"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 93c973f..273443f 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"„Отклучувањето со лик“ е недостапно"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth е поврзан."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Икона за уред со Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Кликнете за да ги конфигурирате деталите за уредот"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентот на батеријата е непознат."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Поврзано со <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Поврзано со <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не вознемирувај"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нема достапни спарени уреди"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Допрете за да поврзете уред или да ја прекинете врската со уред"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Спарете нов уред"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Прикажи ги сите"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Користи Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камерата и микрофонот се блокирани"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофонот е блокиран"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетниот режим е вклучен"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Откриено е присуство на корисник"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Поставете стандардна апликација за белешки во „Поставки“"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталирајте ја апликацијата"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Да се синхронизира на надворешниот екран?"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index f7aa8cb..a521eee 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ഫെയ്സ് അൺലോക്ക് ലഭ്യമല്ല"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth ഉപകരണ ഐക്കൺ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ഉപകരണത്തിന്റെ വിശദാംശങ്ങൾ കോൺഫിഗർ ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ശല്യപ്പെടുത്തരുത്"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ജോടിയാക്കിയ ഉപകരണങ്ങളൊന്നും ലഭ്യമല്ല"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ഒരു ഉപകരണം കണക്റ്റ് ചെയ്യാനോ വിച്ഛേദിക്കാനോ ടാപ്പ് ചെയ്യുക"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"പുതിയ ഉപകരണം ജോടിയാക്കുക"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"എല്ലാം കാണുക"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth ഉപയോഗിക്കുക"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ക്യാമറയും മൈക്രോഫോണും ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"മൈക്രോഫോൺ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"മുൻഗണനാ മോഡ് ഓണാണ്"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ഉപയോക്താവിന്റെ സാന്നിധ്യം കണ്ടെത്തി"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ക്രമീകരണത്തിൽ കുറിപ്പുകൾക്കുള്ള ഡിഫോൾട്ട് ആപ്പ് സജ്ജീകരിക്കുക"</string>
<string name="install_app" msgid="5066668100199613936">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യൂ"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ബാഹ്യ ഡിസ്പ്ലേയിലേക്ക് മിറർ ചെയ്യണോ?"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 5ad6d7e..7e58aff 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Царайгаар түгжээ тайлах боломжгүй"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth холбогдсон."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth төхөөрөмжийн дүрс тэмдэг"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Төхөөрөмжийн дэлгэрэнгүйг тохируулахын тулд товшино уу"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарейн хувь тодорхойгүй байна."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>-тай холбогдсон."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>-д холбогдсон."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Бүү саад бол"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Хослуулсан төхөөрөмж байхгүй"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Төхөөрөмжийг холбох эсвэл салгахын тулд товшино уу"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Шинэ төхөөрөмж хослуулах"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Бүгдийг харах"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth-г ашиглах"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камер болон микрофоныг блоклосон"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофоныг блоклосон"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Чухал горим асаалттай байна"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Хэрэглэгч байгааг илрүүлсэн"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Тохиргоонд тэмдэглэлийн өгөгдмөл апп тохируулна уу"</string>
<string name="install_app" msgid="5066668100199613936">"Аппыг суулгах"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Гадны дэлгэцэд тусгал үүсгэх үү?"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 54bfb66..4f0b947 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"फेस अनलॉक उपलब्ध नाही"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लूटूथ कनेक्ट केले."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ब्लूटूथ डिव्हाइस आयकन"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"डिव्हाइसचे तपशील कॉंफिगर करण्यासाठी क्लिक करा"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> शी कनेक्ट केले."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> शी कनेक्ट केले."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"व्यत्यय आणू नका"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोणतेही जोडलेले डिव्हाइसेस उपलब्ध नाहीत"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"डिव्हाइस कनेक्ट किंवा डिस्कनेक्ट करण्यासाठी टॅप करा"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"नवीन डिव्हाइस पेअर करा"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"सर्व पहा"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ब्लूटूथ वापरा"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कॅमेरा आणि मायक्रोफोन ब्लॉक केले आहेत"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"मायक्रोफोन ब्लॉक केला"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राधान्य मोड सुरू आहे"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"वापरकर्त्याची उपस्थिती डिटेक्ट केली"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग्ज मध्ये डीफॉल्ट टिपा अॅप सेट करा"</string>
<string name="install_app" msgid="5066668100199613936">"अॅप इंस्टॉल करा"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"बाह्य डिस्प्लेवर मिरर करायचे आहे का?"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index c486e1d..514e5ac 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Buka Kunci Wajah tidak tersedia"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth disambungkan."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikon peranti Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klik untuk mengkonfigurasi butiran peranti"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Peratusan kuasa bateri tidak diketahui."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Disambungkan kepada <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Disambungkan ke <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Tiada peranti berpasangan tersedia"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketik untuk menyambungkan atau memutuskan sambungan peranti"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Gandingkan peranti baharu"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Lihat semua"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Gunakan Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon disekat"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon disekat"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mod keutamaan dihidupkan"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna dikesan"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Tetapkan apl nota lalai dalam Tetapan"</string>
<string name="install_app" msgid="5066668100199613936">"Pasang apl"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Paparkan pada paparan luaran?"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index c38d493..0a38701 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း မရနိုင်ပါ"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ဘလူးတုသ်သုံးစက် သင်္ကေတ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"စက်အသေးစိတ်ကို စီစဉ်သတ်မှတ်ရန် နှိပ်ပါ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>သို့ ချိတ်ဆက်ထား"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> သို့ချိတ်ဆက်ထားပါသည်။"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"မနှောင့်ယှက်ရ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ဘလူးတုသ်"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"စက်ကို ချိတ်ဆက်ရန် (သို့) ချိတ်ဆက်မှုဖြုတ်ရန် တို့ပါ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"စက်အသစ်တွဲချိတ်ရန်"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"အားလုံးကြည့်ရန်"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ဘလူးတုသ်သုံးရန်"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ဦးစားပေးမုဒ် ဖွင့်ထားသည်"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"အသုံးပြုသူရှိကြောင်း တွေ့ရသည်"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ဆက်တင်များတွင် မူရင်းမှတ်စုများအက်ပ် သတ်မှတ်ပါ"</string>
<string name="install_app" msgid="5066668100199613936">"အက်ပ် ထည့်သွင်းရန်"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ပြင်ပဖန်သားပြင်သို့ စကရင်ပွားမလား။"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 0accbec..db181ad 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ansiktslås er utilgjengelig"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth er tilkoblet."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikon for Bluetooth-enheter"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klikk for å konfigurere enhetsdetaljer"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriprosenten er ukjent."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Koblet til <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Koblet til <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ikke forstyrr"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ingen sammenkoblede enheter er tilgjengelige"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Trykk for å koble en enhet til eller fra"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Koble til en ny enhet"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Se alle"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bruk Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameraet og mikrofonen er blokkert"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokkert"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteringsmodus er på"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Det er registrert at brukeren er til stede"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Du kan velge en standardapp for notater i Innstillinger"</string>
<string name="install_app" msgid="5066668100199613936">"Installer appen"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vil du speile til en ekstern skjerm?"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 4ca9af9..30c9722 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"फेस अनलक उपलब्ध छैन"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लुटुथ जडान भयो।"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ब्लुटुथ डिभाइस जनाउने आइकन"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"डिभाइसको विवरण कन्फिगर गर्न क्लिक गर्नुहोस्"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> मा जडित।"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> मा कनेक्ट गरियो।"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"बाधा नपुऱ्याउनुहोस्"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लुटुथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"जोडी उपकरणहरू उपलब्ध छैन"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"कुनै डिभाइस कनेक्ट गर्न वा डिस्कनेक्ट गर्न ट्याप गर्नुहोस्"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"नयाँ डिभाइस कनेक्ट गर्नुहोस्"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"सबै डिभाइसहरू हेर्नुहोस्"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ब्लुटुथ प्रयोग गर्नुहोस्"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"क्यामेरा र माइक्रोफोन ब्लक गरिएको छ"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफोन ब्लक गरिएको छ"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राथमिकता मोड अन छ"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"प्रयोगकर्ता उपस्थित भएको कुरा पत्ता लागेको छ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिङमा गई नोट बनाउने डिफल्ट एप तोक्नुहोस्"</string>
<string name="install_app" msgid="5066668100199613936">"एप इन्स्टल गर्नुहोस्"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"बाह्य डिस्प्लेमा मिरर गर्ने हो?"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index f36c3c7..dc654a5 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ontgrendelen via gezichtsherkenning niet beschikbaar"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-verbinding ingesteld."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icoon voor bluetooth-apparaat"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klik om de apparaatgegevens in te stellen"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterijpercentage onbekend."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Verbonden met <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Verbonden met <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Niet storen"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen gekoppelde apparaten beschikbaar"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tik om een apparaat te verbinden of de verbinding te verbreken"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Nieuw apparaat koppelen"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Alles bekijken"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth gebruiken"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera en microfoon geblokkeerd"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfoon geblokkeerd"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitsmodus aan"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikersaanwezigheid is waargenomen"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standaard notitie-app instellen in Instellingen"</string>
<string name="install_app" msgid="5066668100199613936">"App installeren"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Spiegelen naar extern scherm?"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 2552600..bc2cef0 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ଫେସ ଅନଲକ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ବ୍ଲୁଟୂଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଆଇକନ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ଡିଭାଇସ ବିବରଣୀକୁ କନଫିଗର କରିବା ପାଇଁ କ୍ଲିକ କରନ୍ତୁ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ବ୍ଲୁଟୁଥ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ପେୟାର୍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ଏକ ଡିଭାଇସ କନେକ୍ଟ କିମ୍ବା ଡିସକନେକ୍ଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ନୂଆ ଡିଭାଇସକୁ ପେୟାର କରନ୍ତୁ"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ସବୁ ଦେଖନ୍ତୁ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ବ୍ଲୁଟୁଥ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"କେମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ପ୍ରାୟୋରିଟି ମୋଡ ଚାଲୁ ଅଛି"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ୟୁଜରଙ୍କ ଉପସ୍ଥିତି ଚିହ୍ନଟ କରାଯାଇଛି"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ସେଟିଂସରେ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ ସେଟ କରନ୍ତୁ"</string>
<string name="install_app" msgid="5066668100199613936">"ଆପ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେକୁ ମିରର କରିବେ?"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 5551bc9..66c3e46 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ਫ਼ੇਸ ਅਣਲਾਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਤੀਕ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"ਡੀਵਾਈਸ ਦੇ ਵੇਰਵੇ ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ਬਲੂਟੁੱਥ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ਕੋਈ ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ਡੀਵਾਈਸ ਨੂੰ ਕਨੈਕਟ ਜਾਂ ਡਿਸਕਨੈਕਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ਸਭ ਦੇਖੋ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ਬਲੂਟੁੱਥ ਵਰਤੋ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤੇ ਗਏ"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ਤਰਜੀਹ ਮੋਡ ਚਾਲੂ ਹੈ"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ਵਰਤੋਂਕਾਰ ਦੀ ਮੌਜੂਦਗੀ ਦਾ ਪਤਾ ਲਗਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਨੂੰ ਸੈੱਟ ਕਰੋ"</string>
<string name="install_app" msgid="5066668100199613936">"ਐਪ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"ਕੀ ਬਾਹਰੀ ਡਿਸਪਲੇ \'ਤੇ ਪ੍ਰਤਿਬਿੰਬਿਤ ਕਰਨਾ ਹੈ?"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 546bf41..589c2a3 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Rozpoznawanie twarzy niedostępne"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth połączony."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona urządzenia Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknij, aby skonfigurować szczegóły urządzenia"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Poziom naładowania baterii jest nieznany."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Połączono z <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Połączono z urządzeniem <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nie przeszkadzać"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Brak dostępnych sparowanych urządzeń"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Kliknij, aby podłączyć lub odłączyć urządzenie"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Sparuj nowe urządzenie"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pokaż wszystkie"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Użyj Bluetootha"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon są zablokowane"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon jest zablokowany"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Tryb priorytetowy jest włączony"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Wykryto obecność użytkownika"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ustaw domyślną aplikację do obsługi notatek w Ustawieniach"</string>
<string name="install_app" msgid="5066668100199613936">"Zainstaluj aplikację"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Powielić na wyświetlaczu zewnętrznym?"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index d3ac7fd..f9f247a 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"O Desbloqueio facial não está disponível"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ícone de dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Clique para configurar os detalhes do dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toque para conectar ou desconectar um dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Parear novo dispositivo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Mostrar tudo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo de prioridade ativado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Espelhar para a tela externa?"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c81b8b0..b445d08 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Desbloqueio facial indisponível"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ligado."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ícone de dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Clique para configurar o detalhe do dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentagem da bateria desconhecida."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ligado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Ligado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmara e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo Prioridade ativado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Quando deteta a presença do utilizador"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Predefina a app de notas nas Definições"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Espelhar para o ecrã externo?"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index d3ac7fd..f9f247a 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"O Desbloqueio facial não está disponível"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ícone de dispositivo Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Clique para configurar os detalhes do dispositivo"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toque para conectar ou desconectar um dispositivo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Parear novo dispositivo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Mostrar tudo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo de prioridade ativado"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Espelhar para a tela externa?"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 1ca164f..563d8e1 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Deblocarea facială nu este disponibilă"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Conectat prin Bluetooth."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Pictograma de dispozitiv Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Dă clic pentru a configura detaliile dispozitivului"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procentajul bateriei este necunoscut."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectat la <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"S-a stabilit conexiunea la <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nu deranja"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Niciun dispozitiv conectat disponibil"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Atinge pentru a conecta sau deconecta un dispozitiv"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Asociază un nou dispozitiv"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Afișează tot"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Folosește Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera foto și microfonul sunt blocate"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfonul a fost blocat"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modul Cu prioritate este activat"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"S-a detectat prezența utilizatorului"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setează aplicația prestabilită de note din Setări"</string>
<string name="install_app" msgid="5066668100199613936">"Instalează aplicația"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Oglindești pe ecranul extern?"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 476c1fa..e1ac364 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Фейсконтроль недоступен"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-соединение установлено."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Значок устройства Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Нажмите, чтобы изменить информацию об устройстве"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Уровень заряда батареи в процентах неизвестен."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>: подключено."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Подключено к: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не беспокоить"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нет доступных сопряженных устройств"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Нажмите, чтобы подключить или отключить устройство"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Подключить устройство"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Все"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Использовать"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон заблокированы"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон заблокирован"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Режим \"Только важные\" включен"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Обнаружен пользователь"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартное приложение для заметок в настройках."</string>
<string name="install_app" msgid="5066668100199613936">"Установить приложение"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Дублировать на внешний дисплей?"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index d130ebf..edcf415 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"මුහුණෙන් අගුළු ඇරීම නැත"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"බ්ලූටූත් සම්බන්ධිතයි."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"බ්ලූටූත් උපාංග නිරූපකය"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"උපාංග විස්තර වින්යාස කිරීමට ක්ලික් කරන්න"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"බැටරි ප්රතිශතය නොදනී."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> වෙත සම්බන්ධ කරන ලදි."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> වෙත සම්බන්ධ විය."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"බාධා නොකරන්න"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"බ්ලූටූත්"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"යුගල කළ උපාංග නොතිබේ"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"උපාංගයක් සම්බන්ධ කිරීමට හෝ විසන්ධි කිරීමට තට්ටු කරන්න"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"නව උපාංගය යුගල කරන්න"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"සියල්ල බලන්න"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"බ්ලූටූත් භාවිතා කරන්න"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"කැමරාව සහ මයික්රොෆෝනය අවහිරයි"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"මයික්රොෆෝනය අවහිරයි"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ප්රමුඛතා මාදිලිය සක්රීයයි"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"පරිශීලක රූපාකාරය අනාවරණය වේ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"සැකසීම් තුළ පෙරනිමි සටහන් යෙදුම සකසන්න"</string>
<string name="install_app" msgid="5066668100199613936">"යෙදුම ස්ථාපනය කරන්න"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"බාහිර සංදර්ශකයට දර්පණය කරන්න ද?"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a00053a..d95bde1 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Odomknutie tvárou nie je k dispozícii"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth pripojené."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona zariadenia s rozhraním Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknutím nakonfigurujte podrobnosti o zariadení"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percento batérie nie je známe."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Pripojené k zariadeniu <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Pripojené k zariadeniu <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režim bez vyrušení"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nie sú k dispozícii žiadne spárované zariadenia"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím pripojíte alebo odpojíte zariadenie"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Spárovať nové zariadenie"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Zobraziť všetko"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Použiť Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofón sú blokované"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofón je blokovaný"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Bola rozpoznaná prítomnosť používateľa"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavte predvolenú aplikáciu na poznámky v Nastaveniach"</string>
<string name="install_app" msgid="5066668100199613936">"Inštalovať aplikáciu"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Chcete zrkadliť na externú obrazovku?"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 504eec7..cc6040f 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Odklepanje z obrazom ni na voljo."</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Povezava Bluetooth vzpostavljena."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona naprave Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliknite za konfiguriranje podrobnosti o napravi"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Neznan odstotek napolnjenosti baterije."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezava vzpostavljena z: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Vzpostavljena povezava: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne moti"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Na voljo ni nobene seznanjene naprave"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dotaknite se za vzpostavitev ali prekinitev povezave z napravo"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Seznanitev nove naprave"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pokaži vse"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Uporabi Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparat in mikrofon sta blokirana."</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran."</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prednostni način je vklopljen."</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Zaznana je prisotnost uporabnika"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavite privzeto aplikacijo za zapiske v nastavitvah."</string>
<string name="install_app" msgid="5066668100199613936">"Namesti aplikacijo"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Želite zrcaliti v zunanji zaslon?"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index d9c0c6f..e214f4a 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"\"Shkyçja me fytyrë\" nuk ofrohet"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Pajisja është lidhur me \"bluetooth\"."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Ikona e pajisjes me Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Kliko për të konfiguruar detajet e pajisjes"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Përqindja e baterisë e panjohur."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Lidhur me <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Është lidhur me <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mos shqetëso"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth-i"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nuk ofrohet për përdorim asnjë pajisje e çiftuar"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Trokit për të lidhur ose shkëputur një pajisje"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Çifto pajisje të re"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Shiko të gjitha"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Përdor Bluetooth-in"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dhe mikrofoni u bllokuan"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni u bllokua"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modaliteti i përparësisë aktiv"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Është zbuluar prania e përdoruesit"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Cakto aplikacionin e parazgjedhur të shënimeve te \"Cilësimet\""</string>
<string name="install_app" msgid="5066668100199613936">"Instalo aplikacionin"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Të pasqyrohet në ekranin e jashtëm?"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 16a1853..d251232 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Откључавање лицем није доступно"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth је прикључен."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Икона Bluetooth уређаја"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Кликните да бисте конфигурисали детаље о уређају"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Проценат напуњености батерије није познат."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Повезани сте са <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Повезани смо са уређајем <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не узнемиравај"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Није доступан ниједан упарени уређај"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Додирните да бисте повезали уређај или прекинули везу"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Упари нови уређај"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Прикажи све"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Користи Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон су блокирани"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон је блокиран"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетни режим је укључен"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Присуство корисника може да се открије"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Подесите подразумевану апликацију за белешке у Подешавањима"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталирај апликацију"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Желите ли да пресликате на спољњи екран?"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 30c8a4a..b870a1d 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ansiktslås är otillgängligt"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ansluten."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Enhetsikon för Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Klicka för att konfigurera enhetsinformation"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Okänd batterinivå."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ansluten till <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Ansluten till <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Stör ej"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Det finns inga kopplade enheter tillgängliga"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tryck för att ansluta eller koppla från en enhet"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Parkoppla en ny enhet"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Se alla"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Använd Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameran och mikrofonen är blockerade"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen är blockerad"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetsläge är aktiverat"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Användarnärvaro har upptäckts"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ställ in en standardapp för anteckningar i inställningarna"</string>
<string name="install_app" msgid="5066668100199613936">"Installera appen"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Vill du spegla till extern skärm?"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 77d1717..57bedbf 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Kipengele cha Kufungua kwa Uso hakipatikani"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth imeunganishwa."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Aikoni ya Kifaa chenye Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Bofya ili uweke mipangilio ya maelezo ya kifaa"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Asilimia ya betri haijulikani."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Imeunganishwa kwenye <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Imeunganishwa kwenye <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Usinisumbue"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Hakuna vifaa vilivyooanishwa vinavyopatikana"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Gusa ili uunganishe au utenganishe kifaa"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Oanisha kifaa kipya"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Angalia vyote"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Tumia Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera na maikrofoni zimezuiwa"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Maikrofoni imezuiwa"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Hali ya kipaumbele imewashwa"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Imetambua uwepo wa mtumiaji"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Teua programu chaguomsingi ya madokezo katika Mipangilio"</string>
<string name="install_app" msgid="5066668100199613936">"Sakinisha programu"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Ungependa kuonyesha kwenye skrini ya nje?"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index a505c3a..9342ce9 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"முகம் காட்டித் திறத்தல் அம்சம் கிடைக்கவில்லை"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"புளூடூத் இணைக்கப்பட்டது."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"புளூடூத் சாதன ஐகான்"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"சாதன விவரத்தை உள்ளமைக்க கிளிக் செய்யலாம்"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"பேட்டரி சதவீதம் தெரியவில்லை."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>க்கு இணைக்கப்பட்டது."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"தொந்தரவு செய்ய வேண்டாம்"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"புளூடூத்"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"இணைக்கப்பட்ட சாதனங்கள் இல்லை"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"சாதனத்தை இணைக்க/துண்டிக்க தட்டவும்"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"புதிய சாதனத்தை இணைத்தல்"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"அனைத்தையும் காட்டு"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"புளூடூத்தைப் பயன்படுத்துதல்"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டுள்ளன"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"மைக்ரோஃபோன் தடுக்கப்பட்டுள்ளது"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"முன்னுரிமைப் பயன்முறை இயக்கத்தில் உள்ளது"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"பயனர் கண்டறியப்பட்டுள்ளார்"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"குறிப்பு எடுப்பதற்கான இயல்புநிலை ஆப்ஸை அமைப்புகளில் அமையுங்கள்"</string>
<string name="install_app" msgid="5066668100199613936">"ஆப்ஸை நிறுவுங்கள்"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"வெளிப்புறக் காட்சிக்கு மிரர் செய்யவா?"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 06296d2..e9f07af 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"ఫేస్ అన్లాక్ అందుబాటులో లేదు"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"బ్లూటూత్ కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"బ్లూటూత్ పరికర చిహ్నం"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"పరికర వివరాలను కాన్ఫిగర్ చేయడానికి క్లిక్ చేయండి"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"బ్యాటరీ శాతం తెలియదు."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"కెమెరా, మైక్రోఫోన్ బ్లాక్ చేయబడ్డాయి"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"మైక్రోఫోన్ బ్లాక్ చేయబడింది"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ప్రయారిటీ మోడ్ ఆన్లో ఉంది"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"యూజర్ ఉనికి గుర్తించబడింది"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"సెట్టింగ్లలో ఆటోమేటిక్గా ఉండేలా ఒక నోట్స్ యాప్ను సెట్ చేసుకోండి"</string>
<string name="install_app" msgid="5066668100199613936">"యాప్ను ఇన్స్టాల్ చేయండి"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"బాహ్య డిస్ప్లేను మిర్రర్ చేయాలా?"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ef597db..82d8118 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"การปลดล็อกด้วยใบหน้าไม่พร้อมใช้งาน"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"เชื่อมต่อบลูทูธแล้ว"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"ไอคอนอุปกรณ์บลูทูธ"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"คลิกเพื่อกำหนดค่ารายละเอียดอุปกรณ์"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"ไม่ทราบเปอร์เซ็นต์แบตเตอรี่"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"เชื่อมต่อกับ <xliff:g id="BLUETOOTH">%s</xliff:g> แล้ว"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"เชื่อมต่อกับ <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ห้ามรบกวน"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"บลูทูธ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ไม่มีอุปกรณ์ที่จับคู่ที่สามารถใช้ได้"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"แตะเพื่อเชื่อมต่อหรือยกเลิกการเชื่อมต่ออุปกรณ์"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"จับคู่อุปกรณ์ใหม่"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ดูทั้งหมด"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ใช้บลูทูธ"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"กล้องและไมโครโฟนถูกบล็อกอยู่"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ไมโครโฟนถูกบล็อกอยู่"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"โหมดลำดับความสำคัญเปิดอยู่"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"ตรวจพบการแสดงข้อมูลของผู้ใช้"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"กำหนดแอปการจดบันทึกเริ่มต้นในการตั้งค่า"</string>
<string name="install_app" msgid="5066668100199613936">"ติดตั้งแอป"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"มิเรอร์ไปยังจอแสดงผลภายนอกไหม"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index c476cff..211a747 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Hindi available ang Pag-unlock Gamit ang Mukha"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Nakakonekta ang Bluetooth."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Icon ng Bluetooth device"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"I-click para i-configure ang detalye ng device"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Hindi alam ang porsyento ng baterya."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Nakakonekta sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Nakakonekta sa <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -1181,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Naka-block ang camera at mikropono"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Naka-block ang mikropono"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Naka-on ang Priority mode"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Na-detect ang presensya ng user"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Magtakda ng default na app sa pagtatala sa Mga Setting"</string>
<string name="install_app" msgid="5066668100199613936">"I-install ang app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"I-mirror sa external na display?"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index e347d4a..e0fac50 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Yüz Tanıma Kilidi kullanılamıyor"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth bağlandı."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Bluetooth cihaz simgesi"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Cihaz ayrıntılarını yapılandırmak için tıklayın"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pil yüzdesi bilinmiyor."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ile bağlı."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> bağlantısı kuruldu."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Rahatsız Etmeyin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Kullanılabilir eşlenmiş cihaz yok"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Cihaz bağlamak veya cihazın bağlantısını kesmek için dokunun"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yeni cihaz eşleme"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Tümünü göster"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth\'u kullan"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ve mikrofon engellendi"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon engellendi"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Öncelik modu etkin"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kullanıcı varlığı algılandı"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlar\'ı kullanarak varsayılan notlar ayarlayın"</string>
<string name="install_app" msgid="5066668100199613936">"Uygulamayı yükle"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Harici ekrana yansıtılsın mı?"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index f0d1e57..a2c4ef5 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Фейс-контроль недоступний"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth під’єднано."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Значок пристрою з Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Натисніть, щоб змінити налаштування пристрою"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Відсоток заряду акумулятора невідомий."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Підключено до <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Під’єднано до пристрою <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбувати"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Немає спарених пристроїв"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Натисніть, щоб під’єднати або від’єднати пристрій"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Підключити новий пристрій"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Показати всі"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Увімкнути Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камеру й мікрофон заблоковано"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрофон заблоковано"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Режим пріоритету ввімкнено"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Виявлено присутність користувача"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Призначте стандартний додаток для нотаток у налаштуваннях"</string>
<string name="install_app" msgid="5066668100199613936">"Установити додаток"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Дублювати на зовнішньому екрані?"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index de1d827..364a84c 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"فیس اَنلاک غیر دستیاب ہے"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"بلوٹوتھ مربوط ہے۔"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"بلوٹوتھ آلے کا آئیکن"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"آلہ کی تفصیل کو کنفیگر کرنے کے لیے کلک کریں"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"بیٹری کی فیصد نامعلوم ہے۔"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> سے منسلک ہیں۔"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> سے منسلک ہے۔"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"ڈسٹرب نہ کریں"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوٹوتھ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"کوئی جوڑا بنائے ہوئے آلات دستیاب نہیں ہیں"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"کسی آلے کو منسلک یا غیر منسلک کرنے کے لیے تھپتھپائیں"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"نئے آلے کا جوڑا بنائیں"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"سبھی دیکھیں"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"استعمال کریں"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"کیمرا اور مائیکروفون مسدود ہے"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"مائیکروفون مسدود ہے"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ترجیحی موڈ آن ہے"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"صارف کی موجودگی کا پتہ چلا ہے"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ترتیبات میں ڈیفالٹ نوٹس ایپ سیٹ کریں"</string>
<string name="install_app" msgid="5066668100199613936">"ایپ انسٹال کریں"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"بیرونی ڈسپلے پر مرر کریں؟"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index ec1cf32..3ff1808 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -250,8 +250,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Bezovta qilinmasin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ulangan qurilmalar topilmadi"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Qurilma ulash yoki uzish uchun tegining"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yangi qurilmani ulash"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Hammasi"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth ishlatish"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index a457c35..92fefc6 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Không dùng được tính năng Mở khoá bằng khuôn mặt"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Đã kết nối bluetooth."</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Biểu tượng thiết bị Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Nhấp để định cấu hình thông tin thiết bị"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Tỷ lệ phần trăm pin không xác định."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Đã kết nối với <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Đã kết nối với <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Không làm phiền"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Không có thiết bị nào được ghép nối"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Nhấn để kết nối/ngắt kết nối với một thiết bị"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Ghép nối thiết bị mới"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Xem tất cả"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bật Bluetooth"</string>
@@ -288,7 +286,7 @@
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Đảo màu"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Chỉnh màu"</string>
<string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Cỡ chữ"</string>
- <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Quản lý người dùng"</string>
+ <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Quản lý ng.dùng"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Đóng"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Đã kết nối"</string>
@@ -1124,7 +1122,7 @@
<string name="clipboard_image_preview" msgid="2156475174343538128">"Bản xem trước hình ảnh"</string>
<string name="clipboard_edit" msgid="4500155216174011640">"sửa"</string>
<string name="add" msgid="81036585205287996">"Thêm"</string>
- <string name="manage_users" msgid="1823875311934643849">"Quản lý người dùng"</string>
+ <string name="manage_users" msgid="1823875311934643849">"Quản lý ng.dùng"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Thông báo này không hỗ trợ thao tác kéo để chia đôi màn hình"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Không có Wi‑Fi"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Chế độ ưu tiên"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Máy ảnh và micrô bị chặn"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrô bị chặn"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Chế độ ưu tiên đang bật"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Phát hiện thấy người dùng đang hiện diện"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Đặt ứng dụng ghi chú mặc định trong phần Cài đặt"</string>
<string name="install_app" msgid="5066668100199613936">"Cài đặt ứng dụng"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Đồng bộ hoá hai chiều sang màn hình ngoài?"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 9b385e0..712f1a9 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"无法使用人脸解锁功能"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"蓝牙已连接。"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"蓝牙设备图标"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"点击以配置设备详情"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"电池电量百分比未知。"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已连接到<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"已连接到 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"勿扰"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"蓝牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"没有可用的配对设备"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"点按即可连接设备或断开设备连接"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"与新设备配对"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"查看全部"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"使用蓝牙"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已禁用摄像头和麦克风"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已禁用麦克风"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"已开启优先模式"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"检测到用户存在"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在设置中设置默认记事应用"</string>
<string name="install_app" msgid="5066668100199613936">"安装应用"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"镜像到外接显示屏?"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index cd80e64..31abf82 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"無法使用面孔解鎖"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"藍牙連線已建立。"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"藍牙裝置圖示"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"按一下即可設定裝置詳情"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"電量百分比不明。"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"已連接至 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"請勿騷擾"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"輕按即可連結或解除連結裝置"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"配對新裝置"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"查看全部"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"使用藍牙"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖相機和麥克風"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先模式已開啟"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者動態"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設筆記應用程式"</string>
<string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"要鏡像投射至外部顯示屏嗎?"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index db557ca..d112ad2 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"無法使用人臉解鎖功能"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"藍牙連線已建立。"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"「藍牙裝置」圖示"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"按一下即可設定裝置詳細資料"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"電池電量不明。"</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"已連線至 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"零打擾"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"輕觸即可連結/取消連結裝置"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"配對新裝置"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"查看全部"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"使用藍牙"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖攝影機和麥克風"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先模式已開啟"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設記事應用程式"</string>
<string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"要以鏡像方式投放至外部螢幕嗎?"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 21a694f..d1bdc15 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -196,8 +196,7 @@
<string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ukuvula ngobuso akutholakali"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ixhunyiwe"</string>
<string name="accessibility_bluetooth_device_icon" msgid="9163840051642587982">"Isithonjana sedivayisi ye-Bluetooth"</string>
- <!-- no translation found for accessibility_bluetooth_device_settings_gear (3314916468105272540) -->
- <skip />
+ <string name="accessibility_bluetooth_device_settings_gear" msgid="3314916468105272540">"Chofoza ukuze ulungiselele imininingwane yedivayisi"</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"Iphesenti lebhethri alaziwa."</string>
<string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Xhuma ku-<xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"Ixhumeke ku-<xliff:g id="CAST">%s</xliff:g>."</string>
@@ -250,8 +249,7 @@
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ungaphazamisi"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"I-Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Awekho amadivayisi abhanqiwe atholakalayo"</string>
- <!-- no translation found for quick_settings_bluetooth_tile_subtitle (212752719010829550) -->
- <skip />
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Thepha ukuze uxhumae noma ungaxhumi idivaysi"</string>
<string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Bhangqa idivayisi entsha"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Buka konke"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Sebenzisa i-Bluetooth"</string>
@@ -1182,8 +1180,7 @@
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Ikhamera nemakrofoni zivinjiwe"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Imakrofoni ivinjiwe"</string>
<string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Imodi ebalulekile ivuliwe"</string>
- <!-- no translation found for assistant_attention_content_description (4166330881435263596) -->
- <skip />
+ <string name="assistant_attention_content_description" msgid="4166330881435263596">"Ubukhona bomsebenzisi butholakele"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setha i-app yamanothi azenzakalelayo Kumsethingi"</string>
<string name="install_app" msgid="5066668100199613936">"Faka i-app"</string>
<string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Fanisa nesibonisi sangaphandle?"</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstance.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstance.java
index f9f2c63..92f66902 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstance.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstance.java
@@ -269,6 +269,7 @@
private ClassLoader getParentClassLoader(ClassLoader baseClassLoader) {
return new PluginManagerImpl.ClassLoaderFilter(
baseClassLoader,
+ "androidx.constraintlayout.widget",
"com.android.systemui.common",
"com.android.systemui.log",
"com.android.systemui.plugin");
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
index b44bf39..fec96c6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
@@ -16,6 +16,8 @@
package com.android.systemui.shared.rotation;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
+
import android.annotation.DimenRes;
import android.annotation.IdRes;
import android.annotation.LayoutRes;
@@ -87,15 +89,15 @@
@DimenRes int roundedContentPadding, @DimenRes int taskbarLeftMargin,
@DimenRes int taskbarBottomMargin, @DimenRes int buttonDiameter,
@DimenRes int rippleMaxWidth, @BoolRes int floatingRotationBtnPositionLeftResource) {
- mWindowManager = context.getSystemService(WindowManager.class);
- mKeyButtonContainer = (ViewGroup) LayoutInflater.from(context).inflate(layout, null);
+ mContext = context.createWindowContext(context.getDisplay(), TYPE_NAVIGATION_BAR_PANEL,
+ null);
+ mWindowManager = mContext.getSystemService(WindowManager.class);
+ mKeyButtonContainer = (ViewGroup) LayoutInflater.from(mContext).inflate(layout, null);
mKeyButtonView = mKeyButtonContainer.findViewById(keyButtonId);
mKeyButtonView.setVisibility(View.VISIBLE);
- mKeyButtonView.setContentDescription(context.getString(contentDescriptionResource));
+ mKeyButtonView.setContentDescription(mContext.getString(contentDescriptionResource));
mKeyButtonView.setRipple(rippleMaxWidth);
- mContext = context;
-
mContentDescriptionResource = contentDescriptionResource;
mMinMarginResource = minMargin;
mRoundedContentPaddingResource = roundedContentPadding;
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index e47d36f..6b390b1 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -27,9 +27,9 @@
import android.util.TypedValue
import android.view.View
import android.view.View.OnAttachStateChangeListener
+import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnGlobalLayoutListener
-import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
@@ -63,7 +63,6 @@
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.launch
import java.util.Locale
import java.util.TimeZone
@@ -150,25 +149,24 @@
var pastVisibility: Int? = null
override fun onViewAttachedToWindow(view: View) {
value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context))
- if (view != null) {
- smallClockFrame = view.parent as FrameLayout
- smallClockFrame?.let {frame ->
- pastVisibility = frame.visibility
- onGlobalLayoutListener = OnGlobalLayoutListener {
- val currentVisibility = frame.visibility
- if (pastVisibility != currentVisibility) {
- pastVisibility = currentVisibility
- // when small clock visible,
- // recalculate bounds and sample
- if (currentVisibility == View.VISIBLE) {
- smallRegionSampler?.stopRegionSampler()
- smallRegionSampler?.startRegionSampler()
- }
+ // Match the asing for view.parent's layout classes.
+ smallClockFrame = view.parent as ViewGroup
+ smallClockFrame?.let { frame ->
+ pastVisibility = frame.visibility
+ onGlobalLayoutListener = OnGlobalLayoutListener {
+ val currentVisibility = frame.visibility
+ if (pastVisibility != currentVisibility) {
+ pastVisibility = currentVisibility
+ // when small clock is visible,
+ // recalculate bounds and sample
+ if (currentVisibility == View.VISIBLE) {
+ smallRegionSampler?.stopRegionSampler()
+ smallRegionSampler?.startRegionSampler()
}
}
- frame.viewTreeObserver
- .addOnGlobalLayoutListener(onGlobalLayoutListener)
}
+ frame.viewTreeObserver
+ .addOnGlobalLayoutListener(onGlobalLayoutListener)
}
}
@@ -197,7 +195,7 @@
var smallClockOnAttachStateChangeListener: OnAttachStateChangeListener? = null
@VisibleForTesting
var largeClockOnAttachStateChangeListener: OnAttachStateChangeListener? = null
- private var smallClockFrame: FrameLayout? = null
+ private var smallClockFrame: ViewGroup? = null
private var onGlobalLayoutListener: OnGlobalLayoutListener? = null
private var isDozing = false
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 9bddcd7..39a59c4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -453,7 +453,7 @@
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
// TODO: b/305022530
- if (mClock.getConfig().getId().equals("DIGITAL_CLOCK_METRO")) {
+ if (mClock != null && mClock.getConfig().getId().equals("DIGITAL_CLOCK_METRO")) {
mClock.getEvents().onColorPaletteChanged(mContext.getResources());
}
@@ -461,7 +461,8 @@
post(() -> updateClockTargetRegions());
}
- if (mSmartspace != null && mSmartspaceTop != mSmartspace.getTop()) {
+ if (mSmartspace != null && mSmartspaceTop != mSmartspace.getTop()
+ && mDisplayedClockSize != null) {
mSmartspaceTop = mSmartspace.getTop();
post(() -> updateClockViews(mDisplayedClockSize == LARGE, mAnimateOnLayout));
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index 54f1457..f9eb686 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -44,6 +44,7 @@
import com.android.systemui.flags.FeatureFlagsClassic;
import com.android.systemui.flags.Flags;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.ui.binder.KeyguardRootViewBinder;
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel;
@@ -128,6 +129,7 @@
private boolean mIsActiveDreamLockscreenHosted = false;
private final FeatureFlagsClassic mFeatureFlags;
private KeyguardInteractor mKeyguardInteractor;
+ private KeyguardClockInteractor mKeyguardClockInteractor;
private final DelayableExecutor mUiExecutor;
private boolean mCanShowDoubleLineClock = true;
private DisposableHandle mAodIconsBindHandle;
@@ -187,6 +189,7 @@
DozeParameters dozeParameters,
AlwaysOnDisplayNotificationIconViewStore aodIconViewStore,
KeyguardInteractor keyguardInteractor,
+ KeyguardClockInteractor keyguardClockInteractor,
FeatureFlagsClassic featureFlags) {
super(keyguardClockSwitch);
mStatusBarStateController = statusBarStateController;
@@ -210,11 +213,14 @@
mView.setLogBuffer(mLogBuffer);
mFeatureFlags = featureFlags;
mKeyguardInteractor = keyguardInteractor;
+ mKeyguardClockInteractor = keyguardClockInteractor;
mClockChangedListener = new ClockRegistry.ClockChangeListener() {
@Override
public void onCurrentClockChanged() {
- setClock(mClockRegistry.createCurrentClock());
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ setClock(mClockRegistry.createCurrentClock());
+ }
}
@Override
public void onAvailableClocksChanged() { }
@@ -344,9 +350,11 @@
addDateWeatherView();
}
}
+ if (!mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ setDateWeatherVisibility();
+ setWeatherVisibility();
+ }
- setDateWeatherVisibility();
- setWeatherVisibility();
}
int getNotificationIconAreaHeight() {
@@ -386,6 +394,9 @@
}
private void addDateWeatherView() {
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return;
+ }
mDateWeatherView = (ViewGroup) mSmartspaceController.buildAndConnectDateView(mView);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
@@ -395,11 +406,13 @@
int endPadding = getContext().getResources().getDimensionPixelSize(
R.dimen.below_clock_padding_end);
mDateWeatherView.setPaddingRelative(startPadding, 0, endPadding, 0);
-
addWeatherView();
}
private void addWeatherView() {
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return;
+ }
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
WRAP_CONTENT, WRAP_CONTENT);
mWeatherView = mSmartspaceController.buildAndConnectWeatherView(mView);
@@ -410,6 +423,10 @@
}
private void addSmartspaceView() {
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return;
+ }
+
mSmartspaceView = mSmartspaceController.buildAndConnectView(mView);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
@@ -607,6 +624,9 @@
}
private void setClock(ClockController clock) {
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return;
+ }
if (clock != null && mLogBuffer != null) {
mLogBuffer.log(TAG, LogLevel.INFO, "New Clock");
}
@@ -618,7 +638,11 @@
@Nullable
public ClockController getClock() {
- return mClockEventController.getClock();
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return mKeyguardClockInteractor.getClock();
+ } else {
+ return mClockEventController.getClock();
+ }
}
private int getCurrentLayoutDirection() {
@@ -626,13 +650,17 @@
}
private void updateDoubleLineClock() {
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return;
+ }
mCanShowDoubleLineClock = mSecureSettings.getIntForUser(
Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, mView.getResources()
- .getInteger(com.android.internal.R.integer.config_doublelineClockDefault),
- UserHandle.USER_CURRENT) != 0;
+ .getInteger(com.android.internal.R.integer.config_doublelineClockDefault),
+ UserHandle.USER_CURRENT) != 0;
if (!mCanShowDoubleLineClock) {
- mUiExecutor.execute(() -> displayClock(KeyguardClockSwitch.SMALL, /* animate */ true));
+ mUiExecutor.execute(() -> displayClock(KeyguardClockSwitch.SMALL,
+ /* animate */ true));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt b/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt
new file mode 100644
index 0000000..cf699a2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2023 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.biometrics
+
+import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START
+import android.hardware.biometrics.BiometricSourceType
+import android.hardware.biometrics.BiometricSourceType.FINGERPRINT
+import android.util.Log
+import com.android.app.tracing.TraceStateLogger
+import com.android.internal.util.LatencyTracker
+import com.android.internal.util.LatencyTracker.ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME
+import com.android.keyguard.KeyguardUpdateMonitor
+import com.android.keyguard.KeyguardUpdateMonitorCallback
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController.KeyguardUnlockAnimationListener
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import javax.inject.Inject
+
+private const val TAG = "FpsUnlockTracker"
+private const val TRACE_COUNTER_NAME = "FpsUnlockStage"
+private const val TRACE_TAG_AOD = "AOD"
+private const val TRACE_TAG_KEYGUARD = "KEYGUARD"
+private const val DEBUG = true
+
+/** This is a class for monitoring unlock latency of fps and logging stages in perfetto. */
+@SysUISingleton
+class FpsUnlockTracker
+@Inject
+constructor(
+ private val statusBarStateController: StatusBarStateController,
+ private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+ private val keyguardUnlockAnimationController: KeyguardUnlockAnimationController,
+ private val latencyTracker: LatencyTracker,
+) {
+ private val fpsTraceStateLogger = TraceStateLogger(TRACE_COUNTER_NAME)
+ private var fpsAuthenticated: Boolean = false
+
+ private val keyguardUpdateMonitorCallback =
+ object : KeyguardUpdateMonitorCallback() {
+ override fun onBiometricAcquired(
+ biometricSourceType: BiometricSourceType?,
+ acquireInfo: Int
+ ) {
+ if (keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed) {
+ onHalAuthenticationStage(acquireInfo)
+ }
+ }
+
+ override fun onBiometricAuthenticated(
+ userId: Int,
+ biometricSourceType: BiometricSourceType?,
+ isStrongBiometric: Boolean
+ ) {
+ if (biometricSourceType == FINGERPRINT) {
+ fpsAuthenticated = true
+ onExitKeyguard()
+ }
+ }
+
+ override fun onBiometricError(
+ msgId: Int,
+ errString: String?,
+ biometricSourceType: BiometricSourceType?
+ ) {
+ if (biometricSourceType == FINGERPRINT) {
+ latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
+ }
+ }
+
+ override fun onBiometricRunningStateChanged(
+ running: Boolean,
+ biometricSourceType: BiometricSourceType?
+ ) {
+ if (biometricSourceType != FINGERPRINT || !running) {
+ return
+ }
+ onWaitForAuthenticationStage()
+ }
+ }
+
+ private val keyguardUnlockAnimationListener =
+ object : KeyguardUnlockAnimationListener {
+ override fun onUnlockAnimationFinished() = onUnlockedStage()
+ }
+
+ /** Start tracking the fps unlock. */
+ fun startTracking() {
+ keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
+ keyguardUnlockAnimationController.addKeyguardUnlockAnimationListener(
+ keyguardUnlockAnimationListener
+ )
+ }
+
+ /** Stop tracking the fps unlock. */
+ fun stopTracking() {
+ keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
+ keyguardUnlockAnimationController.removeKeyguardUnlockAnimationListener(
+ keyguardUnlockAnimationListener
+ )
+ }
+
+ /**
+ * The stage when the devices is locked and is possible to be unlocked via fps. However, in some
+ * situations, it might be unlocked only via bouncer.
+ */
+ fun onWaitForAuthenticationStage() {
+ val stage =
+ if (keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
+ FpsUnlockStage.WAIT_FOR_AUTHENTICATION.name
+ else FpsUnlockStage.WAIT_FOR_AUTHENTICATION.name + "(Not allowed)"
+ fpsTraceStateLogger.log(stage)
+ if (DEBUG) {
+ Log.d(TAG, "onWaitForAuthenticationStage: stage=$stage")
+ }
+ }
+
+ /**
+ * The stage dedicated to UDFPS, SFPS should not enter this stage. The only place where invokes
+ * this function is UdfpsController#onFingerDown.
+ */
+ fun onUiReadyStage() {
+ if (!keyguardUpdateMonitor.isUdfpsSupported || !keyguardUpdateMonitor.isUdfpsEnrolled) {
+ return
+ }
+ fpsTraceStateLogger.log(FpsUnlockStage.UI_READY.name)
+ startLatencyTracker()
+ if (DEBUG) {
+ Log.d(TAG, "onUiReadyStage: dozing=${statusBarStateController.isDozing}")
+ }
+ }
+
+ /** The stage when the HAL is authenticating the fingerprint. */
+ fun onHalAuthenticationStage(acquire: Int) {
+ fpsTraceStateLogger.log("${FpsUnlockStage.HAL_AUTHENTICATION.name}($acquire)")
+ // Start latency tracker here only for SFPS, UDFPS should start at onUiReadyStage.
+ if (
+ keyguardUpdateMonitor.isSfpsSupported &&
+ keyguardUpdateMonitor.isSfpsEnrolled &&
+ acquire == FINGERPRINT_ACQUIRED_START
+ ) {
+ startLatencyTracker()
+ }
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ "onHalAuthenticationStage: acquire=$acquire" +
+ ", sfpsSupported=${keyguardUpdateMonitor.isSfpsSupported}" +
+ ", sfpsEnrolled=${keyguardUpdateMonitor.isSfpsEnrolled}"
+ )
+ }
+ }
+
+ /** The stage when the authentication is succeeded and is going to exit keyguard. */
+ fun onExitKeyguard() {
+ fpsTraceStateLogger.log(FpsUnlockStage.EXIT_KEYGUARD.name)
+ if (DEBUG) {
+ Log.d(TAG, "onExitKeyguard: fpsAuthenticated=$fpsAuthenticated")
+ }
+ }
+
+ /**
+ * The stage when the unlock animation is finished which means the user can start interacting
+ * with the device.
+ */
+ fun onUnlockedStage() {
+ fpsTraceStateLogger.log(FpsUnlockStage.UNLOCKED.name)
+ if (fpsAuthenticated) {
+ // The device is unlocked successfully via fps, end the instrument.
+ latencyTracker.onActionEnd(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
+ } else {
+ // The device is unlocked but not via fps, maybe bouncer? Cancel the instrument.
+ latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
+ }
+ if (DEBUG) {
+ Log.d(TAG, "onUnlockedStage: fpsAuthenticated=$fpsAuthenticated")
+ }
+ fpsAuthenticated = false
+ }
+
+ private fun startLatencyTracker() {
+ latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
+ val tag = if (statusBarStateController.isDozing) TRACE_TAG_AOD else TRACE_TAG_KEYGUARD
+ latencyTracker.onActionStart(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, tag)
+ }
+}
+
+private enum class FpsUnlockStage {
+ WAIT_FOR_AUTHENTICATION,
+ UI_READY,
+ HAL_AUTHENTICATION,
+ EXIT_KEYGUARD,
+ UNLOCKED
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
index 10e7227..8f61dbf 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
@@ -91,7 +91,8 @@
@Main private val handler: Handler,
private val alternateBouncerInteractor: AlternateBouncerInteractor,
@Application private val scope: CoroutineScope,
- dumpManager: DumpManager
+ dumpManager: DumpManager,
+ fpsUnlockTracker: FpsUnlockTracker
) : Dumpable {
private val requests: HashSet<SideFpsUiRequestSource> = HashSet()
@@ -167,6 +168,7 @@
}
init {
+ fpsUnlockTracker.startTracking()
fingerprintManager?.setSidefpsController(
object : ISidefpsController.Stub() {
override fun show(
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 3944ac2..4175937 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -24,6 +24,7 @@
import static android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_ENROLLING;
import static android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR;
+import static com.android.internal.util.LatencyTracker.ACTION_UDFPS_ILLUMINATE;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;
@@ -167,6 +168,7 @@
@NonNull private final InputManager mInputManager;
@NonNull private final UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
@NonNull private final SelectedUserInteractor mSelectedUserInteractor;
+ @NonNull private final FpsUnlockTracker mFpsUnlockTracker;
private final boolean mIgnoreRefreshRate;
// Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
@@ -646,7 +648,8 @@
@NonNull KeyguardFaceAuthInteractor keyguardFaceAuthInteractor,
@NonNull UdfpsKeyguardAccessibilityDelegate udfpsKeyguardAccessibilityDelegate,
@NonNull Provider<UdfpsKeyguardViewModels> udfpsKeyguardViewModelsProvider,
- @NonNull SelectedUserInteractor selectedUserInteractor) {
+ @NonNull SelectedUserInteractor selectedUserInteractor,
+ @NonNull FpsUnlockTracker fpsUnlockTracker) {
mContext = context;
mExecution = execution;
mVibrator = vibrator;
@@ -690,6 +693,8 @@
mInputManager = inputManager;
mUdfpsKeyguardAccessibilityDelegate = udfpsKeyguardAccessibilityDelegate;
mSelectedUserInteractor = selectedUserInteractor;
+ mFpsUnlockTracker = fpsUnlockTracker;
+ mFpsUnlockTracker.startTracking();
mTouchProcessor = singlePointerTouchProcessor;
mSessionTracker = sessionTracker;
@@ -974,7 +979,10 @@
return;
}
if (isOptical()) {
- mLatencyTracker.onActionStart(LatencyTracker.ACTION_UDFPS_ILLUMINATE);
+ mLatencyTracker.onActionStart(ACTION_UDFPS_ILLUMINATE);
+ }
+ if (getBiometricSessionType() == SESSION_KEYGUARD) {
+ mFpsUnlockTracker.onUiReadyStage();
}
// Refresh screen timeout and boost process priority if possible.
mPowerManager.userActivity(mSystemClock.uptimeMillis(),
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index e995c97..20925fe 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -790,7 +790,7 @@
/** Enable the share wifi button in Quick Settings internet dialog. */
@JvmField
- val SHARE_WIFI_QS_BUTTON = unreleasedFlag("share_wifi_qs_button", teamfood = true)
+ val SHARE_WIFI_QS_BUTTON = releasedFlag("share_wifi_qs_button")
/** Enable haptic slider component in the brightness slider */
@JvmField
@@ -802,7 +802,7 @@
/** Enable showing a dialog when clicking on Quick Settings bluetooth tile. */
@JvmField
- val BLUETOOTH_QS_TILE_DIALOG = unreleasedFlag("bluetooth_qs_tile_dialog", teamfood = true)
+ val BLUETOOTH_QS_TILE_DIALOG = unreleasedFlag("bluetooth_qs_tile_dialog")
// TODO(b/300995746): Tracking Bug
/** A resource flag for whether the communal service is enabled. */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
index 16ad29a..d1c6218 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
@@ -18,6 +18,8 @@
import android.os.UserHandle
import android.provider.Settings
+import androidx.annotation.VisibleForTesting
+import com.android.keyguard.KeyguardClockSwitch.SMALL
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyguard.shared.model.SettingsClockSize
@@ -71,7 +73,10 @@
}
.mapNotNull { it }
- private suspend fun getClockSize(): SettingsClockSize {
+ val currentClock = currentClockId.map { clockRegistry.createCurrentClock() }
+
+ @VisibleForTesting
+ suspend fun getClockSize(): SettingsClockSize {
return withContext(backgroundDispatcher) {
if (
secureSettings.getIntForUser(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
index 4d26466..6ff446e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
@@ -18,6 +18,8 @@
import android.graphics.Point
import android.hardware.biometrics.BiometricSourceType
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.biometrics.AuthController
@@ -190,6 +192,12 @@
/** Observable updated when keyguardDone should be called either now or soon. */
val keyguardDone: Flow<KeyguardDone>
+ /** Receive SMALL or LARGE clock should be displayed on keyguard. */
+ val clockSize: Flow<Int>
+
+ /** Receive whether clock should be centered on lockscreen. */
+ val clockShouldBeCentered: Flow<Boolean>
+
/**
* Returns `true` if the keyguard is showing; `false` otherwise.
*
@@ -238,6 +246,10 @@
fun setDismissAction(dismissAction: DismissAction)
suspend fun setKeyguardDone(keyguardDoneType: KeyguardDone)
+
+ fun setClockSize(@ClockSize size: Int)
+
+ fun setClockShouldBeCentered(shouldBeCentered: Boolean)
}
/** Encapsulates application state for the keyguard. */
@@ -281,6 +293,12 @@
private val _clockPosition = MutableStateFlow(Position(0, 0))
override val clockPosition = _clockPosition.asStateFlow()
+ private val _clockSize = MutableStateFlow(LARGE)
+ override val clockSize: Flow<Int> = _clockSize.asStateFlow()
+
+ private val _clockShouldBeCentered = MutableStateFlow(true)
+ override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered.asStateFlow()
+
override val isKeyguardShowing: Flow<Boolean> =
conflatedCallbackFlow {
val callback =
@@ -663,6 +681,14 @@
_isActiveDreamLockscreenHosted.value = isLockscreenHosted
}
+ override fun setClockSize(@ClockSize size: Int) {
+ _clockSize.value = size
+ }
+
+ override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
+ _clockShouldBeCentered.value = shouldBeCentered
+ }
+
private fun statusBarStateIntToObject(value: Int): StatusBarState {
return when (value) {
0 -> StatusBarState.SHADE
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
index dad5831..2f103f6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
@@ -17,21 +17,35 @@
package com.android.systemui.keyguard.domain.interactor
+import com.android.keyguard.ClockEventController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockId
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
+private val TAG = KeyguardClockInteractor::class.simpleName
+/** Manages keyguard clock for the lockscreen root view. */
/** Encapsulates business-logic related to the keyguard clock. */
@SysUISingleton
class KeyguardClockInteractor
@Inject
constructor(
- repository: KeyguardClockRepository,
+ val eventController: ClockEventController,
+ private val keyguardClockRepository: KeyguardClockRepository,
) {
- val selectedClockSize: Flow<SettingsClockSize> = repository.selectedClockSize
- val currentClockId: Flow<ClockId> = repository.currentClockId
+ val selectedClockSize: Flow<SettingsClockSize> = keyguardClockRepository.selectedClockSize
+
+ val currentClockId: Flow<ClockId> = keyguardClockRepository.currentClockId
+
+ val currentClock: Flow<ClockController> = keyguardClockRepository.currentClock
+
+ var clock: ClockController?
+ get() = eventController.clock
+ set(value) {
+ eventController.clock = value
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
index eaec0d4..e256b49 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
@@ -23,6 +23,7 @@
import android.graphics.Point
import android.util.MathUtils
import com.android.app.animation.Interpolators
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
@@ -241,6 +242,10 @@
}
}
+ val clockSize: Flow<Int> = repository.clockSize.distinctUntilChanged()
+
+ val clockShouldBeCentered: Flow<Boolean> = repository.clockShouldBeCentered
+
/** Whether to animate the next doze mode transition. */
val animateDozingTransitions: Flow<Boolean> by lazy {
if (sceneContainerFlags.isEnabled()) {
@@ -315,6 +320,14 @@
repository.setAnimateDozingTransitions(animate)
}
+ fun setClockSize(@ClockSize size: Int) {
+ repository.setClockSize(size)
+ }
+
+ fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
+ repository.setClockShouldBeCentered(shouldBeCentered)
+ }
+
companion object {
private const val TAG = "KeyguardInteractor"
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
new file mode 100644
index 0000000..c688cfff
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.binder
+
+import android.transition.TransitionManager
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
+import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.res.R
+import kotlinx.coroutines.launch
+
+private val TAG = KeyguardClockViewBinder::class.simpleName
+
+object KeyguardClockViewBinder {
+ @JvmStatic
+ fun bind(
+ clockSection: ClockSection,
+ keyguardRootView: ConstraintLayout,
+ viewModel: KeyguardClockViewModel,
+ keyguardBlueprintInteractor: KeyguardBlueprintInteractor,
+ keyguardClockInteractor: KeyguardClockInteractor,
+ featureFlags: FeatureFlagsClassic,
+ ) {
+ keyguardRootView.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ keyguardClockInteractor.eventController.registerListeners(keyguardRootView)
+ }
+ }
+ keyguardRootView.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ launch {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
+ viewModel.currentClock.collect { currentClock ->
+ viewModel.clock?.let { clock -> cleanupClockViews(clock, keyguardRootView) }
+ viewModel.clock = currentClock
+ addClockViews(currentClock, keyguardRootView)
+ keyguardBlueprintInteractor.refreshBlueprint()
+ }
+ }
+ // TODO: Weather clock dozing animation
+ // will trigger both shouldBeCentered and clockSize change
+ // we should avoid this
+ launch {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
+ viewModel.clockSize.collect {
+ applyConstraints(clockSection, keyguardRootView, true)
+ }
+ }
+ launch {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
+ viewModel.clockShouldBeCentered.collect { shouldBeCentered ->
+ clockSection.setClockShouldBeCentered(
+ viewModel.useLargeClock && shouldBeCentered
+ )
+ applyConstraints(clockSection, keyguardRootView, true)
+ }
+ }
+ }
+ }
+ }
+
+ fun applyConstraints(
+ clockSection: ClockSection,
+ rootView: ConstraintLayout,
+ animated: Boolean
+ ) {
+ val constraintSet = ConstraintSet().apply { clone(rootView) }
+ clockSection.applyConstraints(constraintSet)
+ if (animated) {
+ TransitionManager.beginDelayedTransition(rootView)
+ }
+
+ constraintSet.applyTo(rootView)
+ }
+
+ private fun cleanupClockViews(clock: ClockController, rootView: ConstraintLayout) {
+ clock.smallClock.layout.views.forEach { rootView.removeView(it) }
+ clock.largeClock.layout.views.forEach { rootView.removeView(it) }
+ }
+
+ private fun addClockViews(clock: ClockController, rootView: ConstraintLayout) {
+ clock.smallClock.layout.views[0].id = R.id.lockscreen_clock_view
+ if (clock.largeClock.layout.views.size == 1) {
+ clock.largeClock.layout.views[0].id = R.id.lockscreen_clock_view_large
+ }
+ // small clock should either be a single view or container with id `lockscreen_clock_view`
+ clock.smallClock.layout.views.forEach { rootView.addView(it) }
+ clock.largeClock.layout.views.forEach { rootView.addView(it) }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index ad48957..378656c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -224,16 +224,10 @@
deviceEntryHapticsInteractor.playSuccessHaptic
.filter { it }
.collect {
- if (
- featureFlags.isEnabled(Flags.ONE_WAY_HAPTICS_API_MIGRATION)
- ) {
- vibratorHelper.performHapticFeedback(
- view,
- HapticFeedbackConstants.CONFIRM,
- )
- } else {
- vibratorHelper.vibrateAuthSuccess("device-entry::success")
- }
+ vibratorHelper.performHapticFeedback(
+ view,
+ HapticFeedbackConstants.CONFIRM,
+ )
deviceEntryHapticsInteractor.handleSuccessHaptic()
}
}
@@ -242,16 +236,10 @@
deviceEntryHapticsInteractor.playErrorHaptic
.filter { it }
.collect {
- if (
- featureFlags.isEnabled(Flags.ONE_WAY_HAPTICS_API_MIGRATION)
- ) {
- vibratorHelper.performHapticFeedback(
- view,
- HapticFeedbackConstants.REJECT,
- )
- } else {
- vibratorHelper.vibrateAuthSuccess("device-entry::error")
- }
+ vibratorHelper.performHapticFeedback(
+ view,
+ HapticFeedbackConstants.REJECT,
+ )
deviceEntryHapticsInteractor.handleErrorHaptic()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
new file mode 100644
index 0000000..41a2e50
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
@@ -0,0 +1,28 @@
+package com.android.systemui.keyguard.ui.binder
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.keyguard.ui.view.layout.sections.SmartspaceSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.lifecycle.repeatWhenAttached
+
+object KeyguardSmartspaceViewBinder {
+ @JvmStatic
+ fun bind(
+ smartspaceSection: SmartspaceSection,
+ keyguardRootView: ConstraintLayout,
+ clockViewModel: KeyguardClockViewModel,
+ ) {
+ keyguardRootView.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ clockViewModel.hasCustomWeatherDataDisplay.collect {
+ val constraintSet = ConstraintSet().apply { clone(keyguardRootView) }
+ smartspaceSection.applyConstraints(constraintSet)
+ constraintSet.applyTo(keyguardRootView)
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
index 21eba56..f1ea446 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
@@ -20,6 +20,7 @@
import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialIndicatorSection
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
+import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection
@@ -30,6 +31,7 @@
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultShortcutsSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultStatusBarSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultStatusViewSection
+import com.android.systemui.keyguard.ui.view.layout.sections.SmartspaceSection
import com.android.systemui.keyguard.ui.view.layout.sections.SplitShadeGuidelines
import javax.inject.Inject
@@ -55,6 +57,8 @@
aodNotificationIconsSection: AodNotificationIconsSection,
aodBurnInSection: AodBurnInSection,
communalTutorialIndicatorSection: CommunalTutorialIndicatorSection,
+ clockSection: ClockSection,
+ smartspaceSection: SmartspaceSection
) : KeyguardBlueprint {
override val id: String = DEFAULT
@@ -72,6 +76,8 @@
aodNotificationIconsSection,
aodBurnInSection,
communalTutorialIndicatorSection,
+ clockSection,
+ smartspaceSection
)
companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt
index 0390077..06bb0a6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt
@@ -30,6 +30,7 @@
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
import com.android.systemui.res.R
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder
@@ -53,6 +54,7 @@
private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel,
private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore,
private val notificationIconAreaController: NotificationIconAreaController,
+ private val smartspaceViewModel: KeyguardSmartspaceViewModel,
) : KeyguardSection() {
private var nicBindingDisposable: DisposableHandle? = null
@@ -115,9 +117,19 @@
} else {
BOTTOM
}
-
constraintSet.apply {
- connect(nicId, TOP, R.id.keyguard_status_view, topAlignment, bottomMargin)
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ connect(
+ nicId,
+ TOP,
+ smartspaceViewModel.smartspaceViewId,
+ topAlignment,
+ bottomMargin
+ )
+ setGoneMargin(nicId, topAlignment, bottomMargin)
+ } else {
+ connect(nicId, TOP, R.id.keyguard_status_view, topAlignment, bottomMargin)
+ }
connect(nicId, START, PARENT_ID, START)
connect(nicId, END, PARENT_ID, END)
constrainHeight(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
new file mode 100644
index 0000000..941c295
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.view.layout.items
+
+import android.content.Context
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
+import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.START
+import androidx.constraintlayout.widget.ConstraintSet.TOP
+import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.binder.KeyguardClockViewBinder
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.ClockFaceLayout
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.SplitShadeStateController
+import com.android.systemui.util.Utils
+import dagger.Lazy
+import javax.inject.Inject
+
+internal fun ConstraintSet.setVisibility(
+ views: Iterable<View>,
+ visibility: Int,
+) = views.forEach { view -> this.setVisibility(view.id, visibility) }
+
+internal fun ConstraintSet.setAlpha(
+ views: Iterable<View>,
+ alpha: Float,
+) = views.forEach { view -> this.setAlpha(view.id, alpha) }
+
+class ClockSection
+@Inject
+constructor(
+ private val clockInteractor: KeyguardClockInteractor,
+ private val keyguardClockViewModel: KeyguardClockViewModel,
+ val smartspaceViewModel: KeyguardSmartspaceViewModel,
+ private val context: Context,
+ private val splitShadeStateController: SplitShadeStateController,
+ private val keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>,
+ private val featureFlags: FeatureFlagsClassic,
+) : KeyguardSection() {
+ override fun addViews(constraintLayout: ConstraintLayout) {}
+
+ override fun bindData(constraintLayout: ConstraintLayout) {
+ KeyguardClockViewBinder.bind(
+ this,
+ constraintLayout,
+ keyguardClockViewModel,
+ keyguardBlueprintInteractor.get(),
+ clockInteractor,
+ featureFlags
+ )
+ }
+
+ override fun applyConstraints(constraintSet: ConstraintSet) {
+ clockInteractor.clock?.let { clock ->
+ constraintSet.applyDeltaFrom(buildConstraints(clock, constraintSet))
+ }
+ }
+
+ override fun removeViews(constraintLayout: ConstraintLayout) {}
+
+ private fun buildConstraints(
+ clock: ClockController,
+ constraintSet: ConstraintSet
+ ): ConstraintSet {
+ // Add constraint between rootView and clockContainer
+ applyDefaultConstraints(constraintSet)
+ getTargetClockFace(clock).applyConstraints(constraintSet)
+
+ // Add constraint between elements in clock and clock container
+ return constraintSet.apply {
+ setAlpha(getTargetClockFace(clock).views, 1F)
+ setAlpha(getNonTargetClockFace(clock).views, 0F)
+ }
+ }
+
+ var largeClockEndGuideline = PARENT_ID
+
+ // Return if largeClockEndGuideline changes,
+ // and use it to decide whether to refresh blueprint
+ fun setClockShouldBeCentered(shouldBeCentered: Boolean): Boolean {
+ val previousValue = largeClockEndGuideline
+ largeClockEndGuideline = if (shouldBeCentered) PARENT_ID else R.id.split_shade_guideline
+ return previousValue != largeClockEndGuideline
+ }
+
+ fun getTargetClockFace(clock: ClockController): ClockFaceLayout =
+ if (keyguardClockViewModel.useLargeClock) getLargeClockFace(clock)
+ else getSmallClockFace(clock)
+ fun getNonTargetClockFace(clock: ClockController): ClockFaceLayout =
+ if (keyguardClockViewModel.useLargeClock) getSmallClockFace(clock)
+ else getLargeClockFace(clock)
+
+ fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout
+ fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout
+ fun applyDefaultConstraints(constraints: ConstraintSet) {
+ constraints.apply {
+ connect(R.id.lockscreen_clock_view_large, START, PARENT_ID, START)
+ connect(R.id.lockscreen_clock_view_large, END, largeClockEndGuideline, END)
+ connect(R.id.lockscreen_clock_view_large, BOTTOM, R.id.lock_icon_view, TOP)
+ var largeClockTopMargin =
+ context.resources.getDimensionPixelSize(R.dimen.status_bar_height) +
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_padding_top
+ ) +
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset)
+ largeClockTopMargin += smartspaceViewModel.getDimen(DATE_WEATHER_VIEW_HEIGHT)
+ largeClockTopMargin += smartspaceViewModel.getDimen(ENHANCED_SMARTSPACE_HEIGHT)
+ if (!keyguardClockViewModel.useLargeClock) {
+ largeClockTopMargin -=
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
+ }
+ connect(R.id.lockscreen_clock_view_large, TOP, PARENT_ID, TOP, largeClockTopMargin)
+ constrainWidth(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
+ constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
+ constrainHeight(
+ R.id.lockscreen_clock_view,
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
+ )
+ connect(
+ R.id.lockscreen_clock_view,
+ START,
+ PARENT_ID,
+ START,
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.clock_padding_start
+ )
+ )
+ var smallClockTopMargin =
+ if (splitShadeStateController.shouldUseSplitNotificationShade(context.resources)) {
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)
+ } else {
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
+ Utils.getStatusBarHeaderHeightKeyguard(context)
+ }
+ if (keyguardClockViewModel.useLargeClock) {
+ smallClockTopMargin -=
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
+ }
+ connect(R.id.lockscreen_clock_view, TOP, PARENT_ID, TOP, smallClockTopMargin)
+ }
+ }
+
+ companion object {
+ private const val DATE_WEATHER_VIEW_HEIGHT = "date_weather_view_height"
+ private const val ENHANCED_SMARTSPACE_HEIGHT = "enhanced_smartspace_height"
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
index afa49bd..1995661 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
@@ -27,10 +27,11 @@
import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.START
import androidx.constraintlayout.widget.ConstraintSet.TOP
-import com.android.systemui.res.R
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
+import com.android.systemui.res.R
import com.android.systemui.shade.NotificationPanelView
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
@@ -47,6 +48,7 @@
private val sharedNotificationContainer: SharedNotificationContainer,
private val sharedNotificationContainerViewModel: SharedNotificationContainerViewModel,
private val controller: NotificationStackScrollLayoutController,
+ private val smartspaceViewModel: KeyguardSmartspaceViewModel
) : KeyguardSection() {
private val placeHolderId = R.id.nssl_placeholder
@@ -92,13 +94,25 @@
} else {
BOTTOM
}
- connect(
- R.id.nssl_placeholder,
- TOP,
- R.id.keyguard_status_view,
- topAlignment,
- bottomMargin
- )
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ connect(
+ R.id.nssl_placeholder,
+ TOP,
+ smartspaceViewModel.smartspaceViewId,
+ topAlignment,
+ bottomMargin
+ )
+ setGoneMargin(R.id.nssl_placeholder, TOP, bottomMargin)
+ } else {
+ connect(
+ R.id.nssl_placeholder,
+ TOP,
+ R.id.keyguard_status_view,
+ topAlignment,
+ bottomMargin
+ )
+ }
+
connect(R.id.nssl_placeholder, START, PARENT_ID, START)
connect(R.id.nssl_placeholder, END, PARENT_ID, END)
connect(R.id.nssl_placeholder, BOTTOM, R.id.lock_icon_view, TOP)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
new file mode 100644
index 0000000..25931a6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.view.layout.sections
+
+import android.content.Context
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
+import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.START
+import androidx.constraintlayout.widget.ConstraintSet.TOP
+import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController
+import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.binder.KeyguardSmartspaceViewBinder
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController
+import javax.inject.Inject
+
+class SmartspaceSection
+@Inject
+constructor(
+ val keyguardClockViewModel: KeyguardClockViewModel,
+ val keyguardSmartspaceViewModel: KeyguardSmartspaceViewModel,
+ private val context: Context,
+ val smartspaceController: LockscreenSmartspaceController,
+ val keyguardUnlockAnimationController: KeyguardUnlockAnimationController,
+ val featureFlags: FeatureFlagsClassic,
+) : KeyguardSection() {
+ var smartspaceView: View? = null
+ var weatherView: View? = null
+ var dateView: View? = null
+
+ override fun addViews(constraintLayout: ConstraintLayout) {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return
+ }
+ smartspaceView = smartspaceController.buildAndConnectView(constraintLayout)
+ weatherView = smartspaceController.buildAndConnectWeatherView(constraintLayout)
+ dateView = smartspaceController.buildAndConnectDateView(constraintLayout)
+ if (keyguardSmartspaceViewModel.isSmartspaceEnabled) {
+ constraintLayout.addView(smartspaceView)
+ if (keyguardSmartspaceViewModel.isDateWeatherDecoupled) {
+ constraintLayout.addView(weatherView)
+ constraintLayout.addView(dateView)
+ }
+ }
+
+ keyguardUnlockAnimationController.lockscreenSmartspace = smartspaceView
+ }
+
+ override fun bindData(constraintLayout: ConstraintLayout) {
+ KeyguardSmartspaceViewBinder.bind(
+ this,
+ constraintLayout,
+ keyguardClockViewModel,
+ )
+ }
+
+ override fun applyConstraints(constraintSet: ConstraintSet) {
+ // Generally, weather should be next to dateView
+ // smartspace should be below date & weather views
+ constraintSet.apply {
+ // migrate addDateWeatherView, addWeatherView from KeyguardClockSwitchController
+ dateView?.let { dateView ->
+ constrainHeight(dateView.id, WRAP_CONTENT)
+ constrainWidth(dateView.id, WRAP_CONTENT)
+ connect(
+ dateView.id,
+ START,
+ PARENT_ID,
+ START,
+ context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start)
+ )
+ }
+ weatherView?.let {
+ constrainWidth(it.id, WRAP_CONTENT)
+ dateView?.let { dateView ->
+ connect(it.id, TOP, dateView.id, TOP)
+ connect(it.id, BOTTOM, dateView.id, BOTTOM)
+ connect(it.id, START, dateView.id, END, 4)
+ }
+ }
+ // migrate addSmartspaceView from KeyguardClockSwitchController
+ smartspaceView?.let {
+ constrainHeight(it.id, WRAP_CONTENT)
+ connect(
+ it.id,
+ START,
+ PARENT_ID,
+ START,
+ context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start)
+ )
+ connect(
+ it.id,
+ END,
+ PARENT_ID,
+ END,
+ context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_end)
+ )
+ }
+
+ if (keyguardClockViewModel.hasCustomWeatherDataDisplay.value) {
+ dateView?.let { dateView ->
+ smartspaceView?.let { smartspaceView ->
+ connect(dateView.id, BOTTOM, smartspaceView.id, TOP)
+ }
+ }
+ } else {
+ dateView?.let { dateView ->
+ clear(dateView.id, BOTTOM)
+ connect(dateView.id, TOP, R.id.lockscreen_clock_view, BOTTOM)
+ constrainHeight(dateView.id, WRAP_CONTENT)
+ smartspaceView?.let { smartspaceView ->
+ clear(smartspaceView.id, TOP)
+ connect(smartspaceView.id, TOP, dateView.id, BOTTOM)
+ }
+ }
+ }
+ updateVisibility(constraintSet)
+ }
+ }
+
+ private fun updateVisibility(constraintSet: ConstraintSet) {
+ constraintSet.apply {
+ weatherView?.let {
+ setVisibility(
+ it.id,
+ when (keyguardClockViewModel.hasCustomWeatherDataDisplay.value) {
+ true -> ConstraintSet.GONE
+ false ->
+ when (keyguardSmartspaceViewModel.isWeatherEnabled) {
+ true -> ConstraintSet.VISIBLE
+ false -> ConstraintSet.GONE
+ }
+ }
+ )
+ }
+ dateView?.let {
+ setVisibility(
+ it.id,
+ if (keyguardClockViewModel.hasCustomWeatherDataDisplay.value) ConstraintSet.GONE
+ else ConstraintSet.VISIBLE
+ )
+ }
+ }
+ }
+
+ override fun removeViews(constraintLayout: ConstraintLayout) {
+ listOf(smartspaceView, dateView, weatherView).forEach {
+ it?.let {
+ if (it.parent == constraintLayout) {
+ constraintLayout.removeView(it)
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
new file mode 100644
index 0000000..c54f47b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.viewmodel
+
+import com.android.keyguard.KeyguardClockSwitch.LARGE
+import com.android.keyguard.KeyguardClockSwitch.SMALL
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockController
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.stateIn
+
+@SysUISingleton
+class KeyguardClockViewModel
+@Inject
+constructor(
+ val keyguardInteractor: KeyguardInteractor,
+ val keyguardClockInteractor: KeyguardClockInteractor,
+ @Application private val applicationScope: CoroutineScope,
+) {
+ val useLargeClock: Boolean
+ get() = clockSize.value == LARGE
+
+ var clock: ClockController?
+ set(value) {
+ keyguardClockInteractor.clock = value
+ }
+ get() {
+ return keyguardClockInteractor.clock
+ }
+
+ val clockSize =
+ combine(keyguardClockInteractor.selectedClockSize, keyguardInteractor.clockSize) {
+ selectedSize,
+ clockSize ->
+ if (selectedSize == SettingsClockSize.SMALL) {
+ SMALL
+ } else {
+ clockSize
+ }
+ }
+ .distinctUntilChanged()
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = LARGE
+ )
+
+ val currentClock = keyguardClockInteractor.currentClock
+
+ val hasCustomWeatherDataDisplay =
+ combine(clockSize, currentClock) { size, clock ->
+ (if (size == LARGE) clock.largeClock.config.hasCustomWeatherDataDisplay
+ else clock.smallClock.config.hasCustomWeatherDataDisplay)
+ }
+ .distinctUntilChanged()
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = false
+ )
+
+ val clockShouldBeCentered: Flow<Boolean> =
+ keyguardInteractor.clockShouldBeCentered.distinctUntilChanged()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
new file mode 100644
index 0000000..8e33651
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.viewmodel
+
+import android.content.Context
+import android.util.Log
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController
+import javax.inject.Inject
+
+@SysUISingleton
+class KeyguardSmartspaceViewModel
+@Inject
+constructor(val context: Context, smartspaceController: LockscreenSmartspaceController) {
+ val isSmartspaceEnabled: Boolean = smartspaceController.isEnabled()
+ val isWeatherEnabled: Boolean = smartspaceController.isWeatherEnabled()
+ val isDateWeatherDecoupled: Boolean = smartspaceController.isDateWeatherDecoupled()
+ val smartspaceViewId: Int
+ get() {
+ return context.resources
+ .getIdentifier("bc_smartspace_view", "id", context.packageName)
+ .also {
+ if (it == 0) {
+ Log.d(TAG, "Cannot resolve id bc_smartspace_view")
+ }
+ }
+ }
+
+ fun getDimen(name: String): Int {
+ val res = context.packageManager.getResourcesForApplication(context.packageName)
+ val id = res.getIdentifier(name, "dimen", context.packageName)
+ return res.getDimensionPixelSize(id)
+ }
+
+ companion object {
+ private val TAG = KeyguardSmartspaceViewModel::class.java.simpleName
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt
index 905d8ef..840db26 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt
@@ -29,12 +29,18 @@
* Provides a shortcut to start an activity from [QSTileUserActionInteractor]. It supports keyguard
* dismissing and tile from-view animations.
*/
-@SysUISingleton
-class QSTileIntentUserInputHandler
-@Inject
-constructor(private val activityStarter: ActivityStarter) {
+interface QSTileIntentUserInputHandler {
- fun handle(view: View?, intent: Intent) {
+ fun handle(view: View?, intent: Intent)
+ fun handle(view: View?, pendingIntent: PendingIntent)
+}
+
+@SysUISingleton
+class QSTileIntentUserInputHandlerImpl
+@Inject
+constructor(private val activityStarter: ActivityStarter) : QSTileIntentUserInputHandler {
+
+ override fun handle(view: View?, intent: Intent) {
val animationController: ActivityLaunchAnimator.Controller? =
view?.let {
ActivityLaunchAnimator.Controller.fromView(
@@ -46,7 +52,7 @@
}
// TODO(b/249804373): make sure to allow showing activities over the lockscreen. See b/292112939
- fun handle(view: View?, pendingIntent: PendingIntent) {
+ override fun handle(view: View?, pendingIntent: PendingIntent) {
if (!pendingIntent.isActivity) {
return
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/di/QSTilesModule.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/di/QSTilesModule.kt
index 32522ad..94137c8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/di/QSTilesModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/di/QSTilesModule.kt
@@ -16,6 +16,8 @@
package com.android.systemui.qs.tiles.di
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerImpl
import com.android.systemui.qs.tiles.impl.custom.di.CustomTileComponent
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
@@ -45,4 +47,9 @@
@Multibinds fun tileViewModelMap(): Map<String, QSTileViewModel>
@Binds fun bindQSTileConfigProvider(impl: QSTileConfigProviderImpl): QSTileConfigProvider
+
+ @Binds
+ fun bindQSTileIntentUserInputHandler(
+ impl: QSTileIntentUserInputHandlerImpl
+ ): QSTileIntentUserInputHandler
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 09045a5..85a4a7e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -1598,8 +1598,12 @@
int userSwitcherPreferredY = mStatusBarHeaderHeightKeyguard;
boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled();
boolean shouldAnimateClockChange = mScreenOffAnimationController.shouldAnimateClockChange();
- mKeyguardStatusViewController.displayClock(computeDesiredClockSize(),
- shouldAnimateClockChange);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ mKeyguardInteractor.setClockSize(computeDesiredClockSize());
+ } else {
+ mKeyguardStatusViewController.displayClock(computeDesiredClockSize(),
+ shouldAnimateClockChange);
+ }
updateKeyguardStatusViewAlignment(/* animate= */shouldAnimateKeyguardStatusViewAlignment());
int userSwitcherHeight = mKeyguardQsUserSwitchController != null
? mKeyguardQsUserSwitchController.getUserIconHeight() : 0;
@@ -1727,9 +1731,13 @@
} else {
layout = mNotificationContainerParent;
}
- mKeyguardStatusViewController.updateAlignment(
- layout, mSplitShadeEnabled, shouldBeCentered, animate);
- mKeyguardUnfoldTransition.ifPresent(t -> t.setStatusViewCentered(shouldBeCentered));
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ mKeyguardInteractor.setClockShouldBeCentered(shouldBeCentered);
+ } else {
+ mKeyguardStatusViewController.updateAlignment(
+ layout, mSplitShadeEnabled, shouldBeCentered, animate);
+ mKeyguardUnfoldTransition.ifPresent(t -> t.setStatusViewCentered(shouldBeCentered));
+ }
}
private boolean shouldKeyguardStatusViewBeCentered() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
index ab015ef..de334bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
@@ -145,7 +145,7 @@
if (view instanceof EmptyShadeView) {
EmptyShadeView emptyShadeView = (EmptyShadeView) view;
boolean visible = this.clipTopAmount <= mEmptyText.getPaddingTop() * 0.6f;
- emptyShadeView.setContentVisible(visible && emptyShadeView.isVisible());
+ emptyShadeView.setContentVisibleAnimated(visible && emptyShadeView.isVisible());
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
index c2b6f32..5464d08 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
@@ -95,7 +95,7 @@
}
override fun onViewAdded() {
- headerView?.isContentVisible = true
+ headerView?.setContentVisibleAnimated(true)
}
override val view: View
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
index 9c51e3b..10a43d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
@@ -79,6 +79,19 @@
return findViewById(R.id.dismiss_text);
}
+ /** Whether the "Clear all" button is currently visible. */
+ public boolean isClearAllButtonVisible() {
+ return isSecondaryVisible();
+ }
+
+ /**
+ * Set the visibility of the "Clear all" button to {@code visible}. Animate the change if
+ * {@code animate} is true.
+ */
+ public void setClearAllButtonVisible(boolean visible, boolean animate) {
+ setSecondaryVisible(visible, animate);
+ }
+
@Override
public void dump(PrintWriter pwOriginal, String[] args) {
IndentingPrintWriter pw = DumpUtilsKt.asIndenting(pwOriginal);
@@ -293,7 +306,7 @@
super.applyToView(view);
if (view instanceof FooterView) {
FooterView footerView = (FooterView) view;
- footerView.setContentVisible(!hideContent);
+ footerView.setContentVisibleAnimated(!hideContent);
}
}
}
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 aabf295..966ff35 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
@@ -39,28 +39,9 @@
private boolean mIsVisible = true;
private boolean mContentVisible = true;
private boolean mIsSecondaryVisible = true;
- private int mDuration = 260;
+ private int mAnimationDuration = 260;
private boolean mContentAnimating;
- private final Runnable mContentVisibilityEndRunnable = () -> {
- mContentAnimating = false;
- if (getVisibility() != View.GONE && !mIsVisible) {
- setVisibility(GONE);
- setWillBeGone(false);
- notifyHeightChanged(false /* needsAnimation */);
- }
- };
-
private boolean mSecondaryAnimating = false;
- private final Consumer<Boolean> mSecondaryVisibilityEndRunnable = (cancelled) -> {
- mSecondaryAnimating = false;
- // If we were on screen, become GONE to avoid touches
- if (mSecondaryView == null) return;
- if (getVisibility() != View.GONE
- && mSecondaryView.getVisibility() != View.GONE
- && !mIsSecondaryVisible) {
- mSecondaryView.setVisibility(View.GONE);
- }
- };
public StackScrollerDecorView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -72,8 +53,8 @@
super.onFinishInflate();
mContent = findContentView();
mSecondaryView = findSecondaryView();
- setVisible(false /* nowVisible */, false /* animate */);
- setSecondaryVisible(false /* nowVisible */, false /* animate */);
+ setVisible(false /* visible */, false /* animate */);
+ setSecondaryVisible(false /* visible */, false /* animate */);
setOutlineProvider(null);
}
@@ -83,95 +64,6 @@
}
/**
- * @param visible True if we should animate contents visible
- */
- public void setContentVisible(boolean visible) {
- setContentVisible(visible, true /* animate */, null /* runAfter */);
- }
-
- /**
- * @param visible True if the contents should be visible
- * @param animate True if we should fade to new visibility
- * @param runAfter Runnable to run after visibility updates
- */
- public void setContentVisible(boolean visible, boolean animate, Consumer<Boolean> runAfter) {
- if (mContentVisible != visible) {
- mContentAnimating = animate;
- mContentVisible = visible;
- Consumer<Boolean> endRunnable = (cancelled) -> {
- mContentVisibilityEndRunnable.run();
- if (runAfter != null) {
- runAfter.accept(cancelled);
- }
- };
- setViewVisible(mContent, visible, animate, endRunnable);
- } else if (runAfter != null) {
- // Execute the runAfter runnable immediately if there's no animation to perform.
- runAfter.accept(true);
- }
-
- if (!mContentAnimating) {
- mContentVisibilityEndRunnable.run();
- }
- }
-
- public boolean isContentVisible() {
- return mContentVisible;
- }
-
- /**
- * Make this view visible. If {@code false} is passed, the view will fade out it's content
- * and set the view Visibility to GONE. If only the content should be changed
- * {@link #setContentVisible(boolean)} can be used.
- *
- * @param nowVisible should the view be visible
- * @param animate should the change be animated.
- */
- public void setVisible(boolean nowVisible, boolean animate) {
- if (mIsVisible != nowVisible) {
- mIsVisible = nowVisible;
- if (animate) {
- if (nowVisible) {
- setVisibility(VISIBLE);
- setWillBeGone(false);
- notifyHeightChanged(false /* needsAnimation */);
- } else {
- setWillBeGone(true);
- }
- setContentVisible(nowVisible, true /* animate */, null /* runAfter */);
- } else {
- setVisibility(nowVisible ? VISIBLE : GONE);
- setContentVisible(nowVisible, false /* animate */, null /* runAfter */);
- setWillBeGone(false);
- notifyHeightChanged(false /* needsAnimation */);
- }
- }
- }
-
- /**
- * Set the secondary view of this layout to visible.
- *
- * @param nowVisible should the secondary view be visible
- * @param animate should the change be animated
- */
- public void setSecondaryVisible(boolean nowVisible, boolean animate) {
- if (mIsSecondaryVisible != nowVisible) {
- mSecondaryAnimating = animate;
- mIsSecondaryVisible = nowVisible;
- setViewVisible(mSecondaryView, nowVisible, animate, mSecondaryVisibilityEndRunnable);
- }
-
- if (!mSecondaryAnimating) {
- mSecondaryVisibilityEndRunnable.accept(true /* cancelled */);
- }
- }
-
- @VisibleForTesting
- public boolean isSecondaryVisible() {
- return mIsSecondaryVisible;
- }
-
- /**
* Is this view visible. If a view is currently animating to gone, it will
* return {@code false}.
*/
@@ -179,20 +71,128 @@
return mIsVisible;
}
- @VisibleForTesting
- public void setDuration(int duration) {
- mDuration = duration;
+ /**
+ * Make this view visible. If {@code false} is passed, the view will fade out its content
+ * and set the view Visibility to GONE. If only the content should be changed,
+ * {@link #setContentVisibleAnimated(boolean)} can be used.
+ *
+ * @param visible True if the contents should be visible.
+ * @param animate True if we should fade to new visibility.
+ */
+ public void setVisible(boolean visible, boolean animate) {
+ if (mIsVisible != visible) {
+ mIsVisible = visible;
+ if (animate) {
+ if (visible) {
+ setVisibility(VISIBLE);
+ setWillBeGone(false);
+ notifyHeightChanged(false /* needsAnimation */);
+ } else {
+ setWillBeGone(true);
+ }
+ setContentVisible(visible, true /* animate */, null /* runAfter */);
+ } else {
+ setVisibility(visible ? VISIBLE : GONE);
+ setContentVisible(visible, false /* animate */, null /* runAfter */);
+ setWillBeGone(false);
+ notifyHeightChanged(false /* needsAnimation */);
+ }
+ }
+ }
+
+ public boolean isContentVisible() {
+ return mContentVisible;
+ }
+
+ /**
+ * Change content visibility to {@code visible}, animated.
+ */
+ public void setContentVisibleAnimated(boolean visible) {
+ setContentVisible(visible, true /* animate */, null /* runAfter */);
+ }
+
+ /**
+ * @param visible True if the contents should be visible.
+ * @param animate True if we should fade to new visibility.
+ * @param onAnimationEnded Callback to run after visibility updates, takes a boolean as a
+ * parameter that represents whether the animation was cancelled.
+ */
+ public void setContentVisible(boolean visible, boolean animate,
+ Consumer<Boolean> onAnimationEnded) {
+ if (mContentVisible != visible) {
+ mContentAnimating = animate;
+ mContentVisible = visible;
+ Consumer<Boolean> onAnimationEndedWrapper = (cancelled) -> {
+ onContentVisibilityAnimationEnd();
+ if (onAnimationEnded != null) {
+ onAnimationEnded.accept(cancelled);
+ }
+ };
+ setViewVisible(mContent, visible, animate, onAnimationEndedWrapper);
+ } else if (onAnimationEnded != null) {
+ // Execute onAnimationEnded immediately if there's no animation to perform.
+ onAnimationEnded.accept(true /* cancelled */);
+ }
+
+ if (!mContentAnimating) {
+ onContentVisibilityAnimationEnd();
+ }
+ }
+
+ private void onContentVisibilityAnimationEnd() {
+ mContentAnimating = false;
+ if (getVisibility() != View.GONE && !mIsVisible) {
+ setVisibility(GONE);
+ setWillBeGone(false);
+ notifyHeightChanged(false /* needsAnimation */);
+ }
+ }
+
+ protected boolean isSecondaryVisible() {
+ return mIsSecondaryVisible;
+ }
+
+ /**
+ * Set the secondary view of this layout to visible.
+ *
+ * @param visible should the secondary view be visible
+ * @param animate should the change be animated
+ */
+ protected void setSecondaryVisible(boolean visible, boolean animate) {
+ if (mIsSecondaryVisible != visible) {
+ mSecondaryAnimating = animate;
+ mIsSecondaryVisible = visible;
+ setViewVisible(mSecondaryView, visible, animate,
+ (cancelled) -> onSecondaryVisibilityAnimationEnd());
+ }
+
+ if (!mSecondaryAnimating) {
+ onSecondaryVisibilityAnimationEnd();
+ }
+ }
+
+ private void onSecondaryVisibilityAnimationEnd() {
+ mSecondaryAnimating = false;
+ // If we were on screen, become GONE to avoid touches
+ if (mSecondaryView == null) return;
+ if (getVisibility() != View.GONE
+ && mSecondaryView.getVisibility() != View.GONE
+ && !mIsSecondaryVisible) {
+ mSecondaryView.setVisibility(View.GONE);
+ }
}
/**
* Animate a view to a new visibility.
- * @param view Target view, maybe content view or dismiss view.
- * @param nowVisible Should it now be visible.
- * @param animate Should this be done in an animated way.
- * @param endRunnable A runnable that is run when the animation is done.
+ *
+ * @param view Target view, maybe content view or dismiss view.
+ * @param visible Should it now be visible.
+ * @param animate Should this be done in an animated way.
+ * @param onAnimationEnded Callback to run after visibility updates, takes a boolean as a
+ * parameter that represents whether the animation was cancelled.
*/
- private void setViewVisible(View view, boolean nowVisible,
- boolean animate, Consumer<Boolean> endRunnable) {
+ private void setViewVisible(View view, boolean visible,
+ boolean animate, Consumer<Boolean> onAnimationEnded) {
if (view == null) {
return;
}
@@ -204,21 +204,21 @@
// cancel any previous animations
view.animate().cancel();
- float endValue = nowVisible ? 1.0f : 0.0f;
+ float endValue = visible ? 1.0f : 0.0f;
if (!animate) {
view.setAlpha(endValue);
- if (endRunnable != null) {
- endRunnable.accept(true);
+ if (onAnimationEnded != null) {
+ onAnimationEnded.accept(true);
}
return;
}
// Animate the view alpha
- Interpolator interpolator = nowVisible ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT;
+ Interpolator interpolator = visible ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT;
view.animate()
.alpha(endValue)
.setInterpolator(interpolator)
- .setDuration(mDuration)
+ .setDuration(mAnimationDuration)
.setListener(new AnimatorListenerAdapter() {
boolean mCancelled;
@@ -229,11 +229,16 @@
@Override
public void onAnimationEnd(Animator animation) {
- endRunnable.accept(mCancelled);
+ onAnimationEnded.accept(mCancelled);
}
});
}
+ @VisibleForTesting
+ public void setAnimationDuration(int animationDuration) {
+ mAnimationDuration = animationDuration;
+ }
+
@Override
public long performRemoveAnimation(long duration, long delay,
float translationDirection, boolean isHeadsUpAnimation,
@@ -251,14 +256,14 @@
@Override
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
// TODO: use delay and duration
- setContentVisible(true);
+ setContentVisibleAnimated(true);
}
@Override
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear,
Runnable endRunnable) {
// TODO: use delay and duration
- setContentVisible(true);
+ setContentVisibleAnimated(true);
}
@Override
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 c9973c7..a0ad560 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
@@ -4553,7 +4553,7 @@
mFooterClearAllListener.onClearAll();
}
clearNotifications(ROWS_ALL, true /* closeShade */);
- footerView.setSecondaryVisible(false /* visible */, true /* animate */);
+ footerView.setClearAllButtonVisible(false /* visible */, true /* animate */);
});
if (FooterViewRefactor.isEnabled()) {
updateFooter();
@@ -4618,7 +4618,7 @@
}
boolean animate = mIsExpanded && mAnimationsEnabled;
mFooterView.setVisible(visible, animate);
- mFooterView.setSecondaryVisible(showDismissView, animate);
+ mFooterView.setClearAllButtonVisible(showDismissView, animate);
mFooterView.showHistory(showHistory);
if (!FooterViewRefactor.isEnabled()) {
mFooterView.setFooterLabelVisible(mHasFilteredOutSeenNotifications);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 280c66a..84d2b37 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -1636,6 +1636,11 @@
|| activeRow.stream == STREAM_ACCESSIBILITY
|| mDynamic.get(activeRow.stream);
}
+
+ // Continue to display row if it is visible to user.
+ if (row.view != null && mShowing) {
+ return row.view.getVisibility() == VISIBLE;
+ }
}
return false;
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
index 4a799d8..aabe633 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
@@ -20,6 +20,7 @@
import static com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR;
import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
+import static com.android.systemui.flags.Flags.MIGRATE_CLOCKS_TO_BLUEPRINT;
import static com.android.systemui.flags.Flags.MIGRATE_KEYGUARD_STATUS_VIEW;
import static org.mockito.ArgumentMatchers.any;
@@ -40,6 +41,7 @@
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel;
import com.android.systemui.log.LogBuffer;
@@ -124,6 +126,9 @@
@Mock
protected LogBuffer mLogBuffer;
+ @Mock
+ protected KeyguardClockInteractor mKeyguardClockInteractor;
+
protected final View mFakeDateView = (View) (new ViewGroup(mContext) {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {}
@@ -176,6 +181,7 @@
mFakeFeatureFlags.set(FACE_AUTH_REFACTOR, false);
mFakeFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false);
mFakeFeatureFlags.set(MIGRATE_KEYGUARD_STATUS_VIEW, false);
+ mFakeFeatureFlags.set(MIGRATE_CLOCKS_TO_BLUEPRINT, false);
mController = new KeyguardClockSwitchController(
mView,
mStatusBarStateController,
@@ -197,6 +203,7 @@
mock(DozeParameters.class),
mock(AlwaysOnDisplayNotificationIconViewStore.class),
KeyguardInteractorFactory.create(mFakeFeatureFlags).getKeyguardInteractor(),
+ mKeyguardClockInteractor,
mFakeFeatureFlags
);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
index ef06e0e..b4b02a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
@@ -52,7 +52,6 @@
import androidx.test.filters.SmallTest
import com.airbnb.lottie.LottieAnimationView
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestableContext
import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
@@ -64,6 +63,7 @@
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -111,6 +111,7 @@
@Mock lateinit var displayManager: DisplayManager
@Mock lateinit var handler: Handler
@Mock lateinit var dumpManager: DumpManager
+ @Mock lateinit var fpsUnlockTracker: FpsUnlockTracker
@Captor lateinit var overlayCaptor: ArgumentCaptor<View>
@Captor lateinit var overlayViewParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>
@@ -269,7 +270,8 @@
handler,
alternateBouncerInteractor,
TestCoroutineScope(),
- dumpManager
+ dumpManager,
+ fpsUnlockTracker
)
displayStateRepository.setIsInRearDisplayMode(inRearDisplayMode)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index cbde78b..675ca63 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -235,6 +235,8 @@
private InputManager mInputManager;
@Mock
private ViewRootImpl mViewRootImpl;
+ @Mock
+ private FpsUnlockTracker mFpsUnlockTracker;
@Before
public void setUp() {
@@ -326,7 +328,8 @@
mock(KeyguardFaceAuthInteractor.class),
mUdfpsKeyguardAccessibilityDelegate,
mUdfpsKeyguardViewModels,
- mSelectedUserInteractor
+ mSelectedUserInteractor,
+ mFpsUnlockTracker
);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
new file mode 100644
index 0000000..bc40c2d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 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.keyguard.data.repository
+
+import android.provider.Settings
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.shared.clocks.ClockRegistry
+import com.android.systemui.util.settings.FakeSettings
+import com.google.common.truth.Truth
+import kotlin.test.Test
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestCoroutineScheduler
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@RunWith(JUnit4::class)
+@SmallTest
+class KeyguardClockRepositoryTest : SysuiTestCase() {
+
+ private lateinit var scheduler: TestCoroutineScheduler
+ private lateinit var dispatcher: CoroutineDispatcher
+ private lateinit var scope: TestScope
+
+ private lateinit var underTest: KeyguardClockRepository
+ private lateinit var fakeSettings: FakeSettings
+ @Mock private lateinit var clockRegistry: ClockRegistry
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ fakeSettings = FakeSettings()
+ scheduler = TestCoroutineScheduler()
+ dispatcher = StandardTestDispatcher(scheduler)
+ scope = TestScope(dispatcher)
+ underTest = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
+ }
+
+ @Test
+ fun testSelectedClockSize_small() =
+ scope.runTest {
+ fakeSettings.putInt(Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 0)
+ val value = collectLastValue(underTest.selectedClockSize)
+ Truth.assertThat(value()).isEqualTo(SettingsClockSize.SMALL)
+ }
+
+ @Test
+ fun testSelectedClockSize_dynamic() =
+ scope.runTest {
+ fakeSettings.putInt(Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1)
+ val value = collectLastValue(underTest.selectedClockSize)
+ Truth.assertThat(value()).isEqualTo(SettingsClockSize.DYNAMIC)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
index 8cfa87d..2831053 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
@@ -27,6 +27,7 @@
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection
@@ -37,6 +38,7 @@
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultShortcutsSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultStatusBarSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultStatusViewSection
+import com.android.systemui.keyguard.ui.view.layout.sections.SmartspaceSection
import com.android.systemui.keyguard.ui.view.layout.sections.SplitShadeGuidelines
import com.android.systemui.util.mockito.whenever
import org.junit.Before
@@ -67,6 +69,8 @@
@Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection
@Mock private lateinit var aodBurnInSection: AodBurnInSection
@Mock private lateinit var communalTutorialIndicatorSection: CommunalTutorialIndicatorSection
+ @Mock private lateinit var clockSection: ClockSection
+ @Mock private lateinit var smartspaceSection: SmartspaceSection
@Before
fun setup() {
@@ -86,6 +90,8 @@
aodNotificationIconsSection,
aodBurnInSection,
communalTutorialIndicatorSection,
+ clockSection,
+ smartspaceSection,
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
new file mode 100644
index 0000000..6b85cf7
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.view.layout.sections
+
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.FakeFeatureFlagsClassic
+import com.android.systemui.flags.Flags.MIGRATE_CLOCKS_TO_BLUEPRINT
+import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
+import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.SplitShadeStateController
+import com.android.systemui.util.Utils
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import dagger.Lazy
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@RunWith(JUnit4::class)
+@SmallTest
+class ClockSectionTest : SysuiTestCase() {
+ @Mock private lateinit var keyguardClockInteractor: KeyguardClockInteractor
+ @Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
+ @Mock private lateinit var smartspaceViewModel: KeyguardSmartspaceViewModel
+ @Mock private lateinit var splitShadeStateController: SplitShadeStateController
+ @Mock private lateinit var keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>
+ private var featureFlags: FakeFeatureFlagsClassic = FakeFeatureFlagsClassic()
+
+ private lateinit var underTest: ClockSection
+
+ // smartspaceViewModel.getDimen("date_weather_view_height")
+ private val SMART_SPACE_DATE_WEATHER_HEIGHT = 10
+
+ // smartspaceViewModel.getDimen("enhanced_smartspace_height")
+ private val ENHANCED_SMART_SPACE_HEIGHT = 11
+
+ private val SMALL_CLOCK_TOP_SPLIT_SHADE =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)
+
+ private val SMALL_CLOCK_TOP_NON_SPLIT_SHADE =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
+ Utils.getStatusBarHeaderHeightKeyguard(context)
+
+ private val LARGE_CLOCK_TOP =
+ context.resources.getDimensionPixelSize(R.dimen.status_bar_height) +
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_padding_top
+ ) +
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset) +
+ SMART_SPACE_DATE_WEATHER_HEIGHT +
+ ENHANCED_SMART_SPACE_HEIGHT
+
+ private val CLOCK_FADE_TRANSLATION_Y =
+ context.resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ whenever(smartspaceViewModel.getDimen("date_weather_view_height"))
+ .thenReturn(SMART_SPACE_DATE_WEATHER_HEIGHT)
+ whenever(smartspaceViewModel.getDimen("enhanced_smartspace_height"))
+ .thenReturn(ENHANCED_SMART_SPACE_HEIGHT)
+ featureFlags.set(MIGRATE_CLOCKS_TO_BLUEPRINT, true)
+ underTest =
+ ClockSection(
+ keyguardClockInteractor,
+ keyguardClockViewModel,
+ smartspaceViewModel,
+ mContext,
+ splitShadeStateController,
+ keyguardBlueprintInteractor,
+ featureFlags
+ )
+ }
+
+ @Test
+ fun testApplyDefaultConstraints_LargeClock_SplitShade() {
+ setLargeClock(true)
+ setSplitShade(true)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+
+ val expectedLargeClockTopMargin = LARGE_CLOCK_TOP
+ assetLargeClockTop(cs, expectedLargeClockTopMargin)
+
+ val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_SPLIT_SHADE - CLOCK_FADE_TRANSLATION_Y
+ assetSmallClockTop(cs, expectedSmallClockTopMargin)
+ }
+
+ @Test
+ fun testApplyDefaultConstraints_LargeClock_NonSplitShade() {
+ setLargeClock(true)
+ setSplitShade(false)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+
+ val expectedLargeClockTopMargin = LARGE_CLOCK_TOP
+ assetLargeClockTop(cs, expectedLargeClockTopMargin)
+
+ val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_NON_SPLIT_SHADE - CLOCK_FADE_TRANSLATION_Y
+ assetSmallClockTop(cs, expectedSmallClockTopMargin)
+ }
+
+ @Test
+ fun testApplyDefaultConstraints_SmallClock_SplitShade() {
+ setLargeClock(false)
+ setSplitShade(true)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+
+ val expectedLargeClockTopMargin = LARGE_CLOCK_TOP - CLOCK_FADE_TRANSLATION_Y
+ assetLargeClockTop(cs, expectedLargeClockTopMargin)
+
+ val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_SPLIT_SHADE
+ assetSmallClockTop(cs, expectedSmallClockTopMargin)
+ }
+
+ @Test
+ fun testApplyDefaultConstraints_SmallClock_NonSplitShade() {
+ setLargeClock(false)
+ setSplitShade(false)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+ val expectedLargeClockTopMargin = LARGE_CLOCK_TOP - CLOCK_FADE_TRANSLATION_Y
+ assetLargeClockTop(cs, expectedLargeClockTopMargin)
+
+ val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_NON_SPLIT_SHADE
+ assetSmallClockTop(cs, expectedSmallClockTopMargin)
+ }
+
+ @Test
+ fun testLargeClockShouldBeCentered() {
+ underTest.setClockShouldBeCentered(true)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+ val constraint = cs.getConstraint(R.id.lockscreen_clock_view_large)
+ assertThat(constraint.layout.endToEnd).isEqualTo(ConstraintSet.PARENT_ID)
+ }
+
+ @Test
+ fun testLargeClockShouldNotBeCentered() {
+ underTest.setClockShouldBeCentered(false)
+ val cs = ConstraintSet()
+ underTest.applyDefaultConstraints(cs)
+ val constraint = cs.getConstraint(R.id.lockscreen_clock_view_large)
+ assertThat(constraint.layout.endToEnd).isEqualTo(R.id.split_shade_guideline)
+ }
+
+ private fun setLargeClock(useLargeClock: Boolean) {
+ whenever(keyguardClockViewModel.useLargeClock).thenReturn(useLargeClock)
+ }
+
+ private fun setSplitShade(isInSplitShade: Boolean) {
+ whenever(splitShadeStateController.shouldUseSplitNotificationShade(context.resources))
+ .thenReturn(isInSplitShade)
+ }
+
+ private fun assetLargeClockTop(cs: ConstraintSet, expectedLargeClockTopMargin: Int) {
+ val largeClockConstraint = cs.getConstraint(R.id.lockscreen_clock_view_large)
+ assertThat(largeClockConstraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
+ assertThat(largeClockConstraint.layout.topMargin).isEqualTo(expectedLargeClockTopMargin)
+ }
+
+ private fun assetSmallClockTop(cs: ConstraintSet, expectedSmallClockTopMargin: Int) {
+ val smallClockConstraint = cs.getConstraint(R.id.lockscreen_clock_view)
+ assertThat(smallClockConstraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
+ assertThat(smallClockConstraint.layout.topMargin).isEqualTo(expectedSmallClockTopMargin)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSectionTest.kt
new file mode 100644
index 0000000..02bafd0
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSectionTest.kt
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.view.layout.sections
+
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.GONE
+import androidx.constraintlayout.widget.ConstraintSet.VISIBLE
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.FakeFeatureFlagsClassic
+import com.android.systemui.flags.Flags.MIGRATE_CLOCKS_TO_BLUEPRINT
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.StateFlow
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@RunWith(JUnit4::class)
+@SmallTest
+class SmartspaceSectionTest : SysuiTestCase() {
+
+ private lateinit var underTest: SmartspaceSection
+ @Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
+ @Mock private lateinit var keyguardSmartspaceViewModel: KeyguardSmartspaceViewModel
+ @Mock private lateinit var lockscreenSmartspaceController: LockscreenSmartspaceController
+ @Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
+ @Mock private lateinit var hasCustomWeatherDataDisplay: StateFlow<Boolean>
+ private lateinit var mFakeFeatureFlags: FakeFeatureFlagsClassic
+
+ private val smartspaceView = View(mContext).also { it.id = View.generateViewId() }
+ private val weatherView = View(mContext).also { it.id = View.generateViewId() }
+ private val dateView = View(mContext).also { it.id = View.generateViewId() }
+ private lateinit var constraintLayout: ConstraintLayout
+ private lateinit var constraintSet: ConstraintSet
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ mFakeFeatureFlags = FakeFeatureFlagsClassic()
+ mFakeFeatureFlags.set(MIGRATE_CLOCKS_TO_BLUEPRINT, true)
+ underTest =
+ SmartspaceSection(
+ keyguardClockViewModel,
+ keyguardSmartspaceViewModel,
+ mContext,
+ lockscreenSmartspaceController,
+ keyguardUnlockAnimationController,
+ mFakeFeatureFlags
+ )
+ constraintLayout = ConstraintLayout(mContext)
+ whenever(lockscreenSmartspaceController.buildAndConnectView(constraintLayout))
+ .thenReturn(smartspaceView)
+ whenever(lockscreenSmartspaceController.buildAndConnectWeatherView(constraintLayout))
+ .thenReturn(weatherView)
+ whenever(lockscreenSmartspaceController.buildAndConnectDateView(constraintLayout))
+ .thenReturn(dateView)
+ whenever(keyguardClockViewModel.hasCustomWeatherDataDisplay)
+ .thenReturn(hasCustomWeatherDataDisplay)
+ constraintSet = ConstraintSet()
+ }
+
+ @Test
+ fun testAddViews_notSmartspaceEnabled() {
+ whenever(keyguardSmartspaceViewModel.isSmartspaceEnabled).thenReturn(false)
+ val constraintLayout = ConstraintLayout(mContext)
+ underTest.addViews(constraintLayout)
+ assertThat(smartspaceView.parent).isNull()
+ assertThat(weatherView.parent).isNull()
+ assertThat(dateView.parent).isNull()
+ }
+
+ @Test
+ fun testAddViews_smartspaceEnabled_dateWeatherDecoupled() {
+ whenever(keyguardSmartspaceViewModel.isSmartspaceEnabled).thenReturn(true)
+ whenever(keyguardSmartspaceViewModel.isDateWeatherDecoupled).thenReturn(true)
+ underTest.addViews(constraintLayout)
+ assert(smartspaceView.parent == constraintLayout)
+ assert(weatherView.parent == constraintLayout)
+ assert(dateView.parent == constraintLayout)
+ }
+
+ @Test
+ fun testAddViews_smartspaceEnabled_notDateWeatherDecoupled() {
+ whenever(keyguardSmartspaceViewModel.isSmartspaceEnabled).thenReturn(true)
+ whenever(keyguardSmartspaceViewModel.isDateWeatherDecoupled).thenReturn(false)
+ underTest.addViews(constraintLayout)
+ assert(smartspaceView.parent == constraintLayout)
+ assert(weatherView.parent == null)
+ assert(dateView.parent == null)
+ }
+
+ @Test
+ fun testConstraintsWhenNotHasCustomWeatherDataDisplay() {
+ whenever(keyguardSmartspaceViewModel.isSmartspaceEnabled).thenReturn(true)
+ whenever(keyguardSmartspaceViewModel.isDateWeatherDecoupled).thenReturn(true)
+ whenever(keyguardClockViewModel.hasCustomWeatherDataDisplay.value).thenReturn(false)
+ underTest.addViews(constraintLayout)
+ underTest.applyConstraints(constraintSet)
+ assertWeatherSmartspaceConstrains(constraintSet)
+
+ val smartspaceConstraints = constraintSet.getConstraint(smartspaceView.id)
+ assertThat(smartspaceConstraints.layout.topToBottom).isEqualTo(dateView.id)
+
+ val dateConstraints = constraintSet.getConstraint(dateView.id)
+ assertThat(dateConstraints.layout.topToBottom).isEqualTo(R.id.lockscreen_clock_view)
+ }
+
+ @Test
+ fun testConstraintsWhenHasCustomWeatherDataDisplay() {
+ whenever(keyguardClockViewModel.hasCustomWeatherDataDisplay.value).thenReturn(true)
+ underTest.addViews(constraintLayout)
+ underTest.applyConstraints(constraintSet)
+ assertWeatherSmartspaceConstrains(constraintSet)
+
+ val dateConstraints = constraintSet.getConstraint(dateView.id)
+ assertThat(dateConstraints.layout.bottomToTop).isEqualTo(smartspaceView.id)
+ }
+
+ @Test
+ fun testNormalDateWeatherVisibility() {
+ whenever(keyguardClockViewModel.hasCustomWeatherDataDisplay.value).thenReturn(false)
+ whenever(keyguardSmartspaceViewModel.isWeatherEnabled).thenReturn(true)
+ underTest.addViews(constraintLayout)
+ underTest.applyConstraints(constraintSet)
+ assertThat(constraintSet.getVisibility(weatherView.id)).isEqualTo(VISIBLE)
+
+ whenever(keyguardSmartspaceViewModel.isWeatherEnabled).thenReturn(false)
+ underTest.applyConstraints(constraintSet)
+ assertThat(constraintSet.getVisibility(weatherView.id)).isEqualTo(GONE)
+ assertThat(constraintSet.getVisibility(dateView.id)).isEqualTo(VISIBLE)
+ }
+ @Test
+ fun testCustomDateWeatherVisibility() {
+ whenever(keyguardClockViewModel.hasCustomWeatherDataDisplay.value).thenReturn(true)
+ underTest.addViews(constraintLayout)
+ underTest.applyConstraints(constraintSet)
+
+ assertThat(constraintSet.getVisibility(weatherView.id)).isEqualTo(GONE)
+ assertThat(constraintSet.getVisibility(dateView.id)).isEqualTo(GONE)
+ }
+
+ private fun assertWeatherSmartspaceConstrains(cs: ConstraintSet) {
+ val weatherConstraints = cs.getConstraint(weatherView.id)
+ assertThat(weatherConstraints.layout.topToTop).isEqualTo(dateView.id)
+ assertThat(weatherConstraints.layout.bottomToBottom).isEqualTo(dateView.id)
+ assertThat(weatherConstraints.layout.startToEnd).isEqualTo(dateView.id)
+ assertThat(weatherConstraints.layout.startMargin).isEqualTo(4)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
new file mode 100644
index 0000000..46a7735
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 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.keyguard.ui.viewmodel
+
+import android.provider.Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK
+import androidx.test.filters.SmallTest
+import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.LARGE
+import com.android.keyguard.KeyguardClockSwitch.SMALL
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
+import com.android.systemui.keyguard.data.repository.KeyguardRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.shared.clocks.ClockRegistry
+import com.android.systemui.util.settings.FakeSettings
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestCoroutineScheduler
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(JUnit4::class)
+class KeyguardClockViewModelTest : SysuiTestCase() {
+ private lateinit var scheduler: TestCoroutineScheduler
+ private lateinit var dispatcher: CoroutineDispatcher
+ private lateinit var scope: TestScope
+
+ private lateinit var underTest: KeyguardClockViewModel
+ private lateinit var keyguardInteractor: KeyguardInteractor
+ private lateinit var keyguardRepository: KeyguardRepository
+ private lateinit var keyguardClockInteractor: KeyguardClockInteractor
+ private lateinit var keyguardClockRepository: KeyguardClockRepository
+ private lateinit var fakeSettings: FakeSettings
+ @Mock private lateinit var clockRegistry: ClockRegistry
+ @Mock private lateinit var eventController: ClockEventController
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ KeyguardInteractorFactory.create().let {
+ keyguardInteractor = it.keyguardInteractor
+ keyguardRepository = it.repository
+ }
+ fakeSettings = FakeSettings()
+ scheduler = TestCoroutineScheduler()
+ dispatcher = StandardTestDispatcher(scheduler)
+ scope = TestScope(dispatcher)
+ keyguardClockRepository = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
+ keyguardClockInteractor = KeyguardClockInteractor(eventController, keyguardClockRepository)
+ underTest =
+ KeyguardClockViewModel(
+ keyguardInteractor,
+ keyguardClockInteractor,
+ scope.backgroundScope
+ )
+ }
+
+ @Test
+ fun testClockSize_alwaysSmallClock() =
+ scope.runTest {
+ // When use double line clock is disabled,
+ // should always return small
+ fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 0)
+ keyguardRepository.setClockSize(LARGE)
+ val value = collectLastValue(underTest.clockSize)
+ assertThat(value()).isEqualTo(SMALL)
+ }
+
+ @Test
+ fun testClockSize_dynamicClockSize() =
+ scope.runTest {
+ fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1)
+ keyguardRepository.setClockSize(SMALL)
+ var value = collectLastValue(underTest.clockSize)
+ assertThat(value()).isEqualTo(SMALL)
+
+ keyguardRepository.setClockSize(LARGE)
+ value = collectLastValue(underTest.clockSize)
+ assertThat(value()).isEqualTo(LARGE)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
index 95ee3b7..bd1c310 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
@@ -41,7 +41,7 @@
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
- underTest = QSTileIntentUserInputHandler(activityStarted)
+ underTest = QSTileIntentUserInputHandlerImpl(activityStarted)
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
index d669006..ddeb05b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
@@ -23,6 +23,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.scene.SceneTestUtils
+import com.android.systemui.scene.sceneKeys
import com.android.systemui.scene.shared.model.ObservableTransitionState
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
@@ -70,10 +71,8 @@
@Test(expected = IllegalStateException::class)
fun setDesiredScene_noSuchSceneInContainer_throws() {
- val underTest =
- utils.fakeSceneContainerRepository(
- utils.fakeSceneContainerConfig(listOf(SceneKey.QuickSettings, SceneKey.Lockscreen)),
- )
+ utils.kosmos.sceneKeys = listOf(SceneKey.QuickSettings, SceneKey.Lockscreen)
+ val underTest = utils.fakeSceneContainerRepository(utils.fakeSceneContainerConfig())
underTest.setDesiredScene(SceneModel(SceneKey.Shade))
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
index c0b5861..f6362fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
@@ -27,6 +27,7 @@
import com.android.systemui.authentication.domain.model.AuthenticationMethodModel
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
import com.android.systemui.model.SysUiState
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
index 8e0cf7d..55a44ae 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
@@ -172,7 +172,7 @@
mTestScope.getBackgroundScope(),
new SceneContainerRepository(
mTestScope.getBackgroundScope(),
- mUtils.fakeSceneContainerConfig(mUtils.fakeSceneKeys())),
+ mUtils.fakeSceneContainerConfig()),
powerRepository,
mock(SceneLogger.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
index 2f45b12..d4b35a9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
@@ -207,7 +207,7 @@
mTestScope.getBackgroundScope(),
new SceneContainerRepository(
mTestScope.getBackgroundScope(),
- mUtils.fakeSceneContainerConfig(mUtils.fakeSceneKeys())),
+ mUtils.fakeSceneContainerConfig()),
powerRepository,
mock(SceneLogger.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
index cc87d7c..a64ac67 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
@@ -60,7 +60,7 @@
mView = (FooterView) LayoutInflater.from(mSpyContext).inflate(
R.layout.status_bar_notification_footer, null, false);
- mView.setDuration(0);
+ mView.setAnimationDuration(0);
}
@Test
@@ -107,10 +107,10 @@
@Test
public void testPerformSecondaryVisibilityAnimation() {
- mView.setSecondaryVisible(false /* visible */, false /* animate */);
- assertFalse(mView.isSecondaryVisible());
+ mView.setClearAllButtonVisible(false /* visible */, false /* animate */);
+ assertFalse(mView.isClearAllButtonVisible());
- mView.setSecondaryVisible(true /* visible */, true /* animate */);
+ mView.setClearAllButtonVisible(true /* visible */, true /* animate */);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index 12f7d9e..6203531 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -395,7 +395,7 @@
mStackScroller.updateFooterView(true, false, true);
verify(view).setVisible(eq(true), anyBoolean());
- verify(view).setSecondaryVisible(eq(false), anyBoolean());
+ verify(view).setClearAllButtonVisible(eq(false), anyBoolean());
}
@Test
@@ -407,7 +407,7 @@
mStackScroller.updateFooterView(true, true, true);
verify(view).setVisible(eq(true), anyBoolean());
- verify(view).setSecondaryVisible(eq(true), anyBoolean());
+ verify(view).setClearAllButtonVisible(eq(true), anyBoolean());
}
@Test
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 8309b85..2e191b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -395,7 +395,7 @@
mTestScope.getBackgroundScope(),
new SceneContainerRepository(
mTestScope.getBackgroundScope(),
- mUtils.fakeSceneContainerConfig(mUtils.fakeSceneKeys())),
+ mUtils.fakeSceneContainerConfig()),
powerRepository,
mock(SceneLogger.class));
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
index 88a88c7..d3744d55 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
@@ -18,6 +18,7 @@
package com.android.systemui.keyguard.data.repository
import android.graphics.Point
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.common.shared.model.Position
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
@@ -41,6 +42,11 @@
class FakeKeyguardRepository @Inject constructor() : KeyguardRepository {
private val _deferKeyguardDone: MutableSharedFlow<KeyguardDone> = MutableSharedFlow()
override val keyguardDone: Flow<KeyguardDone> = _deferKeyguardDone
+ private val _clockSize = MutableStateFlow<Int>(LARGE)
+ override val clockSize: Flow<Int> = _clockSize
+
+ private val _clockShouldBeCentered = MutableStateFlow<Boolean>(true)
+ override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered
private val _dismissAction = MutableStateFlow<DismissAction>(DismissAction.None)
override val dismissAction: StateFlow<DismissAction> = _dismissAction
@@ -177,6 +183,14 @@
_deferKeyguardDone.emit(timing)
}
+ override fun setClockSize(size: Int) {
+ _clockSize.value = size
+ }
+
+ override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
+ _clockShouldBeCentered.value = shouldBeCentered
+ }
+
fun dozeTimeTick(millis: Long) {
_dozeTimeTick.value = millis
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
new file mode 100644
index 0000000..cc843b5
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
@@ -0,0 +1,8 @@
+package com.android.systemui.kosmos
+
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+
+val Kosmos.testDispatcher by Fixture { StandardTestDispatcher() }
+val Kosmos.testScope by Fixture { TestScope(testDispatcher) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt
new file mode 100644
index 0000000..c74cdd4
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt
@@ -0,0 +1,69 @@
+package com.android.systemui.kosmos
+
+import kotlin.reflect.KProperty
+
+// (Historical note: The name Kosmos is meant to invoke "Kotlin", the "Object Mother" pattern
+// (https://martinfowler.com/bliki/ObjectMother.html), and of course the Greek word "kosmos" for
+// the "order of the world" (https://en.wiktionary.org/wiki/%CE%BA%CF%8C%CF%83%CE%BC%CE%BF%CF%82)
+/**
+ * Each Kosmos is its own self-contained set of fixtures, which may reference each other. Fixtures
+ * can be defined through extension properties in any file:
+ * ```
+ * // fixture that must be set:
+ * var Kosmos.context by Fixture<Context>()
+ *
+ * // fixture with overrideable default.
+ * var Kosmos.landscapeMode by Fixture { false }
+ *
+ * // fixture forbidding override (note `val`, and referencing context fixture from above)
+ * val Kosmos.lifecycleScope by Fixture { context.lifecycleScope }
+ * ```
+ *
+ * To use the fixtures, create an instance of Kosmos and retrieve the values you need:
+ * ```
+ * val k = Kosmos()
+ * k.context = mContext
+ * val underTest = YourInteractor(
+ * context = k.context,
+ * landscapeMode = k.landscapeMode,
+ * )
+ * ```
+ */
+class Kosmos {
+ private val map: MutableMap<String, Any?> = mutableMapOf()
+ private val gotten: MutableSet<String> = mutableSetOf()
+
+ /**
+ * A value in the kosmos that has a single value once it's read. It can be overridden before
+ * first use only; all objects that are dependent on this fixture will get the same value.
+ *
+ * Example classic uses would be a clock, filesystem, or singleton controller.
+ *
+ * If no [creator] parameter is provided, the fixture must be set before use.
+ */
+ class Fixture<T>(private val creator: (Kosmos.() -> T)? = null) {
+ operator fun getValue(thisRef: Kosmos, property: KProperty<*>): T {
+ thisRef.gotten.add(property.name)
+ @Suppress("UNCHECKED_CAST")
+ if (!thisRef.map.contains(property.name)) {
+ if (creator == null) {
+ throw IllegalStateException(
+ "Fixture ${property.name} has no default, and is read before set."
+ )
+ } else {
+ val nonNullCreator = creator
+ // The Kotlin compiler seems to need this odd workaround
+ thisRef.map[property.name] = thisRef.nonNullCreator()
+ }
+ }
+ return thisRef.map[property.name] as T
+ }
+
+ operator fun setValue(thisRef: Kosmos, property: KProperty<*>, value: T) {
+ check(!thisRef.gotten.contains(property.name)) {
+ "Tried to set fixture '${property.name}' after it's already been read."
+ }
+ thisRef.map[property.name] = value
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt
new file mode 100644
index 0000000..1185f2e
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 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.tiles.base.actions
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.view.View
+
+/**
+ * Fake implementation of [QSTileIntentUserInputHandler] interface. Consider using this alongside
+ * [QSTileIntentUserInputHandlerSubject].
+ */
+class FakeQSTileIntentUserInputHandler : QSTileIntentUserInputHandler {
+
+ val handledInputs: List<Input>
+ get() = mutableInputs
+
+ private val mutableInputs = mutableListOf<Input>()
+
+ override fun handle(view: View?, intent: Intent) {
+ mutableInputs.add(Input.Intent(view, intent))
+ }
+
+ override fun handle(view: View?, pendingIntent: PendingIntent) {
+ mutableInputs.add(Input.PendingIntent(view, pendingIntent))
+ }
+
+ sealed interface Input {
+ data class Intent(val view: View?, val intent: android.content.Intent) : Input
+ data class PendingIntent(val view: View?, val pendingIntent: android.app.PendingIntent) :
+ Input
+ }
+}
+
+val FakeQSTileIntentUserInputHandler.intentInputs
+ get() = handledInputs.mapNotNull { it as? FakeQSTileIntentUserInputHandler.Input.Intent }
+val FakeQSTileIntentUserInputHandler.pendingIntentInputs
+ get() = handledInputs.mapNotNull { it as? FakeQSTileIntentUserInputHandler.Input.PendingIntent }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerSubject.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerSubject.kt
new file mode 100644
index 0000000..e09f280
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerSubject.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 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.tiles.base.actions
+
+import com.google.common.truth.FailureMetadata
+import com.google.common.truth.Subject
+import com.google.common.truth.Truth
+
+/** [Truth] [Subject] to assert inputs handled by [FakeQSTileIntentUserInputHandler] */
+class QSTileIntentUserInputHandlerSubject
+private constructor(
+ failureMetadata: FailureMetadata,
+ private val subject: FakeQSTileIntentUserInputHandler
+) : Subject(failureMetadata, subject) {
+
+ fun handledOneIntentInput(
+ intentAssertions: (FakeQSTileIntentUserInputHandler.Input.Intent) -> Unit = {},
+ ) {
+ // check that there are no other inputs
+ check("handledInputs").that(subject.handledInputs).hasSize(1)
+ // check there is an intent input
+ check("intentInputs").that(subject.intentInputs).hasSize(1)
+
+ intentAssertions(subject.intentInputs.first())
+ }
+
+ fun handledOnePendingIntentInput(
+ intentAssertions: (FakeQSTileIntentUserInputHandler.Input.PendingIntent) -> Unit = {},
+ ) {
+ // check that there are no other inputs
+ check("handledInputs").that(subject.handledInputs).hasSize(1)
+ // check there is a pending intent input
+ check("intentInputs").that(subject.pendingIntentInputs).hasSize(1)
+
+ intentAssertions(subject.pendingIntentInputs.first())
+ }
+
+ fun handledNoInputs() {
+ check("handledInputs").that(subject.handledInputs).isEmpty()
+ }
+
+ companion object {
+
+ /**
+ * [Truth.assertThat]-like factory to initialize the assertion. Example:
+ * ```
+ * assertThat(inputHandler).handledOneIntentInput {
+ * assertThat(it.intent.action).isEqualTo("action.Test")
+ * }
+ * ```
+ */
+ fun assertThat(
+ handler: FakeQSTileIntentUserInputHandler
+ ): QSTileIntentUserInputHandlerSubject =
+ Truth.assertAbout {
+ failureMetadata: FailureMetadata,
+ subject: FakeQSTileIntentUserInputHandler ->
+ QSTileIntentUserInputHandlerSubject(failureMetadata, subject)
+ }
+ .that(handler)
+ }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt
new file mode 100644
index 0000000..832b07a
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 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.tiles.base.interactor
+
+import android.os.UserHandle
+import android.view.View
+import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction
+
+object QSTileInputTestKtx {
+
+ fun <T> click(
+ data: T,
+ user: UserHandle = UserHandle.CURRENT,
+ view: View? = null,
+ ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.Click(view), data)
+
+ fun <T> longClick(
+ data: T,
+ user: UserHandle = UserHandle.CURRENT,
+ view: View? = null,
+ ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.LongClick(view), data)
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt
new file mode 100644
index 0000000..8fc419c
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt
@@ -0,0 +1,20 @@
+package com.android.systemui.scene
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.scene.shared.model.SceneContainerConfig
+import com.android.systemui.scene.shared.model.SceneKey
+
+var Kosmos.sceneKeys by Fixture {
+ listOf(
+ SceneKey.QuickSettings,
+ SceneKey.Shade,
+ SceneKey.Lockscreen,
+ SceneKey.Bouncer,
+ SceneKey.Gone,
+ SceneKey.Communal,
+ )
+}
+
+val Kosmos.initialSceneKey by Fixture { SceneKey.Lockscreen }
+val Kosmos.sceneContainerConfig by Fixture { SceneContainerConfig(sceneKeys, initialSceneKey) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
index 6beb513..10110e2 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
@@ -50,6 +50,9 @@
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.data.repository.TrustRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
import com.android.systemui.power.data.repository.FakePowerRepository
import com.android.systemui.power.domain.interactor.PowerInteractorFactory
import com.android.systemui.scene.data.repository.SceneContainerRepository
@@ -70,8 +73,6 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.currentTime
/**
@@ -82,8 +83,9 @@
class SceneTestUtils(
test: SysuiTestCase,
) {
- val testDispatcher = StandardTestDispatcher()
- val testScope = TestScope(testDispatcher)
+ val kosmos = Kosmos()
+ val testDispatcher = kosmos.testDispatcher
+ val testScope = kosmos.testScope
val featureFlags =
FakeFeatureFlagsClassic().apply {
set(Flags.FACE_AUTH_REFACTOR, false)
@@ -125,23 +127,11 @@
}
fun fakeSceneKeys(): List<SceneKey> {
- return listOf(
- SceneKey.QuickSettings,
- SceneKey.Shade,
- SceneKey.Lockscreen,
- SceneKey.Bouncer,
- SceneKey.Gone,
- SceneKey.Communal,
- )
+ return kosmos.sceneKeys
}
- fun fakeSceneContainerConfig(
- sceneKeys: List<SceneKey> = fakeSceneKeys(),
- ): SceneContainerConfig {
- return SceneContainerConfig(
- sceneKeys = sceneKeys,
- initialSceneKey = SceneKey.Lockscreen,
- )
+ fun fakeSceneContainerConfig(): SceneContainerConfig {
+ return kosmos.sceneContainerConfig
}
@JvmOverloads
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 8a801d8..85abf87 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -191,7 +191,7 @@
final MessageHandler mHandler;
- private static final int TIMEOUT_DELAY_MS = 1000 * 60;
+ private static final int TIMEOUT_DELAY_MS = 1000 * 60 * 15;
// Messages that can be sent on mHandler
private static final int MESSAGE_TIMED_OUT = 3;
private static final int MESSAGE_COPY_SHARED_ACCOUNT = 4;
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
index e07c2bc..e41b6ae 100644
--- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
@@ -350,6 +350,13 @@
final BroadcastRecord testRecord = (BroadcastRecord) args.arg1;
final int testRecordIndex = args.argi1;
final Object testReceiver = testRecord.receivers.get(testRecordIndex);
+ // If we come across the record that's being enqueued in the queue, then that means
+ // we already enqueued it for a receiver in this process and trying to insert a new
+ // one past this could create priority inversion in the queue, so bail out.
+ if (record == testRecord && record.blockedUntilBeyondCount[recordIndex]
+ > testRecord.blockedUntilBeyondCount[testRecordIndex]) {
+ break;
+ }
if ((record.callingUid == testRecord.callingUid)
&& (record.userId == testRecord.userId)
&& record.intent.filterEquals(testRecord.intent)
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 68af626..a0a7b2b 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -2583,7 +2583,7 @@
// Do nothing if the binder error callback is not enabled.
// That means the frozen apps in a wrong state will be killed when they are unfrozen later.
- if (!mFreezerBinderCallbackEnabled) {
+ if (!mUseFreezer || !mFreezerBinderCallbackEnabled) {
return;
}
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 70a1c91..0fba739 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -246,7 +246,9 @@
int getFgsAllowStart() {
return mAllowStartForegroundNoBinding != REASON_DENIED
? mAllowStartForegroundNoBinding
- : mAllowStartInBindService;
+ : (mAllowStartByBindings != REASON_DENIED
+ ? mAllowStartByBindings
+ : mAllowStartInBindService);
}
boolean isFgsAllowedStart() {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index ff12ca2..36fc4aa 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -3225,6 +3225,10 @@
if (mSmallAreaDetectionController != null) {
mSmallAreaDetectionController.dump(pw);
}
+
+ pw.println();
+ mFlags.dump(pw);
+
}
private static float[] getFloatArray(TypedArray array) {
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 0d3e0bc..b1c0762 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -18,11 +18,13 @@
import android.os.Build;
import android.os.SystemProperties;
+import android.text.TextUtils;
import android.util.Slog;
import com.android.server.display.feature.flags.Flags;
import com.android.server.display.utils.DebugUtils;
+import java.io.PrintWriter;
import java.util.function.Supplier;
/**
@@ -160,6 +162,25 @@
return mSmallAreaDetectionFlagState.isEnabled();
}
+ /**
+ * dumps all flagstates
+ * @param pw printWriter
+ */
+ public void dump(PrintWriter pw) {
+ pw.println("DisplayManagerFlags:");
+ pw.println(" " + mAdaptiveToneImprovements1);
+ pw.println(" " + mAdaptiveToneImprovements2);
+ pw.println(" " + mBackUpSmoothDisplayAndForcePeakRefreshRateFlagState);
+ pw.println(" " + mConnectedDisplayErrorHandlingFlagState);
+ pw.println(" " + mConnectedDisplayManagementFlagState);
+ pw.println(" " + mDisplayOffloadFlagState);
+ pw.println(" " + mExternalDisplayLimitModeState);
+ pw.println(" " + mHdrClamperFlagState);
+ pw.println(" " + mNbmControllerFlagState);
+ pw.println(" " + mPowerThrottlingClamperFlagState);
+ pw.println(" " + mSmallAreaDetectionFlagState);
+ }
+
private static class FlagState {
private final String mName;
@@ -197,5 +218,16 @@
}
return flagValue;
}
+
+ @Override
+ public String toString() {
+ // remove com.android.server.display.feature.flags. from the beginning of the name.
+ // align all isEnabled() values.
+ // Adjust lengths if we end up with longer names
+ final int nameLength = mName.length();
+ return TextUtils.substring(mName, 41, nameLength) + ": "
+ + TextUtils.formatSimple("%" + (93 - nameLength) + "s%s", " " , isEnabled())
+ + " (def:" + mFlagFunction.get() + ")";
+ }
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index d6580df..d3eedd7 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -1326,7 +1326,10 @@
removeAction(NewDeviceAction.class);
removeAction(AbsoluteVolumeAudioStatusAction.class);
- disableSystemAudioIfExist();
+ // Keep SAM enabled if eARC is enabled, unless we're going to Standby.
+ if (initiatedByCec || !mService.isEarcEnabled()){
+ disableSystemAudioIfExist();
+ }
disableArcIfExist();
super.disableDevice(initiatedByCec, callback);
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index c28a68b..b3926fd 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -3610,7 +3610,7 @@
}
}
- private boolean isEarcEnabled() {
+ public boolean isEarcEnabled() {
synchronized (mLock) {
return mEarcEnabled;
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 4a4214f..8ce0c72 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -32,6 +32,7 @@
import static android.os.PowerManagerInternal.wakefulnessToString;
import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN;
+import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -644,9 +645,11 @@
private boolean mBatteryLevelLow;
// True if we are currently in device idle mode.
+ @GuardedBy("mLock")
private boolean mDeviceIdleMode;
// True if we are currently in light device idle mode.
+ @GuardedBy("mLock")
private boolean mLightDeviceIdleMode;
// Set of app ids that we will respect the wake locks for while in device idle mode.
@@ -4035,6 +4038,9 @@
synchronized (mLock) {
if (mLightDeviceIdleMode != enabled) {
mLightDeviceIdleMode = enabled;
+ if (!mDeviceIdleMode && disableWakelocksInLightIdle()) {
+ updateWakeLockDisabledStatesLocked();
+ }
setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode);
return true;
}
@@ -4045,7 +4051,7 @@
void setDeviceIdleWhitelistInternal(int[] appids) {
synchronized (mLock) {
mDeviceIdleWhitelist = appids;
- if (mDeviceIdleMode) {
+ if (doesIdleStateBlockWakeLocksLocked()) {
updateWakeLockDisabledStatesLocked();
}
}
@@ -4054,7 +4060,7 @@
void setDeviceIdleTempWhitelistInternal(int[] appids) {
synchronized (mLock) {
mDeviceIdleTempWhitelist = appids;
- if (mDeviceIdleMode) {
+ if (doesIdleStateBlockWakeLocksLocked()) {
updateWakeLockDisabledStatesLocked();
}
}
@@ -4114,7 +4120,7 @@
<= ActivityManager.PROCESS_STATE_RECEIVER;
state.mProcState = procState;
if (state.mNumWakeLocks > 0) {
- if (mDeviceIdleMode || mLowPowerStandbyActive) {
+ if (doesIdleStateBlockWakeLocksLocked() || mLowPowerStandbyActive) {
handleUidStateChangeLocked();
} else if (!state.mActive && oldShouldAllow !=
(procState <= ActivityManager.PROCESS_STATE_RECEIVER)) {
@@ -4134,7 +4140,8 @@
state.mProcState = ActivityManager.PROCESS_STATE_NONEXISTENT;
state.mActive = false;
mUidState.removeAt(index);
- if ((mDeviceIdleMode || mLowPowerStandbyActive) && state.mNumWakeLocks > 0) {
+ if ((doesIdleStateBlockWakeLocksLocked() || mLowPowerStandbyActive)
+ && state.mNumWakeLocks > 0) {
handleUidStateChangeLocked();
}
}
@@ -4169,6 +4176,11 @@
}
@GuardedBy("mLock")
+ private boolean doesIdleStateBlockWakeLocksLocked() {
+ return mDeviceIdleMode || (mLightDeviceIdleMode && disableWakelocksInLightIdle());
+ }
+
+ @GuardedBy("mLock")
private void updateWakeLockDisabledStatesLocked() {
boolean changed = false;
final int numWakeLocks = mWakeLocks.size();
@@ -4207,7 +4219,7 @@
!= ActivityManager.PROCESS_STATE_NONEXISTENT &&
wakeLock.mUidState.mProcState > ActivityManager.PROCESS_STATE_RECEIVER);
}
- if (mDeviceIdleMode) {
+ if (doesIdleStateBlockWakeLocksLocked()) {
// If we are in idle mode, we will also ignore all partial wake locks that are
// for application uids that are not allowlisted.
final UidState state = wakeLock.mUidState;
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 97420d0..c1da589 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -1281,12 +1281,19 @@
private void addBytesTransferByTagAndMeteredAtoms(@NonNull NetworkStatsExt statsExt,
@NonNull List<StatsEvent> pulledData) {
+ // Workaround for 5G NSA mode, see {@link NetworkStatsManager#NETWORK_TYPE_5G_NSA}.
+ // 5G NSA mode means the primary cell is LTE with a secondary connection to an
+ // NR cell. To mitigate risk, NetworkStats is currently storing this state as
+ // a fake RAT type rather than storing the boolean separately.
+ final boolean is5GNsa = statsExt.ratType == NetworkStatsManager.NETWORK_TYPE_5G_NSA;
+
for (NetworkStats.Entry entry : statsExt.stats) {
pulledData.add(FrameworkStatsLog.buildStatsEvent(
FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED, entry.getUid(),
entry.getMetered() == NetworkStats.METERED_YES, entry.getTag(),
entry.getRxBytes(), entry.getRxPackets(), entry.getTxBytes(),
- entry.getTxPackets()));
+ entry.getTxPackets(),
+ is5GNsa ? TelephonyManager.NETWORK_TYPE_LTE : statsExt.ratType));
}
}
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 2d37b9b..87ae045 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -78,8 +78,6 @@
private @BackNavigationInfo.BackTargetType int mLastBackType;
private boolean mShowWallpaper;
private Runnable mPendingAnimation;
-
- private boolean mBackAnimationRunning;
private final NavigationMonitor mNavigationMonitor = new NavigationMonitor();
private AnimationHandler mAnimationHandler;
@@ -248,12 +246,13 @@
// - We have an application callback.
// - We don't have any ActivityRecord or Task to animate.
// - The IME is opened, and we just need to close it.
- // - The home activity is the focused activity.
+ // - The home activity is the focused activity & it's not TYPE_BASE_APPLICATION
// - The current activity will do shared element transition when exiting.
if (backType == BackNavigationInfo.TYPE_CALLBACK
|| currentActivity == null
|| currentTask == null
- || currentActivity.isActivityTypeHome()
+ || (currentActivity.isActivityTypeHome()
+ && window.mAttrs.type == TYPE_BASE_APPLICATION)
|| currentActivity.mHasSceneTransition) {
infoBuilder.setType(BackNavigationInfo.TYPE_CALLBACK);
infoBuilder.setOnBackNavigationDone(new RemoteCallback(result ->
@@ -363,14 +362,21 @@
// For now, we only animate when going home, cross task or cross-activity.
boolean prepareAnimation =
(backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
- || backType == BackNavigationInfo.TYPE_CROSS_TASK
- || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY)
- && adapter != null;
+ || backType == BackNavigationInfo.TYPE_CROSS_TASK
+ || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY
+ || backType == BackNavigationInfo.TYPE_DIALOG_CLOSE)
+ && adapter != null;
if (prepareAnimation) {
final AnimationHandler.ScheduleAnimationBuilder builder =
- mAnimationHandler.prepareAnimation(backType, adapter,
- currentTask, prevTask, currentActivity, prevActivities);
+ mAnimationHandler.prepareAnimation(
+ backType,
+ adapter,
+ currentTask,
+ prevTask,
+ currentActivity,
+ prevActivities,
+ removedWindowContainer);
mBackAnimationInProgress = builder != null;
if (mBackAnimationInProgress) {
if (removedWindowContainer.hasCommittedReparentToAnimationLeash()
@@ -739,7 +745,6 @@
mAnimationHandler.clearBackAnimateTarget();
mNavigationMonitor.stopMonitorTransition();
mWaitTransitionFinish = null;
- mBackAnimationRunning = false;
}
/**
@@ -836,6 +841,7 @@
private static final int UNKNOWN = 0;
private static final int TASK_SWITCH = 1;
private static final int ACTIVITY_SWITCH = 2;
+ private static final int DIALOG_CLOSE = 3;
private static boolean isActivitySwitch(@NonNull WindowContainer close,
@NonNull WindowContainer[] open) {
@@ -860,12 +866,18 @@
return open[0].asTask() != null && (close.asTask() != open[0].asTask());
}
+ private static boolean isDialogClose(WindowContainer close) {
+ return close.asWindowState() != null;
+ }
+
private void initiate(@NonNull WindowContainer close, @NonNull WindowContainer[] open,
@NonNull ActivityRecord[] openingActivities) {
if (isActivitySwitch(close, open)) {
mSwitchType = ACTIVITY_SWITCH;
} else if (isTaskSwitch(close, open)) {
mSwitchType = TASK_SWITCH;
+ } else if (isDialogClose(close)) {
+ mSwitchType = DIALOG_CLOSE;
} else {
mSwitchType = UNKNOWN;
return;
@@ -1173,6 +1185,7 @@
mIsOpen = isOpen;
mSwitchType = switchType;
}
+
@Override
public boolean getShowWallpaper() {
return false;
@@ -1182,7 +1195,14 @@
public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t,
int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) {
mCapturedLeash = animationLeash;
- createRemoteAnimationTarget(mIsOpen);
+ createRemoteAnimationTarget();
+ final WindowState win = mTarget.asWindowState();
+ if (win != null && mSwitchType == DIALOG_CLOSE) {
+ final Rect frame = win.getFrame();
+ final Point position = new Point();
+ win.transformFrameToSurfacePosition(frame.left, frame.top, position);
+ t.setPosition(mCapturedLeash, position.x, position.y);
+ }
}
@Override
@@ -1216,12 +1236,14 @@
}
- RemoteAnimationTarget createRemoteAnimationTarget(boolean isOpen) {
+ RemoteAnimationTarget createRemoteAnimationTarget() {
if (mAnimationTarget != null) {
return mAnimationTarget;
}
- Task t = mTarget.asTask();
- ActivityRecord r = null;
+
+ WindowState w = mTarget.asWindowState();
+ ActivityRecord r = w != null ? w.getActivityRecord() : null;
+ Task t = r != null ? r.getTask() : mTarget.asTask();
if (t == null && mTarget.asTaskFragment() != null) {
t = mTarget.asTaskFragment().getTask();
r = mTarget.asTaskFragment().getTopNonFinishingActivity();
@@ -1247,7 +1269,7 @@
} else {
insets = new Rect();
}
- final int mode = isOpen ? MODE_OPENING : MODE_CLOSING;
+ final int mode = mIsOpen ? MODE_OPENING : MODE_CLOSING;
mAnimationTarget = new RemoteAnimationTarget(t.mTaskId, mode, mCapturedLeash,
!r.fillsParent(), new Rect(),
insets, r.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top),
@@ -1261,6 +1283,9 @@
if (!mIsOpen) {
return;
}
+ if (mSwitchType == DIALOG_CLOSE) {
+ return;
+ }
final Task openTask = mSwitchType == TASK_SWITCH
? mTarget.asTask() : mSwitchType == ACTIVITY_SWITCH
? mTarget.asActivityRecord().getTask() : null;
@@ -1332,9 +1357,14 @@
}
}
- ScheduleAnimationBuilder prepareAnimation(int backType, BackAnimationAdapter adapter,
- Task currentTask, Task previousTask, ActivityRecord currentActivity,
- ArrayList<ActivityRecord> previousActivity) {
+ ScheduleAnimationBuilder prepareAnimation(
+ int backType,
+ BackAnimationAdapter adapter,
+ Task currentTask,
+ Task previousTask,
+ ActivityRecord currentActivity,
+ ArrayList<ActivityRecord> previousActivity,
+ WindowContainer removedWindowContainer) {
switch (backType) {
case BackNavigationInfo.TYPE_RETURN_TO_HOME:
return new ScheduleAnimationBuilder(backType, adapter)
@@ -1350,6 +1380,10 @@
return new ScheduleAnimationBuilder(backType, adapter)
.setComposeTarget(currentTask, previousTask)
.setIsLaunchBehind(false);
+ case BackNavigationInfo.TYPE_DIALOG_CLOSE:
+ return new ScheduleAnimationBuilder(backType, adapter)
+ .setComposeTarget(removedWindowContainer, currentActivity)
+ .setIsLaunchBehind(false);
}
return null;
}
@@ -1574,7 +1608,6 @@
if (mPendingAnimation != null) {
mPendingAnimation.run();
mPendingAnimation = null;
- mBackAnimationRunning = true;
}
}
@@ -1629,7 +1662,9 @@
} else {
proto.write(MAIN_OPEN_ACTIVITY, "");
}
- proto.write(ANIMATION_RUNNING, mBackAnimationRunning);
+ // TODO (b/268563842) Only meaningful after new test added
+ proto.write(ANIMATION_RUNNING, mAnimationHandler.mComposed
+ || mAnimationHandler.mWaitTransition);
proto.end(token);
}
}
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index 68082df..cdaab46 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND;
+import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
@@ -53,6 +54,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
+import com.android.internal.util.Preconditions;
import com.android.server.UiThread;
import com.android.server.am.PendingIntentRecord;
@@ -261,7 +263,13 @@
mIsCallingUidPersistentSystemProcess =
mCallingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;
mCallingUidHasAnyVisibleWindow = mService.hasActiveVisibleWindow(callingUid);
- if (callingUid == realCallingUid) {
+ if (realCallingUid == NO_PROCESS_UID) {
+ // no process provided
+ mRealCallingUidProcState = PROCESS_STATE_NONEXISTENT;
+ mRealCallingUidHasAnyVisibleWindow = false;
+ mRealCallerApp = null;
+ mIsRealCallingUidPersistentSystemProcess = false;
+ } else if (callingUid == realCallingUid) {
mRealCallingUidProcState = mCallingUidProcState;
mRealCallingUidHasAnyVisibleWindow = mCallingUidHasAnyVisibleWindow;
// In the PendingIntent case callerApp is not passed in, so resolve it ourselves.
@@ -293,43 +301,64 @@
return name + "[debugOnly]";
}
+ private boolean isPendingIntent() {
+ return mRealCallingUid != NO_PROCESS_UID;
+ }
+
+ private String dump(BalVerdict resultIfPiCreatorAllowsBal) {
+ Preconditions.checkState(!isPendingIntent());
+ return dump(resultIfPiCreatorAllowsBal, null);
+ }
+
private boolean callerIsRealCaller() {
return mCallingUid == mRealCallingUid;
}
private String dump(BalVerdict resultIfPiCreatorAllowsBal,
- BalVerdict resultIfPiSenderAllowsBal) {
- return " [callingPackage: " + getDebugPackageName(mCallingPackage, mCallingUid)
- + "; callingUid: " + mCallingUid
- + "; appSwitchState: " + mAppSwitchState
- + "; callingUidHasAnyVisibleWindow: " + mCallingUidHasAnyVisibleWindow
- + "; callingUidProcState: " + DebugUtils.valueToString(
- ActivityManager.class, "PROCESS_STATE_", mCallingUidProcState)
- + "; isCallingUidPersistentSystemProcess: "
- + mIsCallingUidPersistentSystemProcess
- + "; balAllowedByPiCreator: " + mBalAllowedByPiCreator
- + "; balAllowedByPiSender: " + mBalAllowedByPiSender
- + "; realCallingPackage: "
- + getDebugPackageName(mRealCallingPackage, mRealCallingUid)
- + "; realCallingUid: " + mRealCallingUid
- + "; realCallingPid: " + mRealCallingPid
- + "; realCallingUidHasAnyVisibleWindow: " + mRealCallingUidHasAnyVisibleWindow
- + "; realCallingUidProcState: " + DebugUtils.valueToString(
- ActivityManager.class, "PROCESS_STATE_", mRealCallingUidProcState)
- + "; isRealCallingUidPersistentSystemProcess: "
- + mIsRealCallingUidPersistentSystemProcess
- + "; originatingPendingIntent: " + mOriginatingPendingIntent
- + "; backgroundStartPrivileges: " + mBackgroundStartPrivileges
- + "; intent: " + mIntent
- + "; callerApp: " + mCallerApp
- + "; realCallerApp: " + mRealCallerApp
- + "; inVisibleTask: "
- + (mCallerApp != null && mCallerApp.hasActivityInVisibleTask())
- + "; realInVisibleTask: "
- + (mRealCallerApp != null && mRealCallerApp.hasActivityInVisibleTask())
- + "; resultIfPiSenderAllowsBal: " + resultIfPiSenderAllowsBal
- + "; resultIfPiCreatorAllowsBal: " + resultIfPiCreatorAllowsBal
- + "]";
+ BalVerdict resultIfPiSenderAllowsBal) {
+ StringBuilder sb = new StringBuilder(2048);
+ sb.append("[callingPackage: ")
+ .append(getDebugPackageName(mCallingPackage, mCallingUid));
+ sb.append("; callingUid: ").append(mCallingUid);
+ sb.append("; callingPid: ").append(mCallingPid);
+ sb.append("; appSwitchState: ").append(mAppSwitchState);
+ sb.append("; callingUidHasAnyVisibleWindow: ").append(mCallingUidHasAnyVisibleWindow);
+ sb.append("; callingUidProcState: ").append(DebugUtils.valueToString(
+ ActivityManager.class, "PROCESS_STATE_", mCallingUidProcState));
+ sb.append("; isCallingUidPersistentSystemProcess: ")
+ .append(mIsCallingUidPersistentSystemProcess);
+ sb.append("; balAllowedByPiCreator: ").append(mBalAllowedByPiCreator);
+ if (!isPendingIntent()) {
+ sb.append("; balAllowedByPiSender: ").append(mBalAllowedByPiSender);
+ sb.append("; realCallingPackage: ")
+ .append(getDebugPackageName(mRealCallingPackage, mRealCallingUid));
+ sb.append("; realCallingUid: ").append(mRealCallingUid);
+ sb.append("; realCallingPid: ").append(mRealCallingPid);
+ sb.append("; realCallingUidHasAnyVisibleWindow: ")
+ .append(mRealCallingUidHasAnyVisibleWindow);
+ sb.append("; realCallingUidProcState: ").append(DebugUtils.valueToString(
+ ActivityManager.class, "PROCESS_STATE_", mRealCallingUidProcState));
+ sb.append("; isRealCallingUidPersistentSystemProcess: ")
+ .append(mIsRealCallingUidPersistentSystemProcess);
+ }
+ sb.append("; originatingPendingIntent: ").append(mOriginatingPendingIntent);
+ sb.append("; backgroundStartPrivileges: ").append(mBackgroundStartPrivileges);
+ sb.append("; intent: ").append(mIntent);
+ sb.append("; callerApp: ").append(mCallerApp);
+ sb.append("; realCallerApp: ").append(mRealCallerApp);
+ if (mCallerApp != null) {
+ sb.append("; inVisibleTask: ").append(mCallerApp.hasActivityInVisibleTask());
+ }
+ if (!isPendingIntent()) {
+ if (mRealCallerApp != null) {
+ sb.append("; realInVisibleTask: ")
+ .append(mRealCallerApp.hasActivityInVisibleTask());
+ }
+ sb.append("; resultIfPiSenderAllowsBal: ").append(resultIfPiSenderAllowsBal);
+ }
+ sb.append("; resultIfPiCreatorAllowsBal: ").append(resultIfPiCreatorAllowsBal);
+ sb.append("]");
+ return sb.toString();
}
}
@@ -428,9 +457,31 @@
}
BalVerdict resultForCaller = checkBackgroundActivityStartAllowedByCaller(state);
+
+ if (!state.isPendingIntent()) {
+ if (resultForCaller.allows()) {
+ if (DEBUG_ACTIVITY_STARTS) {
+ Slog.d(TAG, "Background activity start allowed. "
+ + state.dump(resultForCaller));
+ }
+ return statsLog(resultForCaller, state);
+ }
+ // anything that has fallen through would currently be aborted
+ Slog.w(TAG, "Background activity launch blocked! "
+ + state.dump(resultForCaller));
+ showBalToast("BAL blocked", state);
+ return statsLog(BalVerdict.BLOCK, state);
+ }
+
+ // The realCaller result is only calculated for PendingIntents (indicated by a valid
+ // realCallingUid). If caller and realCaller are same UID and we are already allowed based
+ // on the caller (i.e. creator of the PendingIntent) there is no need to calculate this
+ // again, but if the result is block it is possible that there are additional exceptions
+ // that allow based on the realCaller (i.e. sender of the PendingIntent), e.g. if the
+ // realCallerApp process is allowed to start (in the creator path the callerApp for
+ // PendingIntents is null).
BalVerdict resultForRealCaller = state.callerIsRealCaller() && resultForCaller.allows()
- ? resultForCaller // no need to calculate again
- // otherwise we might need to recalculate because the logic is not the same
+ ? resultForCaller
: checkBackgroundActivityStartAllowedBySender(state, checkedOptions);
if (resultForCaller.allows()
@@ -493,26 +544,10 @@
+ state.dump(resultForCaller, resultForRealCaller));
// fall through
}
- showBalToast("BAL blocked", state);
// anything that has fallen through would currently be aborted
- Slog.w(TAG, "Background activity launch blocked"
+ Slog.w(TAG, "Background activity launch blocked! "
+ state.dump(resultForCaller, resultForRealCaller));
- // log aborted activity start to TRON
- if (mService.isActivityStartsLoggingEnabled()) {
- mSupervisor
- .getActivityMetricsLogger()
- .logAbortedBgActivityStart(
- intent,
- callerApp,
- callingUid,
- callingPackage,
- state.mCallingUidProcState,
- state.mCallingUidHasAnyVisibleWindow,
- realCallingUid,
- state.mRealCallingUidProcState,
- state.mRealCallingUidHasAnyVisibleWindow,
- (originatingPendingIntent != null));
- }
+ showBalToast("BAL blocked", state);
return statsLog(BalVerdict.BLOCK, state);
}
@@ -1239,7 +1274,24 @@
/* defaultValue= */ true);
}
- private static BalVerdict statsLog(BalVerdict finalVerdict, BalState state) {
+ private BalVerdict statsLog(BalVerdict finalVerdict, BalState state) {
+ if (finalVerdict.blocks() && mService.isActivityStartsLoggingEnabled()) {
+ // log aborted activity start to TRON
+ mSupervisor
+ .getActivityMetricsLogger()
+ .logAbortedBgActivityStart(
+ state.mIntent,
+ state.mCallerApp,
+ state.mCallingUid,
+ state.mCallingPackage,
+ state.mCallingUidProcState,
+ state.mCallingUidHasAnyVisibleWindow,
+ state.mRealCallingUid,
+ state.mRealCallingUidProcState,
+ state.mRealCallingUidHasAnyVisibleWindow,
+ (state.mOriginatingPendingIntent != null));
+ }
+
@BalCode int code = finalVerdict.getCode();
int callingUid = state.mCallingUid;
int realCallingUid = state.mRealCallingUid;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c716879..7f80807 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -2436,13 +2436,14 @@
// AppBounds at the root level should mirror the app screen size.
outConfig.windowConfiguration.setAppBounds(info.mNonDecorFrame);
outConfig.windowConfiguration.setRotation(rotation);
- outConfig.orientation = (dw <= dh) ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
final float density = mDisplayMetrics.density;
outConfig.screenWidthDp = (int) (info.mConfigFrame.width() / density + 0.5f);
outConfig.screenHeightDp = (int) (info.mConfigFrame.height() / density + 0.5f);
outConfig.compatScreenWidthDp = (int) (outConfig.screenWidthDp / mCompatibleScreenScale);
outConfig.compatScreenHeightDp = (int) (outConfig.screenHeightDp / mCompatibleScreenScale);
+ outConfig.orientation = (outConfig.screenWidthDp <= outConfig.screenHeightDp)
+ ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
outConfig.screenLayout = computeScreenLayout(
Configuration.resetScreenLayout(outConfig.screenLayout),
outConfig.screenWidthDp, outConfig.screenHeightDp);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index 367e14b..1c8e949 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -2008,6 +2008,33 @@
}
@Test
+ public void testReplacePending_sameProcess_diffReceivers() throws Exception {
+ final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
+ final ProcessRecord receiverGreenApp = makeActiveProcessRecord(PACKAGE_GREEN);
+ final BroadcastFilter receiverGreenA = makeRegisteredReceiver(receiverGreenApp);
+ final BroadcastFilter receiverGreenB = makeRegisteredReceiver(receiverGreenApp);
+
+ final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
+ .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverGreenA, 5))));
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverGreenB, 10),
+ withPriority(receiverGreenA, 5))));
+
+ waitForIdle();
+ if (mImpl == Impl.DEFAULT) {
+ verifyScheduleRegisteredReceiver(times(2), receiverGreenApp, airplane);
+ } else {
+ // In the modern queue, we don't end up replacing the old broadcast to
+ // avoid creating priority inversion and so the process will receive
+ // both the old and new broadcasts.
+ verifyScheduleRegisteredReceiver(times(3), receiverGreenApp, airplane);
+ }
+ }
+
+ @Test
public void testIdleAndBarrier() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/idle/DeviceIdlenessTrackerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/idle/DeviceIdlenessTrackerTest.java
index 09935f2..0a56c45 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/idle/DeviceIdlenessTrackerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/idle/DeviceIdlenessTrackerTest.java
@@ -163,6 +163,77 @@
}
@Test
+ public void testAlarmSkippedIfAlreadyIdle() {
+ setDeviceConfigLong(KEY_INACTIVITY_IDLE_THRESHOLD_MS, MINUTE_IN_MILLIS);
+ setDeviceConfigLong(KEY_INACTIVITY_STABLE_POWER_IDLE_THRESHOLD_MS, 5 * MINUTE_IN_MILLIS);
+ setBatteryState(false, false);
+
+ Intent dockIdleIntent = new Intent(Intent.ACTION_DOCK_IDLE);
+ mBroadcastReceiver.onReceive(mContext, dockIdleIntent);
+
+ final long nowElapsed = sElapsedRealtimeClock.millis();
+ long expectedAlarmElapsed = nowElapsed + MINUTE_IN_MILLIS;
+
+ ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerCaptor =
+ ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+
+ InOrder inOrder = inOrder(mAlarmManager);
+ inOrder.verify(mAlarmManager)
+ .setWindow(anyInt(), eq(expectedAlarmElapsed), anyLong(), anyString(),
+ eq(AppSchedulingModuleThread.getExecutor()),
+ onAlarmListenerCaptor.capture());
+
+ AlarmManager.OnAlarmListener onAlarmListener = onAlarmListenerCaptor.getValue();
+
+ advanceElapsedClock(MINUTE_IN_MILLIS);
+
+ onAlarmListener.onAlarm();
+
+ // Now in idle.
+
+ // Trigger SCREEN_OFF. Make sure alarm isn't set again.
+ Intent screenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
+ mBroadcastReceiver.onReceive(mContext, screenOffIntent);
+
+ inOrder.verify(mAlarmManager, never())
+ .setWindow(anyInt(), anyLong(), anyLong(), anyString(),
+ eq(AppSchedulingModuleThread.getExecutor()), any());
+ }
+
+ @Test
+ public void testAlarmSkippedIfNoThresholdChange() {
+ setDeviceConfigLong(KEY_INACTIVITY_IDLE_THRESHOLD_MS, 10 * MINUTE_IN_MILLIS);
+ setDeviceConfigLong(KEY_INACTIVITY_STABLE_POWER_IDLE_THRESHOLD_MS, 10 * MINUTE_IN_MILLIS);
+ setBatteryState(false, false);
+
+ Intent screenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
+ mBroadcastReceiver.onReceive(mContext, screenOffIntent);
+
+ final long nowElapsed = sElapsedRealtimeClock.millis();
+ long expectedAlarmElapsed = nowElapsed + 10 * MINUTE_IN_MILLIS;
+
+ InOrder inOrder = inOrder(mAlarmManager);
+ inOrder.verify(mAlarmManager)
+ .setWindow(anyInt(), eq(expectedAlarmElapsed), anyLong(), anyString(),
+ eq(AppSchedulingModuleThread.getExecutor()), any());
+
+ // Advanced the clock a little to make sure the tracker continues to use the original time.
+ advanceElapsedClock(MINUTE_IN_MILLIS);
+
+ // Now on stable power. Thresholds are the same, so alarm doesn't need to be rescheduled.
+ setBatteryState(true, true);
+ inOrder.verify(mAlarmManager, never())
+ .setWindow(anyInt(), eq(expectedAlarmElapsed), anyLong(), anyString(),
+ eq(AppSchedulingModuleThread.getExecutor()), any());
+
+ // Not on stable power. Thresholds are the same, so alarm doesn't need to be rescheduled.
+ setBatteryState(false, false);
+ inOrder.verify(mAlarmManager, never())
+ .setWindow(anyInt(), anyLong(), anyLong(), anyString(),
+ eq(AppSchedulingModuleThread.getExecutor()), any());
+ }
+
+ @Test
public void testThresholdChangeWithStablePowerChange() {
setDeviceConfigLong(KEY_INACTIVITY_IDLE_THRESHOLD_MS, 10 * MINUTE_IN_MILLIS);
setDeviceConfigLong(KEY_INACTIVITY_STABLE_POWER_IDLE_THRESHOLD_MS, 5 * MINUTE_IN_MILLIS);
diff --git a/services/tests/powerservicetests/Android.bp b/services/tests/powerservicetests/Android.bp
index 7351fc5f..8d455fe 100644
--- a/services/tests/powerservicetests/Android.bp
+++ b/services/tests/powerservicetests/Android.bp
@@ -11,6 +11,7 @@
],
static_libs: [
+ "flag-junit",
"frameworks-base-testutils",
"platform-compat-test-rules",
"platform-test-annotations",
diff --git a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
index 8e1d8ab..d752ae4 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -26,6 +26,8 @@
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
+import static com.android.server.deviceidle.Flags.FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
@@ -82,6 +84,7 @@
import android.os.PowerSaveState;
import android.os.UserHandle;
import android.os.test.TestLooper;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.service.dreams.DreamManagerInternal;
@@ -175,6 +178,8 @@
@Rule public TestRule compatChangeRule = new PlatformCompatChangeRule();
+ @Rule public SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
private PowerManagerService mService;
private ContextWrapper mContextSpy;
private BatteryReceiver mBatteryReceiver;
@@ -2567,6 +2572,58 @@
}
@Test
+ public void testDisableWakelocksInLightDeviceIdle_FlagDisabled_BgApp() {
+ mSetFlagsRule.disableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE);
+ createService();
+ startSystem();
+ WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
+ mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_RECEIVER);
+ mService.setDeviceIdleModeInternal(false);
+ mService.setLightDeviceIdleModeInternal(true);
+
+ assertThat(wakeLock.mDisabled).isFalse();
+ }
+
+ @Test
+ public void testDisableWakelocksInLightDeviceIdle_FlagDisabled_FgApp() {
+ mSetFlagsRule.disableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE);
+ createService();
+ startSystem();
+ WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
+ mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mService.setDeviceIdleModeInternal(false);
+ mService.setLightDeviceIdleModeInternal(true);
+
+ assertThat(wakeLock.mDisabled).isFalse();
+ }
+
+ @Test
+ public void testDisableWakelocksInLightDeviceIdle_FlagEnabled_BgApp() {
+ mSetFlagsRule.enableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE);
+ createService();
+ startSystem();
+ WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
+ mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_RECEIVER);
+ mService.setDeviceIdleModeInternal(false);
+ mService.setLightDeviceIdleModeInternal(true);
+
+ assertThat(wakeLock.mDisabled).isTrue();
+ }
+
+ @Test
+ public void testDisableWakelocksInLightDeviceIdle_FlagEnabled_FgApp() {
+ mSetFlagsRule.enableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE);
+ createService();
+ startSystem();
+ WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
+ mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mService.setDeviceIdleModeInternal(false);
+ mService.setLightDeviceIdleModeInternal(true);
+
+ assertThat(wakeLock.mDisabled).isFalse();
+ }
+
+ @Test
public void testLowPowerStandby_whenInactive_FgsWakeLockEnabled() {
createService();
startSystem();
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
index 7b1fa03..6790dc2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
@@ -21,6 +21,7 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.window.BackNavigationInfo.typeToString;
@@ -227,6 +228,20 @@
}
@Test
+ public void backTypeDialogCloseWhenBackFromDialog() {
+ DialogCloseTestCase testCase = createTopTaskWithActivityAndDialog();
+ IOnBackInvokedCallback callback = withSystemCallback(testCase.task);
+
+ BackNavigationInfo backNavigationInfo = startBackNavigation();
+ assertWithMessage("BackNavigationInfo").that(backNavigationInfo).isNotNull();
+ assertThat(backNavigationInfo.getOnBackInvokedCallback()).isEqualTo(callback);
+ assertThat(typeToString(backNavigationInfo.getType()))
+ .isEqualTo(typeToString(BackNavigationInfo.TYPE_DIALOG_CLOSE));
+ // verify if back animation would start.
+ assertTrue("Animation scheduled", backNavigationInfo.isPrepareRemoteAnimation());
+ }
+
+ @Test
public void backInfoWithNullWindow() {
BackNavigationInfo backNavigationInfo = startBackNavigation();
assertThat(backNavigationInfo).isNull();
@@ -605,8 +620,14 @@
final ArrayList<ActivityRecord> openActivities = new ArrayList<>();
openActivities.add(homeActivity);
final BackNavigationController.AnimationHandler.ScheduleAnimationBuilder toHomeBuilder =
- animationHandler.prepareAnimation(BackNavigationInfo.TYPE_RETURN_TO_HOME,
- mBackAnimationAdapter, task, mRootHomeTask, bottomActivity, openActivities);
+ animationHandler.prepareAnimation(
+ BackNavigationInfo.TYPE_RETURN_TO_HOME,
+ mBackAnimationAdapter,
+ task,
+ mRootHomeTask,
+ bottomActivity,
+ openActivities,
+ task);
assertTrue(toHomeBuilder.mIsLaunchBehind);
toHomeBuilder.build();
verify(mAtm.mTaskOrganizerController, never()).addWindowlessStartingSurface(
@@ -619,8 +640,13 @@
openActivities.add(bottomActivity);
final BackNavigationController.AnimationHandler.ScheduleAnimationBuilder toActivityBuilder =
animationHandler.prepareAnimation(
- BackNavigationInfo.TYPE_CROSS_ACTIVITY, mBackAnimationAdapter, task, task,
- topActivity, openActivities);
+ BackNavigationInfo.TYPE_CROSS_ACTIVITY,
+ mBackAnimationAdapter,
+ task,
+ task,
+ topActivity,
+ openActivities,
+ topActivity);
assertFalse(toActivityBuilder.mIsLaunchBehind);
toActivityBuilder.build();
if (preferWindowlessSurface) {
@@ -649,6 +675,31 @@
}
@NonNull
+ private DialogCloseTestCase createTopTaskWithActivityAndDialog() {
+ Task task = createTask(mDefaultDisplay);
+ ActivityRecord record = createActivityRecord(task);
+ // enable OnBackInvokedCallbacks
+ record.info.applicationInfo.privateFlagsExt |=
+ PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK;
+ WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, record, "window");
+ WindowState dialog = createWindow(null, TYPE_APPLICATION, record, "dialog");
+ when(record.mSurfaceControl.isValid()).thenReturn(true);
+ Mockito.doNothing().when(task).reparentSurfaceControl(any(), any());
+ mAtm.setFocusedTask(task.mTaskId, record);
+ addToWindowMap(window, true);
+ addToWindowMap(dialog, true);
+
+ makeWindowVisibleAndDrawn(dialog);
+
+ DialogCloseTestCase testCase = new DialogCloseTestCase();
+ testCase.task = task;
+ testCase.record = record;
+ testCase.windowBack = window;
+ testCase.windowFront = dialog;
+ return testCase;
+ }
+
+ @NonNull
private CrossActivityTestCase createTopTaskWithTwoActivities() {
Task task = createTask(mDefaultDisplay);
ActivityRecord record1 = createActivityRecord(task);
@@ -696,4 +747,11 @@
public ActivityRecord recordFront;
public WindowState windowFront;
}
+
+ private class DialogCloseTestCase {
+ public Task task;
+ public ActivityRecord record;
+ public WindowState windowBack;
+ public WindowState windowFront;
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 6d67c8b..5b88c8c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -970,6 +970,13 @@
assertEquals(
"Screen orientation must be defined by the window even on close-to-square display.",
window.mAttrs.screenOrientation, dc.getOrientation());
+
+ // Assume that a decor window occupies the display height, so the configuration orientation
+ // should be landscape.
+ dc.getDisplayPolicy().getDecorInsetsInfo(ROTATION_0, dc.mBaseDisplayHeight,
+ dc.mBaseDisplayWidth).mConfigFrame.set(0, 0, 1000, 990);
+ dc.computeScreenConfiguration(config, ROTATION_0);
+ assertEquals(Configuration.ORIENTATION_LANDSCAPE, config.orientation);
}
@Test
diff --git a/tools/hoststubgen/hoststubgen/Android.bp b/tools/hoststubgen/hoststubgen/Android.bp
index 226e2fad..182940e 100644
--- a/tools/hoststubgen/hoststubgen/Android.bp
+++ b/tools/hoststubgen/hoststubgen/Android.bp
@@ -12,6 +12,7 @@
name: "hoststubgen-for-prototype-only-genrule",
visibility: [
":__subpackages__",
+ "//frameworks/base",
"//frameworks/base/ravenwood:__subpackages__",
],
}
@@ -21,6 +22,7 @@
name: "hoststubgen-for-prototype-only-java",
visibility: [
":__subpackages__",
+ "//frameworks/base",
"//frameworks/base/ravenwood:__subpackages__",
],
}
@@ -30,6 +32,7 @@
name: "hoststubgen-for-prototype-only-filegroup",
visibility: [
":__subpackages__",
+ "//frameworks/base",
"//frameworks/base/ravenwood:__subpackages__",
],
}
@@ -44,8 +47,6 @@
],
host_supported: true,
- // Seems like we need it to avoid circular deps.
- // Copied it from "app-compat-annotations".
sdk_version: "core_current",
}
@@ -66,6 +67,21 @@
visibility: ["//visibility:public"],
}
+java_library {
+ name: "hoststubgen-helper-runtime.ravenwood",
+ srcs: [
+ "helper-runtime-src/**/*.java",
+ ],
+ libs: [
+ "junit",
+ ],
+ static_libs: [
+ "guava",
+ ],
+ jarjar_rules: "jarjar-rules.txt",
+ visibility: ["//visibility:public"],
+}
+
// Host-side stub generator tool.
java_binary_host {
name: "hoststubgen",
@@ -73,6 +89,7 @@
srcs: ["src/**/*.kt"],
static_libs: [
"hoststubgen-helper-runtime",
+ "junit",
"ow2-asm",
"ow2-asm-analysis",
"ow2-asm-commons",
@@ -245,6 +262,18 @@
],
}
+java_library {
+ name: "hoststubgen-helper-framework-runtime.ravenwood",
+ defaults: ["hoststubgen-for-prototype-only-java"],
+ srcs: [
+ "helper-framework-runtime-src/framework/**/*.java",
+ ],
+ libs: [
+ "hoststubgen-helper-runtime.ravenwood",
+ "framework-minus-apex.ravenwood",
+ ],
+}
+
// Defaults for host side test modules.
// We need two rules for each test.
// 1. A "-test-lib" jar, which compiles the test against the stub jar.
diff --git a/tools/hoststubgen/hoststubgen/annotations-src/android/hosttest/annotation/HostSideTestStaticInitializerStub.java b/tools/hoststubgen/hoststubgen/annotations-src/android/hosttest/annotation/HostSideTestStaticInitializerStub.java
new file mode 100644
index 0000000..dab8e89
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/annotations-src/android/hosttest/annotation/HostSideTestStaticInitializerStub.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 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.hosttest.annotation;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
+ * QUESTIONS ABOUT IT.
+ *
+ * @hide
+ */
+@Target({TYPE, FIELD, METHOD, CONSTRUCTOR})
+@Retention(RetentionPolicy.CLASS)
+public @interface HostSideTestStaticInitializerStub {
+}
diff --git a/tools/hoststubgen/hoststubgen/framework-policy-override.txt b/tools/hoststubgen/hoststubgen/framework-policy-override.txt
index 295498d..ff0fe32 100644
--- a/tools/hoststubgen/hoststubgen/framework-policy-override.txt
+++ b/tools/hoststubgen/hoststubgen/framework-policy-override.txt
@@ -62,6 +62,7 @@
# Used by ArrayMap. No need to put them in the stub, but we need them in impl.
class android.util.MapCollections keepclass
class android.util.ContainerHelpers keepclass
+class android.util.EmptyArray stubclass
class com.android.internal.util.XmlUtils keepclass
class com.android.internal.util.FastMath keepclass
class android.util.MathUtils keepclass
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
index 9f83597..25abbac 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
@@ -23,6 +23,8 @@
import javax.annotation.concurrent.GuardedBy;
+import org.junit.AssumptionViolatedException;
+
/**
* Utilities used in the host side test environment.
*/
@@ -63,7 +65,7 @@
*/
public static void onThrowMethodCalled() {
// TODO: Maybe add call tracking?
- throw new RuntimeException("This method is not supported on the host side");
+ throw new AssumptionViolatedException("This method is not supported on the host side");
}
/**
diff --git a/tools/hoststubgen/hoststubgen/hoststubgen-standard-options.txt b/tools/hoststubgen/hoststubgen/hoststubgen-standard-options.txt
index 3f87527..43f9cb9b 100644
--- a/tools/hoststubgen/hoststubgen/hoststubgen-standard-options.txt
+++ b/tools/hoststubgen/hoststubgen/hoststubgen-standard-options.txt
@@ -39,3 +39,6 @@
--class-load-hook-annotation
android.hosttest.annotation.HostSideTestClassLoadHook
+
+--stub-static-initializer-annotation
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
index 7531759..872d568 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
@@ -17,9 +17,9 @@
import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.filters.AnnotationBasedFilter
-import com.android.hoststubgen.filters.DefaultHookInjectingFilter
import com.android.hoststubgen.filters.ClassWidePolicyPropagatingFilter
import com.android.hoststubgen.filters.ConstantFilter
+import com.android.hoststubgen.filters.DefaultHookInjectingFilter
import com.android.hoststubgen.filters.FilterPolicy
import com.android.hoststubgen.filters.ImplicitOutputFilter
import com.android.hoststubgen.filters.KeepAllClassesFilter
@@ -28,6 +28,7 @@
import com.android.hoststubgen.filters.createFilterFromTextPolicyFile
import com.android.hoststubgen.filters.printAsTextPolicy
import com.android.hoststubgen.visitors.BaseAdapter
+import com.android.hoststubgen.visitors.PackageRedirectRemapper
import org.objectweb.asm.ClassReader
import org.objectweb.asm.ClassVisitor
import org.objectweb.asm.ClassWriter
@@ -179,6 +180,7 @@
options.substituteAnnotations,
options.nativeSubstituteAnnotations,
options.classLoadHookAnnotations,
+ options.stubStaticInitializerAnnotations,
filter
)
@@ -237,6 +239,8 @@
val start = System.currentTimeMillis()
+ val packageRedirector = PackageRedirectRemapper(options.packageRedirects)
+
log.withIndent {
// Open the input jar file and process each entry.
ZipFile(inJar).use { inZip ->
@@ -246,7 +250,7 @@
while (inEntries.hasMoreElements()) {
val entry = inEntries.nextElement()
convertSingleEntry(inZip, entry, stubOutStream, implOutStream,
- filter, enableChecker, classes, errors)
+ filter, packageRedirector, enableChecker, classes, errors)
}
log.i("Converted all entries.")
}
@@ -268,6 +272,7 @@
stubOutStream: ZipOutputStream,
implOutStream: ZipOutputStream,
filter: OutputFilter,
+ packageRedirector: PackageRedirectRemapper,
enableChecker: Boolean,
classes: ClassNodes,
errors: HostStubGenErrors,
@@ -284,7 +289,7 @@
// If it's a class, convert it.
if (name.endsWith(".class")) {
processSingleClass(inZip, entry, stubOutStream, implOutStream, filter,
- enableChecker, classes, errors)
+ packageRedirector, enableChecker, classes, errors)
return
}
@@ -334,37 +339,40 @@
stubOutStream: ZipOutputStream,
implOutStream: ZipOutputStream,
filter: OutputFilter,
+ packageRedirector: PackageRedirectRemapper,
enableChecker: Boolean,
classes: ClassNodes,
errors: HostStubGenErrors,
) {
- val className = entry.name.replaceFirst("\\.class$".toRegex(), "")
- val classPolicy = filter.getPolicyForClass(className)
+ val classInternalName = entry.name.replaceFirst("\\.class$".toRegex(), "")
+ val classPolicy = filter.getPolicyForClass(classInternalName)
if (classPolicy.policy == FilterPolicy.Remove) {
- log.d("Removing class: %s %s", className, classPolicy)
+ log.d("Removing class: %s %s", classInternalName, classPolicy)
return
}
// Generate stub first.
if (classPolicy.policy.needsInStub) {
- log.v("Creating stub class: %s Policy: %s", className, classPolicy)
+ log.v("Creating stub class: %s Policy: %s", classInternalName, classPolicy)
log.withIndent {
BufferedInputStream(inZip.getInputStream(entry)).use { bis ->
val newEntry = ZipEntry(entry.name)
stubOutStream.putNextEntry(newEntry)
- convertClass(/*forImpl=*/false, bis, stubOutStream, filter, enableChecker,
- classes, errors)
+ convertClass(classInternalName, /*forImpl=*/false, bis,
+ stubOutStream, filter, packageRedirector, enableChecker, classes,
+ errors)
stubOutStream.closeEntry()
}
}
}
- log.v("Creating impl class: %s Policy: %s", className, classPolicy)
+ log.v("Creating impl class: %s Policy: %s", classInternalName, classPolicy)
if (classPolicy.policy.needsInImpl) {
log.withIndent {
BufferedInputStream(inZip.getInputStream(entry)).use { bis ->
val newEntry = ZipEntry(entry.name)
implOutStream.putNextEntry(newEntry)
- convertClass(/*forImpl=*/true, bis, implOutStream, filter, enableChecker,
- classes, errors)
+ convertClass(classInternalName, /*forImpl=*/true, bis,
+ implOutStream, filter, packageRedirector, enableChecker, classes,
+ errors)
implOutStream.closeEntry()
}
}
@@ -375,14 +383,16 @@
* Convert a single class to either "stub" or "impl".
*/
private fun convertClass(
- forImpl: Boolean,
- input: InputStream,
- out: OutputStream,
- filter: OutputFilter,
- enableChecker: Boolean,
- classes: ClassNodes,
- errors: HostStubGenErrors,
- ) {
+ classInternalName: String,
+ forImpl: Boolean,
+ input: InputStream,
+ out: OutputStream,
+ filter: OutputFilter,
+ packageRedirector: PackageRedirectRemapper,
+ enableChecker: Boolean,
+ classes: ClassNodes,
+ errors: HostStubGenErrors,
+ ) {
val cr = ClassReader(input)
// COMPUTE_FRAMES wouldn't be happy if code uses
@@ -397,11 +407,11 @@
val visitorOptions = BaseAdapter.Options(
enablePreTrace = options.enablePreTrace,
enablePostTrace = options.enablePostTrace,
- enableMethodLogging = options.enablePreTrace,
enableNonStubMethodCallDetection = options.enableNonStubMethodCallDetection,
errors = errors,
)
- outVisitor = BaseAdapter.getVisitor(classes, outVisitor, filter, forImpl, visitorOptions)
+ outVisitor = BaseAdapter.getVisitor(classInternalName, classes, outVisitor, filter,
+ packageRedirector, forImpl, visitorOptions)
cr.accept(outVisitor, ClassReader.EXPAND_FRAMES)
val data = cw.toByteArray()
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
index bbb7dab..d74612d 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
@@ -47,6 +47,9 @@
var substituteAnnotations: MutableSet<String> = mutableSetOf(),
var nativeSubstituteAnnotations: MutableSet<String> = mutableSetOf(),
var classLoadHookAnnotations: MutableSet<String> = mutableSetOf(),
+ var stubStaticInitializerAnnotations: MutableSet<String> = mutableSetOf(),
+
+ var packageRedirects: MutableList<Pair<String, String>> = mutableListOf(),
var defaultClassLoadHook: String? = null,
var defaultMethodCallHook: String? = null,
@@ -77,6 +80,15 @@
return this
}
+ private fun parsePackageRedirect(fromColonTo: String): Pair<String, String> {
+ val colon = fromColonTo.indexOf(':')
+ if ((colon < 1) || (colon + 1 >= fromColonTo.length)) {
+ throw ArgumentsException("--package-redirect must be a colon-separated string")
+ }
+ // TODO check for duplicates
+ return Pair(fromColonTo.substring(0, colon), fromColonTo.substring(colon + 1))
+ }
+
fun parseArgs(args: Array<String>): HostStubGenOptions {
val ret = HostStubGenOptions()
@@ -150,7 +162,14 @@
"--class-load-hook-annotation" ->
ret.classLoadHookAnnotations +=
- ensureUniqueAnnotation(ai.nextArgRequired(arg))
+ ensureUniqueAnnotation(ai.nextArgRequired(arg))
+
+ "--stub-static-initializer-annotation" ->
+ ret.stubStaticInitializerAnnotations +=
+ ensureUniqueAnnotation(ai.nextArgRequired(arg))
+
+ "--package-redirect" ->
+ ret.packageRedirects += parsePackageRedirect(ai.nextArgRequired(arg))
"--default-class-load-hook" ->
ret.defaultClassLoadHook = ai.nextArgRequired(arg)
@@ -294,6 +313,7 @@
substituteAnnotations=$substituteAnnotations,
nativeSubstituteAnnotations=$nativeSubstituteAnnotations,
classLoadHookAnnotations=$classLoadHookAnnotations,
+ packageRedirects=$packageRedirects,
defaultClassLoadHook=$defaultClassLoadHook,
defaultMethodCallHook=$defaultMethodCallHook,
intersectStubJars=$intersectStubJars,
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AnnotationBasedFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AnnotationBasedFilter.kt
index 3f492e8..9f3ec4d 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AnnotationBasedFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AnnotationBasedFilter.kt
@@ -20,6 +20,8 @@
import com.android.hoststubgen.HostStubGenInternalException
import com.android.hoststubgen.InvalidAnnotationException
import com.android.hoststubgen.addNonNullElement
+import com.android.hoststubgen.asm.CLASS_INITIALIZER_DESC
+import com.android.hoststubgen.asm.CLASS_INITIALIZER_NAME
import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.findAnnotationValueAsString
import com.android.hoststubgen.asm.findAnyAnnotation
@@ -48,6 +50,7 @@
substituteAnnotations_: Set<String>,
nativeSubstituteAnnotations_: Set<String>,
classLoadHookAnnotations_: Set<String>,
+ stubStaticInitializerAnnotations_: Set<String>,
fallback: OutputFilter,
) : DelegatingFilter(fallback) {
private var stubAnnotations = convertToInternalNames(stubAnnotations_)
@@ -59,6 +62,7 @@
private var substituteAnnotations = convertToInternalNames(substituteAnnotations_)
private var nativeSubstituteAnnotations = convertToInternalNames(nativeSubstituteAnnotations_)
private var classLoadHookAnnotations = convertToInternalNames(classLoadHookAnnotations_)
+ private var stubStaticInitializerAnnotations = convertToInternalNames(stubStaticInitializerAnnotations_)
/** Annotations that control API visibility. */
private var visibilityAnnotations: Set<String> = convertToInternalNames(
@@ -158,6 +162,7 @@
findAnyAnnotation(removeAnnotations, visibles, invisibles)?.let {
return FilterPolicy.Remove.withReason(reasonAnnotation)
}
+
return null
}
@@ -208,6 +213,13 @@
): FilterPolicyWithReason {
val cn = classes.getClass(className)
+ if (methodName == CLASS_INITIALIZER_NAME && descriptor == CLASS_INITIALIZER_DESC) {
+ findAnyAnnotation(stubStaticInitializerAnnotations,
+ cn.visibleAnnotations, cn.invisibleAnnotations)?.let {
+ return FilterPolicy.Stub.withReason(reasonAnnotation)
+ }
+ }
+
cn.methods?.firstOrNull { it.name == methodName && it.desc == descriptor }?.let { mn ->
// @SubstituteWith is going to complicate the policy here, so we ask helper
// what to do.
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicy.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicy.kt
index f11ac2f..9317996 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicy.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicy.kt
@@ -56,6 +56,12 @@
Throw,
/**
+ * Only usable with methods. The item will be kept in the impl jar file, but when called,
+ * it'll no-op. Currently only supported for methods returning `void`.
+ */
+ Ignore,
+
+ /**
* Remove the item completely.
*/
Remove;
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
index c6334c4..07a023c 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
@@ -23,6 +23,7 @@
import com.android.hoststubgen.log
import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.isVisibilityPrivateOrPackagePrivate
+import org.objectweb.asm.tree.ClassNode
/**
* Filter implementing "implicit" rules, such as:
@@ -35,10 +36,7 @@
private val classes: ClassNodes,
fallback: OutputFilter
) : DelegatingFilter(fallback) {
- private fun getClassImplicitPolicy(className: String): FilterPolicyWithReason? {
- // TODO: This check should be cached.
- val cn = classes.getClass(className)
-
+ private fun getClassImplicitPolicy(className: String, cn: ClassNode): FilterPolicyWithReason? {
if (isAnonymousInnerClass(cn)) {
log.forDebug {
// log.d(" anon-inner class: ${className} outer: ${cn.outerClass} ")
@@ -57,10 +55,24 @@
}
override fun getPolicyForClass(className: String): FilterPolicyWithReason {
- // Use the implicit policy, if any.
- getClassImplicitPolicy(className)?.let { return it }
+ val fallback = super.getPolicyForClass(className)
- return super.getPolicyForClass(className)
+ // TODO: This check should be cached.
+ val cn = classes.getClass(className)
+
+ if (cn.superName == "java/lang/Enum" &&
+ fallback.policy == FilterPolicy.Keep) {
+ return FilterPolicy.KeepClass.withReason("enum")
+ }
+ if (cn.interfaces.contains("java/lang/annotation/Annotation") &&
+ fallback.policy == FilterPolicy.Keep) {
+ return FilterPolicy.KeepClass.withReason("annotation")
+ }
+
+ // Use the implicit policy, if any.
+ getClassImplicitPolicy(className, cn)?.let { return it }
+
+ return fallback
}
override fun getPolicyForMethod(
@@ -86,10 +98,10 @@
// If we throw from the static initializer, the class would be useless, so we convert it
// "keep" instead.
if (methodName == CLASS_INITIALIZER_NAME && descriptor == CLASS_INITIALIZER_DESC &&
- fallback.policy == FilterPolicy.Throw) {
+ fallback.policy == FilterPolicy.Throw) {
// TODO Maybe show a warning?? But that'd be too noisy with --default-throw.
- return FilterPolicy.Keep.withReason(
- "'throw' on static initializer is handled as 'keep'" +
+ return FilterPolicy.Ignore.withReason(
+ "'throw' on static initializer is handled as 'ignore'" +
" [original throw reason: ${fallback.reason}]")
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
index 3cf9a1d..f25e862 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
@@ -30,6 +30,7 @@
import org.objectweb.asm.FieldVisitor
import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes
+import org.objectweb.asm.commons.ClassRemapper
import org.objectweb.asm.util.TraceClassVisitor
import java.io.PrintWriter
@@ -49,9 +50,8 @@
val errors: HostStubGenErrors,
val enablePreTrace: Boolean,
val enablePostTrace: Boolean,
- val enableMethodLogging: Boolean,
val enableNonStubMethodCallDetection: Boolean,
- )
+ )
protected lateinit var currentPackageName: String
protected lateinit var currentClassName: String
@@ -219,9 +219,11 @@
companion object {
fun getVisitor(
+ classInternalName: String,
classes: ClassNodes,
nextVisitor: ClassVisitor,
filter: OutputFilter,
+ packageRedirector: PackageRedirectRemapper,
forImpl: Boolean,
options: Options,
): ClassVisitor {
@@ -229,12 +231,27 @@
val verbosePrinter = PrintWriter(log.getVerbosePrintStream())
- // TODO: This doesn't work yet.
-
// Inject TraceClassVisitor for debugging.
if (options.enablePostTrace) {
next = TraceClassVisitor(next, verbosePrinter)
}
+
+ // Handle --package-redirect
+ if (!packageRedirector.isEmpty) {
+ // Don't apply the remapper on redirect-from classes.
+ // Otherwise, if the target jar actually contains the "from" classes (which
+ // may or may not be the case) they'd be renamed.
+ // But we update all references in other places, so, a method call to a "from" class
+ // would be replaced with the "to" class. All type references (e.g. variable types)
+ // will be updated too.
+ if (!packageRedirector.isTarget(classInternalName)) {
+ next = ClassRemapper(next, packageRedirector)
+ } else {
+ log.v("Class $classInternalName is a redirect-from class, not applying" +
+ " --package-redirect")
+ }
+ }
+
var ret: ClassVisitor
if (forImpl) {
ret = ImplGeneratingAdapter(classes, next, filter, options)
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
index ce72a8e..e63efd0 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
@@ -192,6 +192,18 @@
return ThrowingMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
}
+ if (policy.policy == FilterPolicy.Ignore) {
+ when (Type.getReturnType(descriptor)) {
+ Type.VOID_TYPE -> {
+ log.v("Making method ignored...")
+ return IgnoreMethodAdapter(
+ access, name, descriptor, signature, exceptions, innerVisitor)
+ }
+ else -> {
+ throw RuntimeException("Ignored policy only allowed for void methods")
+ }
+ }
+ }
}
return innerVisitor
@@ -252,6 +264,23 @@
}
/**
+ * A method adapter that replaces the method body with a no-op return.
+ */
+ private inner class IgnoreMethodAdapter(
+ access: Int,
+ val name: String,
+ descriptor: String,
+ signature: String?,
+ exceptions: Array<String>?,
+ next: MethodVisitor?
+ ) : BodyReplacingMethodVisitor(access, name, descriptor, signature, exceptions, next) {
+ override fun emitNewCode() {
+ visitInsn(Opcodes.RETURN)
+ visitMaxs(0, 0) // We let ASM figure them out.
+ }
+ }
+
+ /**
* A method adapter that replaces a native method call with a call to the "native substitution"
* class.
*/
@@ -379,4 +408,4 @@
false)
}
}
-}
\ No newline at end of file
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/PackageRedirectRemapper.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/PackageRedirectRemapper.kt
new file mode 100644
index 0000000..b3790e1
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/PackageRedirectRemapper.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2023 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.hoststubgen.visitors
+
+import com.android.hoststubgen.asm.toJvmClassName
+import org.objectweb.asm.commons.Remapper
+
+/**
+ * A [Remapper] for `--package-redirect`
+ */
+class PackageRedirectRemapper(
+ packageRedirects: List<Pair<String, String>>,
+ ) : Remapper() {
+
+ /**
+ * Example: `dalvik/` -> `com/android/hostsubgen/substitution/dalvik/`
+ */
+ private val packageRedirectsWithSlash: List<Pair<String, String>> = packageRedirects.map {
+ p -> Pair(p.first.toJvmClassName() + "/", p.second.toJvmClassName() + "/")
+ }
+
+ /**
+ * Cache.
+ * If a class is a redirect-from class, then the "to" class name will be stored as the value.
+ * Otherwise, "" will be stored.
+ */
+ private val cache = mutableMapOf<String, String>()
+
+ /**
+ * Return whether any redirect is defined.
+ */
+ val isEmpty get() = packageRedirectsWithSlash.isEmpty()
+
+ override fun map(internalName: String?): String? {
+ if (internalName == null) {
+ return null
+ }
+ val to = mapInner(internalName)
+ return to ?: internalName
+ }
+
+ /**
+ * Internal "map" function. Unlike [map(String)], this method will return null
+ * if a class is not a redirect-from class.
+ */
+ private fun mapInner(internalName: String): String? {
+ cache[internalName]?.let {
+ return if (it.isEmpty()) null else it
+ }
+
+ var ret = ""
+ packageRedirectsWithSlash.forEach { fromTo ->
+ if (internalName.startsWith(fromTo.first)) {
+ ret = fromTo.second + internalName.substring(fromTo.first.length)
+ }
+ }
+ cache.set(internalName, ret)
+
+ return if (ret.isEmpty()) null else ret
+ }
+
+ /**
+ * Return true if a class is a redirect-from class.
+ */
+ fun isTarget(internalName: String): Boolean {
+ return mapInner(internalName) != null
+ }
+}
+
diff --git a/tools/hoststubgen/hoststubgen/test-framework/AndroidHostTest.bp b/tools/hoststubgen/hoststubgen/test-framework/AndroidHostTest.bp
index b71e5c4..1f8382a 100644
--- a/tools/hoststubgen/hoststubgen/test-framework/AndroidHostTest.bp
+++ b/tools/hoststubgen/hoststubgen/test-framework/AndroidHostTest.bp
@@ -42,3 +42,16 @@
],
test_suites: ["general-tests"],
}
+
+// "Productionized" build rule.
+android_ravenwood_test {
+ name: "HostStubGenTest-framework-test",
+ srcs: [
+ "src/**/*.java",
+ ],
+ static_libs: [
+ "junit",
+ "truth",
+ "mockito",
+ ],
+}
diff --git a/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/ArrayMapTest.java b/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/ArrayMapTest.java
index 62bbf48..2c5949c 100644
--- a/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/ArrayMapTest.java
+++ b/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/ArrayMapTest.java
@@ -23,16 +23,10 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.util.ArrayMap;
import android.util.Log;
-import androidx.test.runner.AndroidJUnit4;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.AbstractMap;
import java.util.Arrays;
@@ -50,111 +44,9 @@
/**
* Some basic tests for {@link android.util.ArrayMap}.
*/
-@RunWith(AndroidJUnit4.class)
public class ArrayMapTest {
static final boolean DEBUG = false;
- static final int OP_ADD = 1;
- static final int OP_REM = 2;
-
- static int[] OPS = new int[]{
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
-
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
-
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
-
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
-
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
- OP_ADD, OP_ADD, OP_ADD,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
- OP_REM, OP_REM, OP_REM,
- OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
- };
-
- static int[] KEYS = new int[]{
- // General adding and removing.
- -1, 1900, 600, 200, 1200, 1500, 1800, 100, 1900,
- 2100, 300, 800, 600, 1100, 1300, 2000, 1000, 1400,
- 600, -1, 1900, 600, 300, 2100, 200, 800, 800,
- 1800, 1500, 1300, 1100, 2000, 1400, 1000, 1200, 1900,
-
- // Shrink when removing item from end.
- 100, 200, 300, 400, 500, 600, 700, 800, 900,
- 900, 800, 700, 600, 500, 400, 300, 200, 100,
-
- // Shrink when removing item from middle.
- 100, 200, 300, 400, 500, 600, 700, 800, 900,
- 900, 800, 700, 600, 500, 400, 200, 300, 100,
-
- // Shrink when removing item from front.
- 100, 200, 300, 400, 500, 600, 700, 800, 900,
- 900, 800, 700, 600, 500, 400, 100, 200, 300,
-
- // Test hash collisions.
- 105, 106, 108, 104, 102, 102, 107, 5, 205,
- 4, 202, 203, 3, 5, 101, 109, 200, 201,
- 0, -1, 100,
- 106, 108, 104, 102, 103, 105, 107, 101, 109,
- -1, 100, 0,
- 4, 5, 3, 5, 200, 203, 202, 201, 205,
- };
-
- public static class ControlledHash implements Parcelable {
- final int mValue;
-
- ControlledHash(int value) {
- mValue = value;
- }
-
- @Override
- public final boolean equals(Object o) {
- if (o == null) {
- return false;
- }
- return mValue == ((ControlledHash)o).mValue;
- }
-
- @Override
- public final int hashCode() {
- return mValue/100;
- }
-
- @Override
- public final String toString() {
- return Integer.toString(mValue);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mValue);
- }
-
- public static final Parcelable.Creator<ControlledHash> CREATOR
- = new Parcelable.Creator<ControlledHash>() {
- public ControlledHash createFromParcel(Parcel in) {
- return new ControlledHash(in.readInt());
- }
-
- public ControlledHash[] newArray(int size) {
- return new ControlledHash[size];
- }
- };
- }
-
private static boolean compare(Object v1, Object v2) {
if (v1 == null) {
return v2 == null;
@@ -287,35 +179,6 @@
}
}
- private static void compareBundles(Bundle bundle1, Bundle bundle2) {
- Set<String> keySet1 = bundle1.keySet();
- Iterator<String> iterator1 = keySet1.iterator();
- while (iterator1.hasNext()) {
- String key = iterator1.next();
- int value1 = bundle1.getInt(key);
- if (bundle2.get(key) == null) {
- fail("Bad Bundle: bundle2 didn't have expected key " + key);
- }
- int value2 = bundle2.getInt(key);
- if (value1 != value2) {
- fail("Bad Bundle: at key key " + key + " expected " + value1 + ", got " + value2);
- }
- }
- Set<String> keySet2 = bundle2.keySet();
- Iterator<String> iterator2 = keySet2.iterator();
- while (iterator2.hasNext()) {
- String key = iterator2.next();
- if (bundle1.get(key) == null) {
- fail("Bad Bundle: bundle1 didn't have expected key " + key);
- }
- int value1 = bundle1.getInt(key);
- int value2 = bundle2.getInt(key);
- if (value1 != value2) {
- fail("Bad Bundle: at key key " + key + " expected " + value1 + ", got " + value2);
- }
- }
- }
-
private static void dump(Map map, ArrayMap array) {
Log.e("test", "HashMap of " + map.size() + " entries:");
Set<Map.Entry> mapSet = map.entrySet();
@@ -339,96 +202,6 @@
}
}
- private static void dump(Bundle bundle1, Bundle bundle2) {
- Log.e("test", "First Bundle of " + bundle1.size() + " entries:");
- Set<String> keys1 = bundle1.keySet();
- for (String key : keys1) {
- Log.e("test", " " + key + " -> " + bundle1.get(key));
- }
- Log.e("test", "Second Bundle of " + bundle2.size() + " entries:");
- Set<String> keys2 = bundle2.keySet();
- for (String key : keys2) {
- Log.e("test", " " + key + " -> " + bundle2.get(key));
- }
- }
-
- @Test
- public void testBasicArrayMap() {
- HashMap<ControlledHash, Integer> hashMap = new HashMap<>();
- ArrayMap<ControlledHash, Integer> arrayMap = new ArrayMap<>();
- Bundle bundle = new Bundle();
-
- for (int i = 0; i < OPS.length; i++) {
- Integer oldHash;
- Integer oldArray;
- ControlledHash key = KEYS[i] < 0 ? null : new ControlledHash(KEYS[i]);
- String strKey = KEYS[i] < 0 ? null : Integer.toString(KEYS[i]);
- switch (OPS[i]) {
- case OP_ADD:
- if (DEBUG) Log.i("test", "Adding key: " + key);
- oldHash = hashMap.put(key, i);
- oldArray = arrayMap.put(key, i);
- bundle.putInt(strKey, i);
- break;
- case OP_REM:
- if (DEBUG) Log.i("test", "Removing key: " + key);
- oldHash = hashMap.remove(key);
- oldArray = arrayMap.remove(key);
- bundle.remove(strKey);
- break;
- default:
- fail("Bad operation " + OPS[i] + " @ " + i);
- return;
- }
- if (!compare(oldHash, oldArray)) {
- String msg = "Bad result: expected " + oldHash + ", got " + oldArray;
- Log.e("test", msg);
- dump(hashMap, arrayMap);
- fail(msg);
- }
- try {
- validateArrayMap(arrayMap);
- } catch (Throwable e) {
- Log.e("test", e.getMessage());
- dump(hashMap, arrayMap);
- throw e;
- }
- try {
- compareMaps(hashMap, arrayMap);
- } catch (Throwable e) {
- Log.e("test", e.getMessage());
- dump(hashMap, arrayMap);
- throw e;
- }
- Parcel parcel = Parcel.obtain();
- bundle.writeToParcel(parcel, 0);
- parcel.setDataPosition(0);
- Bundle bundle2 = parcel.readBundle();
- try {
- compareBundles(bundle, bundle2);
- } catch (Throwable e) {
- Log.e("test", e.getMessage());
- dump(bundle, bundle2);
- throw e;
- }
- }
-
- arrayMap.put(new ControlledHash(50000), 100);
- ControlledHash lookup = new ControlledHash(50000);
- Iterator<ControlledHash> it = arrayMap.keySet().iterator();
- while (it.hasNext()) {
- if (it.next().equals(lookup)) {
- it.remove();
- }
- }
- if (arrayMap.containsKey(lookup)) {
- String msg = "Bad map iterator: didn't remove test key";
- Log.e("test", msg);
- dump(hashMap, arrayMap);
- fail(msg);
- }
- }
-
@Test
public void testCopyArrayMap() {
// map copy constructor test
@@ -481,44 +254,6 @@
}
}
-// /**
-// * Test creating a malformed array map with duplicated keys and that we will catch this when
-// * unparcelling.
-// */
-// @Test
-// public void testDuplicateKeys() throws NoSuchMethodException,
-// InvocationTargetException, IllegalAccessException, NoSuchFieldException {
-// ArrayMap<String, Object> map1 = new ArrayMap(2);
-//
-// Method appendMethod = ArrayMap.class.getMethod("append", Object.class, Object.class);
-// appendMethod.invoke(map1, Integer.toString(100000), "foo");
-// appendMethod.invoke(map1, Integer.toString(100000), "bar");
-//
-// // Now parcel/unparcel, and verify we get the expected error.
-// Parcel parcel = Parcel.obtain();
-// Method writeArrayMapMethod = Parcel.class.getMethod("writeArrayMap", ArrayMap.class);
-// writeArrayMapMethod.invoke(parcel, map1);
-// parcel.setDataPosition(0);
-// ArrayMap<String, Object> map2 = new ArrayMap(2);
-//
-// try {
-// Parcel.class.getMethod("readArrayMap", ArrayMap.class, ClassLoader.class).invoke(
-// parcel, map2, null);
-// } catch (InvocationTargetException e) {
-// Throwable cause = e.getCause();
-// if (cause instanceof IllegalArgumentException) {
-// // Good!
-// return;
-// }
-// throw e;
-// }
-//
-// String msg = "Didn't throw expected IllegalArgumentException";
-// Log.e("test", msg);
-// dump(map1, map2);
-// fail(msg);
-// }
-
private static void checkEntrySetToArray(ArrayMap<?, ?> testMap) {
try {
testMap.entrySet().toArray();
@@ -734,4 +469,4 @@
fail("ArrayMap replaceAll failure, expect " + expectedMap + ", but " + map);
}
}
-}
\ No newline at end of file
+}
diff --git a/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/LogTest.java b/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/LogTest.java
index 56544b4..3e33b54 100644
--- a/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/LogTest.java
+++ b/tools/hoststubgen/hoststubgen/test-framework/src/com/android/hoststubgen/frameworktest/LogTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
import android.util.Log;
-import android.util.Slog;
import org.junit.Test;
@@ -33,12 +32,6 @@
Log.i("TAG", "Test i log");
Log.w("TAG", "Test w log");
Log.e("TAG", "Test e log");
-
- Slog.v("TAG", "Test v slog");
- Slog.d("TAG", "Test d slog");
- Slog.i("TAG", "Test i slog");
- Slog.w("TAG", "Test w slog");
- Slog.e("TAG", "Test e slog");
}
@Test
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/Android.bp b/tools/hoststubgen/hoststubgen/test-tiny-framework/Android.bp
index f9dc305..3dc6da3 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/Android.bp
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/Android.bp
@@ -24,7 +24,8 @@
defaults: ["hoststubgen-command-defaults"],
cmd: hoststubgen_common_options +
"--in-jar $(location :hoststubgen-test-tiny-framework) " +
- "--policy-override-file $(location policy-override-tiny-framework.txt) ",
+ "--policy-override-file $(location policy-override-tiny-framework.txt) " +
+ "--package-redirect com.unsupported:com.supported ",
srcs: [
":hoststubgen-test-tiny-framework",
"policy-override-tiny-framework.txt",
@@ -61,6 +62,7 @@
cmd: hoststubgen_common_options +
"--in-jar $(location :hoststubgen-test-tiny-framework) " +
"--policy-override-file $(location policy-override-tiny-framework.txt) " +
+ "--package-redirect com.unsupported:com.supported " +
// More options.
"--default-method-call-hook com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall " +
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
index 0c1d88a..f627c6e 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
@@ -84,6 +84,26 @@
java.lang.annotation.Retention(
value=Ljava/lang/annotation/RetentionPolicy;.CLASS
)
+## Class: android/hosttest/annotation/HostSideTestStaticInitializerStub.class
+ Compiled from "HostSideTestStaticInitializerStub.java"
+public interface android.hosttest.annotation.HostSideTestStaticInitializerStub extends java.lang.annotation.Annotation
+ minor version: 0
+ major version: 61
+ flags: (0x2601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION
+ this_class: #x // android/hosttest/annotation/HostSideTestStaticInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 1, fields: 0, methods: 0, attributes: 2
+}
+SourceFile: "HostSideTestStaticInitializerStub.java"
+RuntimeVisibleAnnotations:
+ x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
+ java.lang.annotation.Target(
+ value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
+ )
+ x: #x(#x=e#x.#x)
+ java.lang.annotation.Retention(
+ value=Ljava/lang/annotation/RetentionPolicy;.CLASS
+ )
## Class: android/hosttest/annotation/HostSideTestStub.class
Compiled from "HostSideTestStub.java"
public interface android.hosttest.annotation.HostSideTestStub extends java.lang.annotation.Annotation
@@ -745,20 +765,30 @@
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
-## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.class
- Compiled from "TinyFrameworkClassWithInitializer.java"
-public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.class
+ Compiled from "TinyFrameworkClassWithInitializerDefault.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault
super_class: #x // java/lang/Object
- interfaces: 0, fields: 1, methods: 2, attributes: 2
+ interfaces: 0, fields: 2, methods: 2, attributes: 2
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
- public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer();
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
@@ -769,26 +799,86 @@
LineNumberTable:
LocalVariableTable:
Start Length Slot Name Signature
- 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer;
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault;
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
- stack=1, locals=0, args_size=0
+ stack=2, locals=0, args_size=0
x: iconst_1
x: putstatic #x // Field sInitialized:Z
- x: return
+ x: new #x // class java/lang/Object
+ x: dup
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: putstatic #x // Field sObject:Ljava/lang/Object;
+ x: return
LineNumberTable:
}
-SourceFile: "TinyFrameworkClassWithInitializer.java"
+SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.class
+ Compiled from "TinyFrameworkClassWithInitializerStub.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 2, methods: 2, attributes: 2
+ public static boolean sInitialized;
+ descriptor: Z
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=1, locals=1, args_size=1
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub;
+
+ static {};
+ descriptor: ()V
+ flags: (0x0008) ACC_STATIC
+ Code:
+ stack=2, locals=0, args_size=0
+ x: iconst_1
+ x: putstatic #x // Field sInitialized:Z
+ x: new #x // class java/lang/Object
+ x: dup
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: putstatic #x // Field sObject:Ljava/lang/Object;
+ x: return
+ LineNumberTable:
+}
+SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
value="com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded"
)
x: #x()
- android.hosttest.annotation.HostSideTestWholeClassStub
+ android.hosttest.annotation.HostSideTestStub
+ x: #x()
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester.class
Compiled from "TinyFrameworkExceptionTester.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTester
@@ -1669,3 +1759,138 @@
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.class
+ Compiled from "TinyFrameworkPackageRedirect.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 2
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=1, locals=1, args_size=1
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+
+ public static int foo(int);
+ descriptor: (I)I
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class com/unsupported/UnsupportedClass
+ x: dup
+ x: iload_0
+ x: invokespecial #x // Method com/unsupported/UnsupportedClass."<init>":(I)V
+ x: invokevirtual #x // Method com/unsupported/UnsupportedClass.getValue:()I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 12 0 value I
+}
+SourceFile: "TinyFrameworkPackageRedirect.java"
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
+## Class: com/supported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.supported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/supported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 1, methods: 2, attributes: 2
+ private final int mValue;
+ descriptor: I
+ flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+
+ public com.supported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=2, locals=2, args_size=2
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: aload_0
+ x: iload_1
+ x: putfield #x // Field mValue:I
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Lcom/supported/UnsupportedClass;
+ 0 10 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=1, locals=1, args_size=1
+ x: aload_0
+ x: getfield #x // Field mValue:I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 5 0 this Lcom/supported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassKeep
+## Class: com/unsupported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.unsupported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/unsupported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 2
+ public com.unsupported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=2, args_size=2
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 14 0 this Lcom/unsupported/UnsupportedClass;
+ 0 14 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Lcom/unsupported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
index 0761edc..d7f0149 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
@@ -364,31 +364,74 @@
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
-## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.class
- Compiled from "TinyFrameworkClassWithInitializer.java"
-public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.class
+ Compiled from "TinyFrameworkClassWithInitializerDefault.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault
super_class: #x // java/lang/Object
- interfaces: 0, fields: 1, methods: 1, attributes: 3
+ interfaces: 0, fields: 2, methods: 0, attributes: 3
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
- public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer();
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+}
+SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.class
+ Compiled from "TinyFrameworkClassWithInitializerStub.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 2, methods: 1, attributes: 3
+ public static boolean sInitialized;
+ descriptor: Z
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ static {};
descriptor: ()V
- flags: (0x0001) ACC_PUBLIC
+ flags: (0x0008) ACC_STATIC
Code:
- stack=3, locals=1, args_size=1
+ stack=3, locals=0, args_size=0
x: new #x // class java/lang/RuntimeException
x: dup
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
}
-SourceFile: "TinyFrameworkClassWithInitializer.java"
+SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
@@ -400,7 +443,9 @@
value="com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded"
)
x: #x()
- android.hosttest.annotation.HostSideTestWholeClassStub
+ android.hosttest.annotation.HostSideTestStub
+ x: #x()
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester.class
Compiled from "TinyFrameworkExceptionTester.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTester
@@ -824,3 +869,83 @@
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.class
+ Compiled from "TinyFrameworkPackageRedirect.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+
+ public static int foo(int);
+ descriptor: (I)I
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+}
+SourceFile: "TinyFrameworkPackageRedirect.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
+## Class: com/unsupported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.unsupported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/unsupported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.unsupported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=2, args_size=2
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
index faf0a46..131e0b1 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
@@ -710,46 +710,80 @@
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
-## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.class
- Compiled from "TinyFrameworkClassWithInitializer.java"
-public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.class
+ Compiled from "TinyFrameworkClassWithInitializerDefault.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault
super_class: #x // java/lang/Object
- interfaces: 0, fields: 1, methods: 2, attributes: 3
+ interfaces: 0, fields: 2, methods: 0, attributes: 3
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
- public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer();
- descriptor: ()V
- flags: (0x0001) ACC_PUBLIC
- Code:
- stack=1, locals=1, args_size=1
- x: aload_0
- x: invokespecial #x // Method java/lang/Object."<init>":()V
- x: return
- LineNumberTable:
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer;
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+}
+SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.class
+ Compiled from "TinyFrameworkClassWithInitializerStub.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 2, methods: 1, attributes: 3
+ public static boolean sInitialized;
+ descriptor: Z
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=2, locals=0, args_size=0
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
x: ldc #x // String com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded
x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
x: iconst_1
x: putstatic #x // Field sInitialized:Z
+ x: new #x // class java/lang/Object
+ x: dup
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
}
-SourceFile: "TinyFrameworkClassWithInitializer.java"
+SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
@@ -761,7 +795,9 @@
value="com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded"
)
x: #x()
- android.hosttest.annotation.HostSideTestWholeClassStub
+ android.hosttest.annotation.HostSideTestStub
+ x: #x()
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester.class
Compiled from "TinyFrameworkExceptionTester.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTester
@@ -1772,3 +1808,163 @@
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.class
+ Compiled from "TinyFrameworkPackageRedirect.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=1, locals=1, args_size=1
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+
+ public static int foo(int);
+ descriptor: (I)I
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class com/supported/UnsupportedClass
+ x: dup
+ x: iload_0
+ x: invokespecial #x // Method com/supported/UnsupportedClass."<init>":(I)V
+ x: invokevirtual #x // Method com/supported/UnsupportedClass.getValue:()I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 12 0 value I
+}
+SourceFile: "TinyFrameworkPackageRedirect.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
+## Class: com/supported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.supported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/supported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 1, methods: 2, attributes: 3
+ private final int mValue;
+ descriptor: I
+ flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+
+ public com.supported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=2, args_size=2
+ x: ldc #x // String com/supported/UnsupportedClass
+ x: ldc #x // String <init>
+ x: ldc #x // String (I)V
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+ x: invokevirtual #x // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: aload_0
+ x: iload_1
+ x: putfield #x // Field mValue:I
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 15 10 0 this Lcom/supported/UnsupportedClass;
+ 15 10 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=1, args_size=1
+ x: ldc #x // String com/supported/UnsupportedClass
+ x: ldc #x // String getValue
+ x: ldc #x // String ()I
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+ x: invokevirtual #x // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+ x: aload_0
+ x: getfield #x // Field mValue:I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 15 5 0 this Lcom/supported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassKeep
+## Class: com/unsupported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.unsupported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/unsupported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.unsupported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=2, args_size=2
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 14 0 this Lcom/unsupported/UnsupportedClass;
+ 0 14 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Lcom/unsupported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
index 0761edc..d7f0149 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
@@ -364,31 +364,74 @@
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
-## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.class
- Compiled from "TinyFrameworkClassWithInitializer.java"
-public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.class
+ Compiled from "TinyFrameworkClassWithInitializerDefault.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault
super_class: #x // java/lang/Object
- interfaces: 0, fields: 1, methods: 1, attributes: 3
+ interfaces: 0, fields: 2, methods: 0, attributes: 3
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
- public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer();
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+}
+SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.class
+ Compiled from "TinyFrameworkClassWithInitializerStub.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 2, methods: 1, attributes: 3
+ public static boolean sInitialized;
+ descriptor: Z
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ static {};
descriptor: ()V
- flags: (0x0001) ACC_PUBLIC
+ flags: (0x0008) ACC_STATIC
Code:
- stack=3, locals=1, args_size=1
+ stack=3, locals=0, args_size=0
x: new #x // class java/lang/RuntimeException
x: dup
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
}
-SourceFile: "TinyFrameworkClassWithInitializer.java"
+SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
@@ -400,7 +443,9 @@
value="com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded"
)
x: #x()
- android.hosttest.annotation.HostSideTestWholeClassStub
+ android.hosttest.annotation.HostSideTestStub
+ x: #x()
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester.class
Compiled from "TinyFrameworkExceptionTester.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTester
@@ -824,3 +869,83 @@
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.class
+ Compiled from "TinyFrameworkPackageRedirect.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+
+ public static int foo(int);
+ descriptor: (I)I
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+}
+SourceFile: "TinyFrameworkPackageRedirect.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
+## Class: com/unsupported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.unsupported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/unsupported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 2, attributes: 3
+ public com.unsupported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=2, args_size=2
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String Stub!
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
index 874789e..3318c7d 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
@@ -950,59 +950,88 @@
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
-## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.class
- Compiled from "TinyFrameworkClassWithInitializer.java"
-public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.class
+ Compiled from "TinyFrameworkClassWithInitializerDefault.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerDefault
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault
super_class: #x // java/lang/Object
- interfaces: 0, fields: 1, methods: 2, attributes: 3
+ interfaces: 0, fields: 2, methods: 0, attributes: 3
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
- public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer();
- descriptor: ()V
- flags: (0x0001) ACC_PUBLIC
- Code:
- stack=4, locals=1, args_size=1
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
- x: ldc #x // String <init>
- x: ldc #x // String ()V
- x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
- x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
- x: aload_0
- x: invokespecial #x // Method java/lang/Object."<init>":()V
- x: return
- LineNumberTable:
- LocalVariableTable:
- Start Length Slot Name Signature
- 11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer;
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+}
+SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.class
+ Compiled from "TinyFrameworkClassWithInitializerStub.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializerStub
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 2, methods: 1, attributes: 3
+ public static boolean sInitialized;
+ descriptor: Z
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
+
+ public static java.lang.Object sObject;
+ descriptor: Ljava/lang/Object;
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestStub
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=4, locals=0, args_size=0
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
x: ldc #x // String <clinit>
x: ldc #x // String ()V
x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logClassLoaded
x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub
x: ldc #x // String com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded
x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
x: iconst_1
x: putstatic #x // Field sInitialized:Z
+ x: new #x // class java/lang/Object
+ x: dup
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
}
-SourceFile: "TinyFrameworkClassWithInitializer.java"
+SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
@@ -1014,7 +1043,9 @@
value="com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded"
)
x: #x()
- android.hosttest.annotation.HostSideTestWholeClassStub
+ android.hosttest.annotation.HostSideTestStub
+ x: #x()
+ android.hosttest.annotation.HostSideTestStaticInitializerStub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester.class
Compiled from "TinyFrameworkExceptionTester.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTester
@@ -2346,3 +2377,223 @@
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
+## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.class
+ Compiled from "TinyFrameworkPackageRedirect.java"
+public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 3, attributes: 3
+ private static {};
+ descriptor: ()V
+ flags: (0x000a) ACC_PRIVATE, ACC_STATIC
+ Code:
+ stack=2, locals=0, args_size=0
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logClassLoaded
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
+ x: return
+
+ public com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedirect();
+ descriptor: ()V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=1, args_size=1
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ x: ldc #x // String <init>
+ x: ldc #x // String ()V
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+
+ public static int foo(int);
+ descriptor: (I)I
+ flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=4, locals=1, args_size=1
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect
+ x: ldc #x // String foo
+ x: ldc #x // String (I)I
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: new #x // class com/supported/UnsupportedClass
+ x: dup
+ x: iload_0
+ x: invokespecial #x // Method com/supported/UnsupportedClass."<init>":(I)V
+ x: invokevirtual #x // Method com/supported/UnsupportedClass.getValue:()I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 11 12 0 value I
+}
+SourceFile: "TinyFrameworkPackageRedirect.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
+## Class: com/supported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.supported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/supported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 1, methods: 3, attributes: 3
+ private final int mValue;
+ descriptor: I
+ flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+
+ private static {};
+ descriptor: ()V
+ flags: (0x000a) ACC_PRIVATE, ACC_STATIC
+ Code:
+ stack=2, locals=0, args_size=0
+ x: ldc #x // class com/supported/UnsupportedClass
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logClassLoaded
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
+ x: return
+
+ public com.supported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=2, args_size=2
+ x: ldc #x // class com/supported/UnsupportedClass
+ x: ldc #x // String <init>
+ x: ldc #x // String (I)V
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: ldc #x // String com/supported/UnsupportedClass
+ x: ldc #x // String <init>
+ x: ldc #x // String (I)V
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+ x: invokevirtual #x // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: aload_0
+ x: iload_1
+ x: putfield #x // Field mValue:I
+ x: return
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 26 10 0 this Lcom/supported/UnsupportedClass;
+ 26 10 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=1, args_size=1
+ x: ldc #x // class com/supported/UnsupportedClass
+ x: ldc #x // String getValue
+ x: ldc #x // String ()I
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: ldc #x // String com/supported/UnsupportedClass
+ x: ldc #x // String getValue
+ x: ldc #x // String ()I
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+ x: invokevirtual #x // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+ x: aload_0
+ x: getfield #x // Field mValue:I
+ x: ireturn
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 26 5 0 this Lcom/supported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassKeep
+## Class: com/unsupported/UnsupportedClass.class
+ Compiled from "UnsupportedClass.java"
+public class com.unsupported.UnsupportedClass
+ minor version: 0
+ major version: 61
+ flags: (0x0021) ACC_PUBLIC, ACC_SUPER
+ this_class: #x // com/unsupported/UnsupportedClass
+ super_class: #x // java/lang/Object
+ interfaces: 0, fields: 0, methods: 3, attributes: 3
+ private static {};
+ descriptor: ()V
+ flags: (0x000a) ACC_PRIVATE, ACC_STATIC
+ Code:
+ stack=2, locals=0, args_size=0
+ x: ldc #x // class com/unsupported/UnsupportedClass
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logClassLoaded
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
+ x: return
+
+ public com.unsupported.UnsupportedClass(int);
+ descriptor: (I)V
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=2, args_size=2
+ x: ldc #x // class com/unsupported/UnsupportedClass
+ x: ldc #x // String <init>
+ x: ldc #x // String (I)V
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: aload_0
+ x: invokespecial #x // Method java/lang/Object."<init>":()V
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 11 14 0 this Lcom/unsupported/UnsupportedClass;
+ 11 14 1 value I
+
+ public int getValue();
+ descriptor: ()I
+ flags: (0x0001) ACC_PUBLIC
+ Code:
+ stack=4, locals=1, args_size=1
+ x: ldc #x // class com/unsupported/UnsupportedClass
+ x: ldc #x // String getValue
+ x: ldc #x // String ()I
+ x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+ x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ x: new #x // class java/lang/RuntimeException
+ x: dup
+ x: ldc #x // String This class is not supported
+ x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ x: athrow
+ LineNumberTable:
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 11 10 0 this Lcom/unsupported/UnsupportedClass;
+}
+SourceFile: "UnsupportedClass.java"
+RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+RuntimeInvisibleAnnotations:
+ x: #x()
+ android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
index 8fcd2fb..079d2a8 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
@@ -15,8 +15,3 @@
# Class load hook
class com/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy ~com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded
-
-
-class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithInitializer stubclass
- # Testing 'throw' on a static initializer. This should be handled as 'keep'.
- method <clinit> ()V throw
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/run-test-manually.sh b/tools/hoststubgen/hoststubgen/test-tiny-framework/run-test-manually.sh
index 523106f..e212890 100755
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/run-test-manually.sh
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/run-test-manually.sh
@@ -92,6 +92,7 @@
--policy-override-file policy-override-tiny-framework.txt \
--gen-keep-all-file out/tiny-framework_keep_all.txt \
--gen-input-dump-file out/tiny-framework_dump.txt \
+ --package-redirect com.unsupported:com.supported \
$HOSTSTUBGEN_OPTS
# Extract the jar files, so we can look into them.
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.java
similarity index 66%
copy from tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java
copy to tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.java
index 01a690b..8324ed9 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerDefault.java
@@ -16,19 +16,17 @@
package com.android.hoststubgen.test.tinyframework;
import android.hosttest.annotation.HostSideTestClassLoadHook;
+import android.hosttest.annotation.HostSideTestStub;
import android.hosttest.annotation.HostSideTestWholeClassStub;
-
-// Note, policy-override-tiny-framework.txt hss an override on this class.
-@HostSideTestClassLoadHook(
- "com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded")
-@HostSideTestWholeClassStub
-public class TinyFrameworkClassWithInitializer {
- // Note, this method has a 'throw' in the policy file, which is handled as a 'keep' (because
- // it's a static initializer), so this won't show up in the stub jar.
+@HostSideTestStub
+public class TinyFrameworkClassWithInitializerDefault {
static {
sInitialized = true;
}
+ @HostSideTestStub
public static boolean sInitialized;
+ @HostSideTestStub
+ public static Object sObject = new Object();
}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.java
similarity index 75%
rename from tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java
rename to tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.java
index 01a690b..998acf2 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializer.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassWithInitializerStub.java
@@ -16,19 +16,21 @@
package com.android.hoststubgen.test.tinyframework;
import android.hosttest.annotation.HostSideTestClassLoadHook;
+import android.hosttest.annotation.HostSideTestStaticInitializerStub;
+import android.hosttest.annotation.HostSideTestStub;
import android.hosttest.annotation.HostSideTestWholeClassStub;
-
-// Note, policy-override-tiny-framework.txt hss an override on this class.
@HostSideTestClassLoadHook(
"com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook.onClassLoaded")
-@HostSideTestWholeClassStub
-public class TinyFrameworkClassWithInitializer {
- // Note, this method has a 'throw' in the policy file, which is handled as a 'keep' (because
- // it's a static initializer), so this won't show up in the stub jar.
+@HostSideTestStub
+@HostSideTestStaticInitializerStub
+public class TinyFrameworkClassWithInitializerStub {
static {
sInitialized = true;
}
+ @HostSideTestStub
public static boolean sInitialized;
+ @HostSideTestStub
+ public static Object sObject = new Object();
}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.java
new file mode 100644
index 0000000..a82be54
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2023 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.hoststubgen.test.tinyframework;
+
+import android.hosttest.annotation.HostSideTestWholeClassStub;
+
+@HostSideTestWholeClassStub
+public class TinyFrameworkPackageRedirect {
+ /**
+ * A method that uses "unsupported" class. HostStubGen will redirect them to the "supported"
+ * one (because of --package-redirect), so this test will pass.
+ */
+ public static int foo(int value) {
+ // This method throws, so it's not callable as-is. But HostStubGen
+ // will rewrite it, it will actually work.
+ return new com.unsupported.UnsupportedClass(value).getValue();
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/supported/UnsupportedClass.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/supported/UnsupportedClass.java
new file mode 100644
index 0000000..fa58664
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/supported/UnsupportedClass.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2023 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.supported;
+
+import android.hosttest.annotation.HostSideTestWholeClassKeep;
+
+// Used for testing --package-redirect.
+@HostSideTestWholeClassKeep
+public class UnsupportedClass {
+ private final int mValue;
+
+ public UnsupportedClass(int value) {
+ mValue = value;
+ }
+
+ public int getValue() {
+ return mValue;
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/unsupported/UnsupportedClass.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/unsupported/UnsupportedClass.java
new file mode 100644
index 0000000..0409b02
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/unsupported/UnsupportedClass.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2023 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.unsupported;
+
+import android.hosttest.annotation.HostSideTestWholeClassStub;
+
+// Used for testing --package-redirect.
+@HostSideTestWholeClassStub
+public class UnsupportedClass {
+ public UnsupportedClass(int value) {
+ throw new RuntimeException("This class is not supported");
+ }
+
+ public int getValue() {
+ throw new RuntimeException("This class is not supported");
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
index cd604ff..29aabc7 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
@@ -127,11 +127,11 @@
@Test
public void testClassLoadHook() {
- assertThat(TinyFrameworkClassWithInitializer.sInitialized).isTrue();
+ assertThat(TinyFrameworkClassWithInitializerStub.sInitialized).isTrue();
// Having this line before assertThat() will ensure these class are already loaded.
- var classes = new Class[] {
- TinyFrameworkClassWithInitializer.class,
+ var classes = new Class[]{
+ TinyFrameworkClassWithInitializerStub.class,
TinyFrameworkClassAnnotations.class,
TinyFrameworkForTextPolicy.class,
};
@@ -145,6 +145,18 @@
.doesNotContain(TinyFrameworkNestedClasses.class);
}
+ @Test
+ public void testStaticInitializer_Default() {
+ assertThat(TinyFrameworkClassWithInitializerDefault.sInitialized).isFalse();
+ assertThat(TinyFrameworkClassWithInitializerDefault.sObject).isNull();
+ }
+
+ @Test
+ public void testStaticInitializer_Stub() {
+ assertThat(TinyFrameworkClassWithInitializerStub.sInitialized).isTrue();
+ assertThat(TinyFrameworkClassWithInitializerStub.sObject).isNotNull();
+ }
+
/**
* Test to try accessing JDK private fields using reflections + setAccessible(true),
* which is now disallowed due to Java Modules, unless you run the javacommand with.
@@ -182,4 +194,9 @@
m.invoke(fd, 0);
assertThat(f.get(fd)).isEqualTo(0);
}
+
+ @Test
+ public void testPackageRedirect() throws Exception {
+ assertThat(TinyFrameworkPackageRedirect.foo(1)).isEqualTo(1);
+ }
}
diff --git a/tools/hoststubgen/scripts/run-all-tests.sh b/tools/hoststubgen/scripts/run-all-tests.sh
index 8bc88de..ba1d404 100755
--- a/tools/hoststubgen/scripts/run-all-tests.sh
+++ b/tools/hoststubgen/scripts/run-all-tests.sh
@@ -24,8 +24,14 @@
hoststubgen-test-tiny-test
)
-# First, build all the test modules. This shouldn't fail.
-run m run-ravenwood-test ${READY_TEST_MODULES[*]} ${NOT_READY_TEST_MODULES[*]}
+MUST_BUILD_MODULES=(
+ run-ravenwood-test
+ "${NOT_READY_TEST_MODULES[*]}"
+ HostStubGenTest-framework-test
+)
+
+# First, build all the test / etc modules. This shouldn't fail.
+run m "${MUST_BUILD_MODULES[@]}"
# Next, run the golden check. This should always pass too.
# The following scripts _should_ pass too, but they depend on the internal paths to soong generated
diff --git a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionDetector.kt b/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionDetector.kt
index dcd94f1..83b8f16 100644
--- a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionDetector.kt
+++ b/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionDetector.kt
@@ -197,6 +197,15 @@
/* Check that we are connected to the super class */
val overridingMethod = node as PsiMethod
val parents = overridingMethod.findSuperMethods()
+ if (parents.isEmpty()) {
+ context.report(
+ ISSUE_MISUSING_ENFORCE_PERMISSION,
+ node,
+ context.getLocation(node),
+ "The method ${node.name} does not override an AIDL generated method"
+ )
+ return
+ }
for (overriddenMethod in parents) {
// The equivalence check can be skipped, if both methods are
// annotated, it will be verified by visitAnnotationUsage.
diff --git a/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionDetectorTest.kt b/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionDetectorTest.kt
index b3dacbd..d8afcb9 100644
--- a/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionDetectorTest.kt
+++ b/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionDetectorTest.kt
@@ -28,7 +28,9 @@
override fun getIssues(): List<Issue> = listOf(
EnforcePermissionDetector.ISSUE_MISSING_ENFORCE_PERMISSION,
- EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION
+ EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION,
+ EnforcePermissionDetector.ISSUE_ENFORCE_PERMISSION_HELPER,
+ EnforcePermissionDetector.ISSUE_MISUSING_ENFORCE_PERMISSION
)
override fun lint(): TestLintTask = super.lint().allowMissingSdk(true)
@@ -41,7 +43,9 @@
public class TestClass2 extends IFooMethod.Stub {
@Override
@EnforcePermission(android.Manifest.permission.READ_PHONE_STATE)
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -58,7 +62,9 @@
public class TestClass11 extends IFooMethod.Stub {
@Override
@EnforcePermission(allOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAll() {}
+ public void testMethodAll() {
+ testMethodAll_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -75,7 +81,10 @@
public class TestClass111 extends IFooMethod.Stub {
@Override
@EnforcePermission(allOf={"android.permission.INTERNET", android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAllLiteral() {}
+ public void testMethodAllLiteral() {
+ testMethodAllLiteral_enforcePermission();
+
+ }
}
""").indented(),
*stubs
@@ -92,7 +101,9 @@
public class TestClass12 extends IFooMethod.Stub {
@Override
@EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAny() {}
+ public void testMethodAny() {
+ testMethodAny_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -109,7 +120,9 @@
public class TestClass121 extends IFooMethod.Stub {
@Override
@EnforcePermission(anyOf={"android.permission.INTERNET", android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAnyLiteral() {}
+ public void testMethodAnyLiteral() {
+ testMethodAnyLiteral_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -124,7 +137,9 @@
package test.pkg;
public class TestClass4 extends IFooMethod.Stub {
@android.annotation.EnforcePermission(android.Manifest.permission.INTERNET)
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -132,21 +147,44 @@
.run()
.expect("""
src/test/pkg/TestClass4.java:4: Error: The method TestClass4.testMethod is annotated with @android.annotation.EnforcePermission(android.Manifest.permission.INTERNET) \
- which differs from the overridden method Stub.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). \
+ which differs from the overridden method IFooMethod.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethod() {}
+ public void testMethod() {
~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
}
+ fun testDetectIssuesAnnotationOnNonStubMethod() {
+ lint().files(java(
+ """
+ package test.pkg;
+ public class TestClass42 extends IFooMethod.Stub {
+ @android.annotation.EnforcePermission(android.Manifest.permission.INTERNET)
+ public void aRegularMethodNotPartOfStub() {
+ }
+ }
+ """).indented(),
+ *stubs
+ )
+ .run()
+ .expect("""
+ src/test/pkg/TestClass42.java:3: Error: The method aRegularMethodNotPartOfStub does not override an AIDL generated method [MisusingEnforcePermissionAnnotation]
+ @android.annotation.EnforcePermission(android.Manifest.permission.INTERNET)
+ ^
+ 1 errors, 0 warnings
+ """.addLineContinuation())
+ }
+
fun testDetectIssuesEmptyAnnotationOnMethod() {
lint().files(java(
"""
package test.pkg;
public class TestClass41 extends IFooMethod.Stub {
@android.annotation.EnforcePermission
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -154,9 +192,9 @@
.run()
.expect("""
src/test/pkg/TestClass41.java:4: Error: The method TestClass41.testMethod is annotated with @android.annotation.EnforcePermission \
- which differs from the overridden method Stub.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). \
+ which differs from the overridden method IFooMethod.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethod() {}
+ public void testMethod() {
~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -168,7 +206,9 @@
package test.pkg;
public class TestClass9 extends IFooMethod.Stub {
@android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.NFC})
- public void testMethodAny() {}
+ public void testMethodAny() {
+ testMethodAny_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -177,10 +217,10 @@
.expect("""
src/test/pkg/TestClass9.java:4: Error: The method TestClass9.testMethodAny is annotated with \
@android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.NFC}) \
- which differs from the overridden method Stub.testMethodAny: \
+ which differs from the overridden method IFooMethod.testMethodAny: \
@android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE}). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAny() {}
+ public void testMethodAny() {
~~~~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -192,7 +232,9 @@
package test.pkg;
public class TestClass91 extends IFooMethod.Stub {
@android.annotation.EnforcePermission(anyOf={"android.permission.INTERNET", "android.permissionoopsthisisatypo.READ_PHONE_STATE"})
- public void testMethodAnyLiteral() {}
+ public void testMethodAnyLiteral() {
+ testMethodAnyLiteral_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -201,10 +243,10 @@
.expect("""
src/test/pkg/TestClass91.java:4: Error: The method TestClass91.testMethodAnyLiteral is annotated with \
@android.annotation.EnforcePermission(anyOf={"android.permission.INTERNET", "android.permissionoopsthisisatypo.READ_PHONE_STATE"}) \
- which differs from the overridden method Stub.testMethodAnyLiteral: \
+ which differs from the overridden method IFooMethod.testMethodAnyLiteral: \
@android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"}). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAnyLiteral() {}
+ public void testMethodAnyLiteral() {
~~~~~~~~~~~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -216,7 +258,9 @@
package test.pkg;
public class TestClass10 extends IFooMethod.Stub {
@android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, android.Manifest.permission.NFC})
- public void testMethodAll() {}
+ public void testMethodAll() {
+ testMethodAll_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -225,10 +269,10 @@
.expect("""
src/test/pkg/TestClass10.java:4: Error: The method TestClass10.testMethodAll is annotated with \
@android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, android.Manifest.permission.NFC}) \
- which differs from the overridden method Stub.testMethodAll: \
+ which differs from the overridden method IFooMethod.testMethodAll: \
@android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE}). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAll() {}
+ public void testMethodAll() {
~~~~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -240,7 +284,9 @@
package test.pkg;
public class TestClass101 extends IFooMethod.Stub {
@android.annotation.EnforcePermission(allOf={"android.permission.INTERNET", "android.permissionoopsthisisatypo.READ_PHONE_STATE"})
- public void testMethodAllLiteral() {}
+ public void testMethodAllLiteral() {
+ testMethodAllLiteral_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -249,10 +295,10 @@
.expect("""
src/test/pkg/TestClass101.java:4: Error: The method TestClass101.testMethodAllLiteral is annotated with \
@android.annotation.EnforcePermission(allOf={"android.permission.INTERNET", "android.permissionoopsthisisatypo.READ_PHONE_STATE"}) \
- which differs from the overridden method Stub.testMethodAllLiteral: \
+ which differs from the overridden method IFooMethod.testMethodAllLiteral: \
@android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"}). \
The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAllLiteral() {}
+ public void testMethodAllLiteral() {
~~~~~~~~~~~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -263,16 +309,18 @@
"""
package test.pkg;
public class TestClass6 extends IFooMethod.Stub {
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
)
.run()
.expect("""
- src/test/pkg/TestClass6.java:3: Error: The method TestClass6.testMethod overrides the method Stub.testMethod which is annotated with @EnforcePermission. \
+ src/test/pkg/TestClass6.java:3: Error: The method TestClass6.testMethod overrides the method IFooMethod.testMethod which is annotated with @EnforcePermission. \
The same annotation must be used on TestClass6.testMethod [MissingEnforcePermissionAnnotation]
- public void testMethod() {}
+ public void testMethod() {
~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -284,16 +332,18 @@
package test.pkg;
public class TestClass7 extends IBar.Stub {
@android.annotation.EnforcePermission(android.Manifest.permission.INTERNET)
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
)
.run()
.expect("""
- src/test/pkg/TestClass7.java:4: Error: The method TestClass7.testMethod overrides the method Stub.testMethod which is not annotated with @EnforcePermission. \
- The same annotation must be used on Stub.testMethod. Did you forget to annotate the AIDL definition? [MissingEnforcePermissionAnnotation]
- public void testMethod() {}
+ src/test/pkg/TestClass7.java:4: Error: The method TestClass7.testMethod overrides the method IBar.testMethod which is not annotated with @EnforcePermission. \
+ The same annotation must be used on IBar.testMethod. Did you forget to annotate the AIDL definition? [MissingEnforcePermissionAnnotation]
+ public void testMethod() {
~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation())
@@ -304,7 +354,9 @@
"""
package test.pkg;
public class Default extends IFooMethod.Stub {
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -313,8 +365,8 @@
.expect(
"""
src/test/pkg/Default.java:3: Error: The method Default.testMethod \
- overrides the method Stub.testMethod which is annotated with @EnforcePermission. The same annotation must be used on Default.testMethod [MissingEnforcePermissionAnnotation]
- public void testMethod() {}
+ overrides the method IFooMethod.testMethod which is annotated with @EnforcePermission. The same annotation must be used on Default.testMethod [MissingEnforcePermissionAnnotation]
+ public void testMethod() {
~~~~~~~~~~
1 errors, 0 warnings
""".addLineContinuation()
@@ -329,16 +381,24 @@
public class TestClass121 extends IFooMethod.Stub {
@Override
@EnforcePermission("READ_PHONE_STATE")
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
@Override
@EnforcePermission(android.Manifest.permission.READ_PHONE_STATE)
- public void testMethodParentShortPermission() {}
+ public void testMethodParentShortPermission() {
+ testMethodParentShortPermission_enforcePermission();
+ }
@Override
@EnforcePermission(anyOf={"INTERNET", "READ_PHONE_STATE"})
- public void testMethodAnyLiteral() {}
+ public void testMethodAnyLiteral() {
+ testMethodAnyLiteral_enforcePermission();
+ }
@Override
@EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAnyLiteralParentsShortPermission() {}
+ public void testMethodAnyLiteralParentsShortPermission() {
+ testMethodAnyLiteralParentsShortPermission_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -355,16 +415,24 @@
public class TestClass121 extends IFooMethod.Stub {
@Override
@EnforcePermission("READ_WRONG_PHONE_STATE")
- public void testMethod() {}
+ public void testMethod() {
+ testMethod_enforcePermission();
+ }
@Override
@EnforcePermission(android.Manifest.permission.READ_WRONG_PHONE_STATE)
- public void testMethodParentShortPermission() {}
+ public void testMethodParentShortPermission() {
+ testMethodParentShortPermission_enforcePermission();
+ }
@Override
@EnforcePermission(anyOf={"WRONG_INTERNET", "READ_PHONE_STATE"})
- public void testMethodAnyLiteral() {}
+ public void testMethodAnyLiteral() {
+ testMethodAnyLiteral_enforcePermission();
+ }
@Override
@EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_WRONG_PHONE_STATE})
- public void testMethodAnyLiteralParentsShortPermission() {}
+ public void testMethodAnyLiteralParentsShortPermission() {
+ testMethodAnyLiteralParentsShortPermission_enforcePermission();
+ }
}
""").indented(),
*stubs
@@ -372,17 +440,17 @@
.run()
.expect(
"""
- src/test/pkg/TestClass121.java:6: Error: The method TestClass121.testMethod is annotated with @EnforcePermission("READ_WRONG_PHONE_STATE") which differs from the overridden method Stub.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethod() {}
+ src/test/pkg/TestClass121.java:6: Error: The method TestClass121.testMethod is annotated with @EnforcePermission("READ_WRONG_PHONE_STATE") which differs from the overridden method IFooMethod.testMethod: @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
+ public void testMethod() {
~~~~~~~~~~
- src/test/pkg/TestClass121.java:9: Error: The method TestClass121.testMethodParentShortPermission is annotated with @EnforcePermission(android.Manifest.permission.READ_WRONG_PHONE_STATE) which differs from the overridden method Stub.testMethodParentShortPermission: @android.annotation.EnforcePermission("READ_PHONE_STATE"). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodParentShortPermission() {}
+ src/test/pkg/TestClass121.java:11: Error: The method TestClass121.testMethodParentShortPermission is annotated with @EnforcePermission(android.Manifest.permission.READ_WRONG_PHONE_STATE) which differs from the overridden method IFooMethod.testMethodParentShortPermission: @android.annotation.EnforcePermission("READ_PHONE_STATE"). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
+ public void testMethodParentShortPermission() {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- src/test/pkg/TestClass121.java:12: Error: The method TestClass121.testMethodAnyLiteral is annotated with @EnforcePermission(anyOf={"WRONG_INTERNET", "READ_PHONE_STATE"}) which differs from the overridden method Stub.testMethodAnyLiteral: @android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"}). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAnyLiteral() {}
+ src/test/pkg/TestClass121.java:16: Error: The method TestClass121.testMethodAnyLiteral is annotated with @EnforcePermission(anyOf={"WRONG_INTERNET", "READ_PHONE_STATE"}) which differs from the overridden method IFooMethod.testMethodAnyLiteral: @android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"}). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
+ public void testMethodAnyLiteral() {
~~~~~~~~~~~~~~~~~~~~
- src/test/pkg/TestClass121.java:15: Error: The method TestClass121.testMethodAnyLiteralParentsShortPermission is annotated with @EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_WRONG_PHONE_STATE}) which differs from the overridden method Stub.testMethodAnyLiteralParentsShortPermission: @android.annotation.EnforcePermission(anyOf={"INTERNET", "READ_PHONE_STATE"}). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
- public void testMethodAnyLiteralParentsShortPermission() {}
+ src/test/pkg/TestClass121.java:21: Error: The method TestClass121.testMethodAnyLiteralParentsShortPermission is annotated with @EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_WRONG_PHONE_STATE}) which differs from the overridden method IFooMethod.testMethodAnyLiteralParentsShortPermission: @android.annotation.EnforcePermission(anyOf={"INTERNET", "READ_PHONE_STATE"}). The same annotation must be used for both methods. [MismatchingEnforcePermissionAnnotation]
+ public void testMethodAnyLiteralParentsShortPermission() {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 errors, 0 warnings
""".addLineContinuation()
@@ -396,27 +464,6 @@
"""
public interface IFooMethod extends android.os.IInterface {
public static abstract class Stub extends android.os.Binder implements IFooMethod {
- @Override
- @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE)
- public void testMethod() {}
- @Override
- @android.annotation.EnforcePermission("READ_PHONE_STATE")
- public void testMethodParentShortPermission() {}
- @Override
- @android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAny() {}
- @Override
- @android.annotation.EnforcePermission(anyOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"})
- public void testMethodAnyLiteral() {}
- @Override
- @android.annotation.EnforcePermission(anyOf={"INTERNET", "READ_PHONE_STATE"})
- public void testMethodAnyLiteralParentsShortPermission() {}
- @Override
- @android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, android.Manifest.permission.READ_PHONE_STATE})
- public void testMethodAll() {}
- @Override
- @android.annotation.EnforcePermission(allOf={android.Manifest.permission.INTERNET, "android.permission.READ_PHONE_STATE"})
- public void testMethodAllLiteral() {}
}
@android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE)
public void testMethod();
@@ -441,8 +488,6 @@
"""
public interface IBar extends android.os.IInterface {
public static abstract class Stub extends android.os.Binder implements IBar {
- @Override
- public void testMethod() {}
}
public void testMethod();
}
diff --git a/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionHelperDetectorCodegenTest.kt b/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionHelperDetectorCodegenTest.kt
index 3ef02f8..a4b0bc3 100644
--- a/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionHelperDetectorCodegenTest.kt
+++ b/tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/EnforcePermissionHelperDetectorCodegenTest.kt
@@ -28,7 +28,8 @@
override fun getDetector(): Detector = EnforcePermissionDetector()
override fun getIssues(): List<Issue> = listOf(
- EnforcePermissionDetector.ISSUE_ENFORCE_PERMISSION_HELPER
+ EnforcePermissionDetector.ISSUE_ENFORCE_PERMISSION_HELPER,
+ EnforcePermissionDetector.ISSUE_MISUSING_ENFORCE_PERMISSION
)
override fun lint(): TestLintTask = super.lint().allowMissingSdk(true)